summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--AndroidManifest.xml50
-rw-r--r--res/drawable/app_gauge.9.pngbin0 -> 253 bytes
-rwxr-xr-xres/drawable/icon.pngbin0 -> 3285 bytes
-rw-r--r--res/drawable/widget_bg.9.pngbin0 -> 777 bytes
-rw-r--r--res/drawable/widget_btn.xml33
-rw-r--r--res/drawable/widget_btn_bluetooth.pngbin0 -> 873 bytes
-rw-r--r--res/drawable/widget_btn_bluetooth_gray.pngbin0 -> 701 bytes
-rw-r--r--res/drawable/widget_btn_bluetooth_off.pngbin0 -> 930 bytes
-rw-r--r--res/drawable/widget_btn_brightness.pngbin0 -> 1650 bytes
-rw-r--r--res/drawable/widget_btn_brightness_off.pngbin0 -> 1630 bytes
-rw-r--r--res/drawable/widget_btn_default.9.pngbin0 -> 3371 bytes
-rw-r--r--res/drawable/widget_btn_gps.pngbin0 -> 696 bytes
-rw-r--r--res/drawable/widget_btn_gps_off.pngbin0 -> 749 bytes
-rw-r--r--res/drawable/widget_btn_pressed.9.pngbin0 -> 3722 bytes
-rw-r--r--res/drawable/widget_btn_selected.9.pngbin0 -> 3690 bytes
-rw-r--r--res/drawable/widget_btn_sync.pngbin0 -> 1335 bytes
-rw-r--r--res/drawable/widget_btn_sync_off.pngbin0 -> 1363 bytes
-rw-r--r--res/drawable/widget_btn_wifi.pngbin0 -> 1218 bytes
-rw-r--r--res/drawable/widget_btn_wifi_gray.pngbin0 -> 871 bytes
-rw-r--r--res/drawable/widget_btn_wifi_off.pngbin0 -> 1379 bytes
-rw-r--r--res/layout/installed_app_details.xml48
-rw-r--r--res/layout/power_usage_detail_item_text.xml43
-rw-r--r--res/layout/power_usage_details.xml90
-rw-r--r--res/layout/preference_powergauge.xml65
-rw-r--r--res/layout/widget.xml76
-rw-r--r--res/layout/wifi_ap_configure.xml103
-rw-r--r--res/values-cs/strings.xml10
-rw-r--r--res/values-de/strings.xml34
-rw-r--r--res/values-es-rUS-nokeys/strings.xml19
-rw-r--r--res/values-es-rUS/arrays.xml76
-rw-r--r--res/values-es-rUS/strings.xml701
-rw-r--r--res/values-es/strings.xml32
-rw-r--r--res/values-fr/strings.xml74
-rw-r--r--res/values-it/strings.xml12
-rw-r--r--res/values-ja/strings.xml18
-rw-r--r--res/values-ko/strings.xml8
-rw-r--r--res/values-nb/strings.xml33
-rw-r--r--res/values-nl/strings.xml22
-rw-r--r--res/values-pl/strings.xml36
-rw-r--r--res/values-ru/strings.xml8
-rw-r--r--res/values-zh-rCN/strings.xml12
-rw-r--r--res/values-zh-rTW/strings.xml8
-rw-r--r--res/values/arrays.xml69
-rw-r--r--res/values/strings.xml191
-rw-r--r--res/xml/accessibility_settings.xml30
-rw-r--r--res/xml/application_settings.xml8
-rw-r--r--res/xml/appwidget_info.xml22
-rw-r--r--res/xml/power_usage_summary.xml20
-rw-r--r--res/xml/settings.xml37
-rw-r--r--res/xml/tts_settings.xml48
-rw-r--r--src/com/android/settings/AccessibilitySettings.java276
-rw-r--r--src/com/android/settings/ApnEditor.java2
-rw-r--r--src/com/android/settings/ApnSettings.java2
-rw-r--r--src/com/android/settings/ApplicationSettings.java8
-rw-r--r--src/com/android/settings/DateTimeSettings.java5
-rw-r--r--src/com/android/settings/IccLockSettings.java (renamed from src/com/android/settings/SimLockSettings.java)103
-rw-r--r--src/com/android/settings/InstalledAppDetails.java283
-rw-r--r--src/com/android/settings/LocalePicker.java51
-rw-r--r--src/com/android/settings/RadioInfo.java54
-rw-r--r--src/com/android/settings/SecuritySettings.java117
-rw-r--r--src/com/android/settings/Settings.java2
-rw-r--r--src/com/android/settings/TextToSpeechSettings.java122
-rw-r--r--src/com/android/settings/battery_history/BatteryHistory.java8
-rw-r--r--src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java10
-rw-r--r--src/com/android/settings/bluetooth/BluetoothEnabler.java5
-rw-r--r--src/com/android/settings/bluetooth/BluetoothEventRedirector.java14
-rw-r--r--src/com/android/settings/bluetooth/LocalBluetoothDevice.java98
-rw-r--r--src/com/android/settings/bluetooth/LocalBluetoothDeviceManager.java30
-rw-r--r--src/com/android/settings/bluetooth/LocalBluetoothManager.java18
-rw-r--r--src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java19
-rw-r--r--src/com/android/settings/deviceinfo/Status.java7
-rw-r--r--src/com/android/settings/fuelgauge/PowerGaugePreference.java119
-rw-r--r--src/com/android/settings/fuelgauge/PowerUsageDetail.java156
-rw-r--r--src/com/android/settings/fuelgauge/PowerUsageSummary.java494
-rw-r--r--src/com/android/settings/widget/SettingsAppWidgetProvider.java404
-rw-r--r--src/com/android/settings/wifi/AccessPointDialog.java320
-rw-r--r--src/com/android/settings/wifi/AccessPointState.java105
-rw-r--r--src/com/android/settings/wifi/Keystore.java81
-rw-r--r--src/com/android/settings/wifi/WifiLayer.java1
79 files changed, 4294 insertions, 656 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 7b3e689..f9758f3 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -240,7 +240,7 @@
</intent-filter>
</activity>
- <activity android:name="SimLockSettings" android:label="@string/sim_lock_settings"
+ <activity android:name="IccLockSettings" android:label="@string/sim_lock_settings"
android:process="com.android.phone">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -249,8 +249,22 @@
</intent-filter>
</activity>
+ <activity android:name="AccessibilitySettings" android:label="@string/accessibility_settings_title"
+ android:theme="@android:style/Theme.NoTitleBar">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <action android:name="ACCESSIBILITY_FEEDBACK_SETTINGS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
-
+ <activity android:name="TextToSpeechSettings" android:label="@string/tts_settings">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <action android:name="com.android.settings.TTS_SETTINGS" />
+ </intent-filter>
+ </activity>
<!-- Second and third-level settings -->
@@ -442,7 +456,7 @@
</activity>
<activity android:name="ProxySelector" android:label="@string/proxy_settings_label"
- android:theme="@android:style/Theme.Dialog">
+ android:theme="@android:style/Theme.Dialog">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEVELOPMENT_PREFERENCE" />
@@ -488,7 +502,7 @@
<!-- Helper to bind any unbound widgets in Launcher, used as
part of initialization and upgrade process -->
<activity android:name="LauncherAppWidgetBinder"
- android:permission="com.android.launcher.permission.WRITE_SETTINGS"
+ android:permission="android.permission.BIND_APPWIDGET"
android:theme="@android:style/Theme.NoDisplay" android:exported="true" />
<activity android:name="UsageStats" android:label="@string/usage_stats_label">
@@ -498,7 +512,31 @@
</intent-filter>
</activity>
- </application>
+ <activity android:name=".fuelgauge.PowerUsageSummary"
+ android:label="@string/power_usage_summary_title">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
-</manifest>
+ <activity android:name=".fuelgauge.PowerUsageDetail"
+ android:label="@string/details_title">
+ <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.intent.action.BLUETOOTH_STATE_CHANGED" />
+ <action android:name="android.intent.action.CLOSE_SYSTEM_DIALOGS" /> <!-- pick up misc changes -->
+ </intent-filter>
+ <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget_info" />
+ </receiver>
+ </application>
+</manifest>
diff --git a/res/drawable/app_gauge.9.png b/res/drawable/app_gauge.9.png
new file mode 100644
index 0000000..4d4db24
--- /dev/null
+++ b/res/drawable/app_gauge.9.png
Binary files differ
diff --git a/res/drawable/icon.png b/res/drawable/icon.png
new file mode 100755
index 0000000..16db056
--- /dev/null
+++ b/res/drawable/icon.png
Binary files differ
diff --git a/res/drawable/widget_bg.9.png b/res/drawable/widget_bg.9.png
new file mode 100644
index 0000000..a2007ad
--- /dev/null
+++ b/res/drawable/widget_bg.9.png
Binary files differ
diff --git a/res/drawable/widget_btn.xml b/res/drawable/widget_btn.xml
new file mode 100644
index 0000000..720bc49
--- /dev/null
+++ b/res/drawable/widget_btn.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:state_window_focused="false" android:state_enabled="true"
+ android:drawable="@drawable/widget_btn_default" />
+
+ <item android:state_pressed="true"
+ android:drawable="@drawable/widget_btn_pressed" />
+
+ <item android:state_focused="true" android:state_enabled="true"
+ android:drawable="@drawable/widget_btn_selected" />
+
+ <item android:state_enabled="true"
+ android:drawable="@drawable/widget_btn_default" />
+
+ <item
+ android:drawable="@drawable/widget_btn_default" />
+</selector>
diff --git a/res/drawable/widget_btn_bluetooth.png b/res/drawable/widget_btn_bluetooth.png
new file mode 100644
index 0000000..5de9d78
--- /dev/null
+++ b/res/drawable/widget_btn_bluetooth.png
Binary files differ
diff --git a/res/drawable/widget_btn_bluetooth_gray.png b/res/drawable/widget_btn_bluetooth_gray.png
new file mode 100644
index 0000000..843dcce
--- /dev/null
+++ b/res/drawable/widget_btn_bluetooth_gray.png
Binary files differ
diff --git a/res/drawable/widget_btn_bluetooth_off.png b/res/drawable/widget_btn_bluetooth_off.png
new file mode 100644
index 0000000..b831a46
--- /dev/null
+++ b/res/drawable/widget_btn_bluetooth_off.png
Binary files differ
diff --git a/res/drawable/widget_btn_brightness.png b/res/drawable/widget_btn_brightness.png
new file mode 100644
index 0000000..a162899
--- /dev/null
+++ b/res/drawable/widget_btn_brightness.png
Binary files differ
diff --git a/res/drawable/widget_btn_brightness_off.png b/res/drawable/widget_btn_brightness_off.png
new file mode 100644
index 0000000..0f42f2d
--- /dev/null
+++ b/res/drawable/widget_btn_brightness_off.png
Binary files differ
diff --git a/res/drawable/widget_btn_default.9.png b/res/drawable/widget_btn_default.9.png
new file mode 100644
index 0000000..febf222
--- /dev/null
+++ b/res/drawable/widget_btn_default.9.png
Binary files differ
diff --git a/res/drawable/widget_btn_gps.png b/res/drawable/widget_btn_gps.png
new file mode 100644
index 0000000..3394cb4
--- /dev/null
+++ b/res/drawable/widget_btn_gps.png
Binary files differ
diff --git a/res/drawable/widget_btn_gps_off.png b/res/drawable/widget_btn_gps_off.png
new file mode 100644
index 0000000..7f481d8
--- /dev/null
+++ b/res/drawable/widget_btn_gps_off.png
Binary files differ
diff --git a/res/drawable/widget_btn_pressed.9.png b/res/drawable/widget_btn_pressed.9.png
new file mode 100644
index 0000000..70a200b
--- /dev/null
+++ b/res/drawable/widget_btn_pressed.9.png
Binary files differ
diff --git a/res/drawable/widget_btn_selected.9.png b/res/drawable/widget_btn_selected.9.png
new file mode 100644
index 0000000..6f2989f
--- /dev/null
+++ b/res/drawable/widget_btn_selected.9.png
Binary files differ
diff --git a/res/drawable/widget_btn_sync.png b/res/drawable/widget_btn_sync.png
new file mode 100644
index 0000000..9682879
--- /dev/null
+++ b/res/drawable/widget_btn_sync.png
Binary files differ
diff --git a/res/drawable/widget_btn_sync_off.png b/res/drawable/widget_btn_sync_off.png
new file mode 100644
index 0000000..0f48a1d
--- /dev/null
+++ b/res/drawable/widget_btn_sync_off.png
Binary files differ
diff --git a/res/drawable/widget_btn_wifi.png b/res/drawable/widget_btn_wifi.png
new file mode 100644
index 0000000..ff7d2ef
--- /dev/null
+++ b/res/drawable/widget_btn_wifi.png
Binary files differ
diff --git a/res/drawable/widget_btn_wifi_gray.png b/res/drawable/widget_btn_wifi_gray.png
new file mode 100644
index 0000000..8a3cc49
--- /dev/null
+++ b/res/drawable/widget_btn_wifi_gray.png
Binary files differ
diff --git a/res/drawable/widget_btn_wifi_off.png b/res/drawable/widget_btn_wifi_off.png
new file mode 100644
index 0000000..8f15b4f
--- /dev/null
+++ b/res/drawable/widget_btn_wifi_off.png
Binary files differ
diff --git a/res/layout/installed_app_details.xml b/res/layout/installed_app_details.xml
index 7c8a672..13d3b10 100644
--- a/res/layout/installed_app_details.xml
+++ b/res/layout/installed_app_details.xml
@@ -28,9 +28,51 @@
android:paddingTop="5dip"
android:paddingBottom="5dip"
android:orientation="vertical">
- <include
- layout="@layout/manage_applications_item"
- android:id="@+id/app_snippet"/>
+
+ <!-- App snippet -->
+ <RelativeLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical">
+
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_alignParentLeft="true"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="6dip"
+ android:paddingBottom="6dip"
+ android:paddingRight="6dip"
+ android:paddingLeft="6dip" >
+ <!-- application name -->
+ <TextView android:id="@+id/app_name"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textStyle="bold"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:layout_marginBottom="2dip" />
+ <!-- application version -->
+ <TextView android:id="@+id/app_version"
+ android:layout_marginTop="-4dip"
+ android:layout_gravity="center_vertical"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceSmall" />
+ </LinearLayout>
+
+ <!-- application icon -->
+ <ImageView android:id="@+id/app_icon"
+ android:layout_width="@android:dimen/app_icon_size"
+ android:layout_height="@android:dimen/app_icon_size"
+ android:layout_alignParentRight="true"
+ android:paddingTop="6dip"
+ android:paddingBottom="6dip"
+ android:paddingRight="6dip"
+ android:scaleType="fitCenter" />
+ </RelativeLayout>
+
<TextView
style="?android:attr/listSeparatorTextViewStyle"
diff --git a/res/layout/power_usage_detail_item_text.xml b/res/layout/power_usage_detail_item_text.xml
new file mode 100644
index 0000000..097469b
--- /dev/null
+++ b/res/layout/power_usage_detail_item_text.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<RelativeLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+ <!--Label for the item-->
+ <TextView
+ android:id="@+id/label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textStyle="bold"
+ android:singleLine="true"
+ android:layout_alignParentLeft="true"
+ android:layout_marginBottom="2dip"
+ android:layout_marginTop="2dip" />
+ <TextView
+ android:id="@+id/value"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentRight="true"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textStyle="normal"
+ android:singleLine="true"
+ android:layout_marginBottom="2dip"
+ android:layout_marginTop="2dip"
+ android:layout_marginRight="4dip"/>
+</RelativeLayout>
diff --git a/res/layout/power_usage_details.xml b/res/layout/power_usage_details.xml
new file mode 100644
index 0000000..dd8d486
--- /dev/null
+++ b/res/layout/power_usage_details.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<ScrollView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+ <LinearLayout
+ android:id="@+id/all_details"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:paddingRight="6dip"
+ android:paddingTop="5dip"
+ android:paddingBottom="5dip"
+ android:orientation="vertical">
+
+ <!-- Details header - icon, label and percentage -->
+ <RelativeLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical">
+
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_alignParentLeft="true"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="6dip"
+ android:paddingBottom="6dip"
+ android:paddingRight="6dip"
+ android:paddingLeft="6dip" >
+ <!-- application name -->
+ <TextView android:id="@+id/name"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textStyle="bold"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:layout_marginBottom="2dip" />
+ <!-- application version -->
+ <TextView android:id="@+id/battery_percentage"
+ android:layout_marginTop="-4dip"
+ android:layout_gravity="center_vertical"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceSmall" />
+ </LinearLayout>
+
+ <!-- application icon -->
+ <ImageView android:id="@+id/icon"
+ android:layout_width="@android:dimen/app_icon_size"
+ android:layout_height="@android:dimen/app_icon_size"
+ android:layout_alignParentRight="true"
+ android:paddingTop="6dip"
+ android:paddingBottom="6dip"
+ android:paddingRight="6dip"
+ android:scaleType="fitCenter" />
+ </RelativeLayout>
+
+
+ <TextView
+ style="?android:attr/listSeparatorTextViewStyle"
+ android:text="@string/details_subtitle" />
+
+ <LinearLayout
+ android:id="@+id/details"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingLeft="6dip"
+ android:orientation="vertical">
+
+ <!-- Insert detail items here -->
+
+ </LinearLayout>
+ </LinearLayout>
+</ScrollView>
diff --git a/res/layout/preference_powergauge.xml b/res/layout/preference_powergauge.xml
new file mode 100644
index 0000000..551659e
--- /dev/null
+++ b/res/layout/preference_powergauge.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:gravity="center_vertical"
+ android:paddingLeft="16dip"
+ android:id="@+android:id/widget_frame"
+ android:paddingRight="?android:attr/scrollbarSize">
+
+ <ImageView
+ android:id="@+id/appIcon"
+ android:layout_width="48dip"
+ android:layout_height="wrap_content"
+ android:layout_marginRight="6dip"
+ android:layout_gravity="center" />
+
+ <RelativeLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginRight="6dip"
+ android:layout_marginTop="6dip"
+ android:layout_marginBottom="6dip"
+ android:layout_weight="1">
+
+ <TextView android:id="@+android:id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:visibility="gone"
+ android:textAppearance="?android:attr/textAppearanceLarge" />
+
+ <ImageView
+ android:id="@+id/appGauge"
+ android:layout_height="wrap_content"
+ android:layout_width="fill_parent"
+ android:layout_marginRight="6dip"
+ android:layout_gravity="center_vertical" />
+
+ <TextView android:id="@+android:id/summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/appGauge"
+ android:layout_alignLeft="@id/appGauge"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:maxLines="2" />
+
+ </RelativeLayout>
+
+</LinearLayout>
diff --git a/res/layout/widget.xml b/res/layout/widget.xml
new file mode 100644
index 0000000..63ce5a5
--- /dev/null
+++ b/res/layout/widget.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/main"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:paddingLeft="12dip"
+ android:paddingRight="12dip"
+ android:paddingTop="7dip"
+ android:paddingBottom="13dip"
+ android:background="@drawable/widget_bg" >
+
+ <ImageButton
+ android:id="@+id/btn_wifi"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:layout_marginLeft="8dip"
+ android:background="@drawable/widget_btn"
+ android:layout_gravity="center_horizontal"
+ />
+
+ <ImageButton
+ android:id="@+id/btn_brightness"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:layout_marginLeft="8dip"
+ android:background="@drawable/widget_btn"
+ android:layout_gravity="center_horizontal"
+
+ />
+
+ <ImageButton
+ android:id="@+id/btn_sync"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:layout_marginLeft="8dip"
+ android:background="@drawable/widget_btn"
+ android:layout_gravity="center_horizontal"
+
+ />
+
+ <ImageButton
+ android:id="@+id/btn_gps"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:layout_marginLeft="8dip"
+ android:background="@drawable/widget_btn"
+ android:layout_gravity="center_horizontal"
+
+ />
+
+ <ImageButton
+ android:id="@+id/btn_bluetooth"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:layout_marginLeft="8dip"
+ android:background="@drawable/widget_btn"
+ android:layout_gravity="center_horizontal"
+
+ />
+ </LinearLayout>
diff --git a/res/layout/wifi_ap_configure.xml b/res/layout/wifi_ap_configure.xml
index d786cff..ecd6337 100644
--- a/res/layout/wifi_ap_configure.xml
+++ b/res/layout/wifi_ap_configure.xml
@@ -24,11 +24,17 @@
android:padding="8dip"
android:orientation="vertical">
-
+ <LinearLayout
+ android:id="@+id/table"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="vertical">
+ </LinearLayout>
+
<!-- SSID -->
- <TextView
+ <TextView android:id="@+id/ssid_text"
style="?android:attr/textAppearanceSmallInverse"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
@@ -44,7 +50,7 @@
<!-- Security -->
- <TextView
+ <TextView android:id="@+id/security_text"
style="?android:attr/textAppearanceSmallInverse"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
@@ -55,9 +61,94 @@
<Spinner android:id="@+id/security_spinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
-
-
-
+
+ <!-- Enterprise Fields -->
+ <LinearLayout android:id="@+id/enterprise_wrapper"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:padding="8dip"
+ android:orientation="vertical">
+ <TextView android:id="@+id/eap_text"
+ style="?android:attr/textAppearanceSmallInverse"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dip"
+ android:text="@string/please_select_eap" />
+ <Spinner android:id="@+id/eap_spinner"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" />
+ <TextView android:id="@+id/phase2_text"
+ style="?android:attr/textAppearanceSmallInverse"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dip"
+ android:text="@string/please_select_phase2" />
+ <Spinner android:id="@+id/phase2_spinner"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" />
+
+ <TextView android:id="@+id/identity_text"
+ style="?android:attr/textAppearanceSmallInverse"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dip"
+ android:text="@string/please_type_identity" />
+ <EditText android:id="@+id/identity_edit"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="2dip"
+ android:singleLine="true" />
+ <TextView android:id="@+id/anonymous_identity_text"
+ style="?android:attr/textAppearanceSmallInverse"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dip"
+ android:text="@string/please_type_anonymous_identity" />
+ <EditText android:id="@+id/anonymous_identity_edit"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="2dip"
+ android:singleLine="true" />
+ <TextView android:id="@+id/client_certificate_text"
+ style="?android:attr/textAppearanceSmallInverse"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dip"
+ android:text="@string/please_select_client_certificate" />
+ <Spinner android:id="@+id/client_certificate_spinner"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" />
+ <TextView android:id="@+id/ca_certificate_text"
+ style="?android:attr/textAppearanceSmallInverse"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dip"
+ android:text="@string/please_select_ca_certificate" />
+ <Spinner android:id="@+id/ca_certificate_spinner"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" />
+ <TextView android:id="@+id/private_key_text"
+ style="?android:attr/textAppearanceSmallInverse"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dip"
+ android:text="@string/please_select_private_key" />
+ <Spinner android:id="@+id/private_key_spinner"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" />
+ <TextView android:id="@+id/private_key_passwd_text"
+ style="?android:attr/textAppearanceSmallInverse"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dip"
+ android:text="@string/please_type_private_key_passwd" />
+ <EditText android:id="@+id/private_key_passwd_edit"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="2dip"
+ android:singleLine="true" />
+ </LinearLayout>
+
<!-- Password -->
<TextView android:id="@+id/password_text"
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 943dc50..5507d59 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -107,10 +107,6 @@
<string name="date_and_time">"Nastavení data a času"</string>
<string name="date_time_12_hour_sample">"13:00"</string>
<string name="date_time_24_hour_sample">"13:00"</string>
- <!-- no translation found for date_time_changeTime_text (7037437020000867740) -->
- <skip />
- <!-- no translation found for date_time_changeDate_text (5259762626498028057) -->
- <skip />
<string name="choose_timezone">"Volba časového pásma"</string>
<string name="display_preview_label">"Náhled:"</string>
<string name="display_font_size_label">"Velikost písma:"</string>
@@ -491,13 +487,9 @@
<string name="location_network_based">"Zaměření přes bezdrátové sítě"</string>
<string name="location_networks_disabled">"Zobrazuje polohu v aplikacích (jako Mapy) pomocí bezdrátových sítí"</string>
<string name="location_neighborhood_level">"Poloha je zaměřena pomocí WiFi nebo mobilních sítí"</string>
- <string name="location_gps">"Zapnout GPS"</string>
+ <string name="location_gps">"Zapnout přijímač systému GPS"</string>
<string name="location_street_level">"Zaměření je s přesností na úrovni ulic (zrušením této volby lze šetřit baterii)"</string>
<string name="location_gps_disabled">"Umožňuje zaměřit na úrovni ulic (vetší spotřeba baterie a nutný výhled na oblohu)"</string>
- <string name="location_warning_title">"Svolení se sběrem dat o poloze"</string>
- <string name="location_warning_message">"Povolit službě určování polohy společnosti Google sběr anonymních a sdružených dat o poloze. Data budou sbírána bez ohledu na to, zda je nějaká aplikace aktivní."</string>
- <string name="agree">"Souhlasím"</string>
- <string name="disagree">"Nesouhlasím"</string>
<string name="about_settings">"Info o telefonu"</string>
<string name="about_settings_summary">"Zobrazuje právní informace, stav telefonu a verzi softwaru"</string>
<string name="legal_information">"Právní informace"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index df63656..a936059 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -16,12 +16,12 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="device_info_default">"Unbekannt"</string>
- <string name="turn_on_radio">"Mobilfunkverbindung aktivieren"</string>
- <string name="turn_off_radio">"Mobilfunkverbindung deaktivieren"</string>
+ <string name="turn_on_radio">"Radio einschalten"</string>
+ <string name="turn_off_radio">"Radio ausschalten"</string>
<string name="turn_on_qxdm">"QXDM-SD-Protokoll aktivieren"</string>
<string name="turn_off_qxdm">"QXDM-SD-Protokoll deaktivieren"</string>
<string name="radioInfo_menu_viewADN">"SIM-Adressbuch anzeigen"</string>
- <string name="radioInfo_menu_viewFDN">"Begrenzte Rufnummern anzeigen"</string>
+ <string name="radioInfo_menu_viewFDN">"Feste Rufnummern anzeigen"</string>
<string name="radioInfo_menu_viewSDN">"Servicerufnummern anzeigen"</string>
<string name="radioInfo_menu_getPDP">"PDP-Liste abrufen"</string>
<string name="radioInfo_menu_enableData">"Datenverbindung aktivieren"</string>
@@ -31,7 +31,7 @@
<string name="radioInfo_service_in">"In Betrieb"</string>
<string name="radioInfo_service_out">"Außer Betrieb"</string>
<string name="radioInfo_service_emergency">"Nur Notrufe"</string>
- <string name="radioInfo_service_off">"Mobilfunkverbindung aus"</string>
+ <string name="radioInfo_service_off">"Radio aus"</string>
<string name="radioInfo_roaming_in">"Roaming"</string>
<string name="radioInfo_roaming_not">"Kein Roaming"</string>
<string name="radioInfo_phone_idle">"Inaktiv"</string>
@@ -82,7 +82,7 @@
<string name="battery_info_health_over_voltage">"Überspannung"</string>
<string name="battery_info_health_unspecified_failure">"Unbekannter Fehler"</string>
<string name="bluetooth">"Bluetooth"</string>
- <string name="bluetooth_visibility">"Sichtbar"</string>
+ <string name="bluetooth_visibility">"Erkennbar"</string>
<string name="bluetooth_is_discoverable">"Für <xliff:g id="DISCOVERABLE_TIME_PERIOD">%1$s</xliff:g> Sekunden sichtbar..."</string>
<string name="bluetooth_not_discoverable">"Geräteerkennung deaktivieren"</string>
<string name="bluetooth_devices">"Bluetooth-Geräte"</string>
@@ -107,8 +107,6 @@
<string name="date_and_time">"Einstellungen"</string>
<string name="date_time_12_hour_sample">"1:00"</string>
<string name="date_time_24_hour_sample">"13:00"</string>
- <string name="date_time_changeTime_text">"Zeit einstellen"</string>
- <string name="date_time_changeDate_text">"Datum"</string>
<string name="choose_timezone">"Zeitzone auswählen"</string>
<string name="display_preview_label">"Vorschau:"</string>
<string name="display_font_size_label">"Schriftgröße:"</string>
@@ -146,7 +144,7 @@
<string name="radio_info_signal_strength_label">"Signalstärke:"</string>
<string name="radio_info_call_status_label">"Rufstatus:"</string>
<string name="radio_info_ppp_sent_label">"PPP gesendet:"</string>
- <string name="radio_info_radio_resets_label">"Verbindungszurücksetzung"</string>
+ <string name="radio_info_radio_resets_label">"Radiozurücksetzung:"</string>
<string name="radio_info_message_waiting_label">"Nachricht liegt vor:"</string>
<string name="radio_info_phone_number_label">"Telefonnummer:"</string>
<string name="radio_info_band_mode_label">"Frequenzbereich auswählen"</string>
@@ -246,7 +244,7 @@
<string name="bluetooth_headset_profile_summary_use_for">"Für Audiosystem des Telefons verwenden"</string>
<string name="wifi">"WLAN"</string>
<string name="wifi_quick_toggle_title">"WLAN"</string>
- <string name="wifi_quick_toggle_summary">"WLAN aktivieren"</string>
+ <string name="wifi_quick_toggle_summary">"Wi-Fi aktivieren"</string>
<string name="wifi_settings">"WLAN-Einstellungen"</string>
<string name="wifi_settings_category">"WLAN-Einstellungen"</string>
<string name="wifi_settings_summary">"Wireless-Zugangspunkte festlegen und verwalten"</string>
@@ -291,7 +289,7 @@
<string name="wifi_security">"Sicherheit"</string>
<string name="wifi_save_config">"Speichern"</string>
<string name="wifi_password_unchanged">"(nicht geändert)"</string>
- <string name="wifi_add_other_network">"WLAN-Netzwerk hinzufügen"</string>
+ <string name="wifi_add_other_network">"Wi-Fi-Netzwerk hinzufügen"</string>
<string name="wifi_notify_open_networks">"Netzwerkhinweis"</string>
<string name="wifi_notify_open_networks_summary">"Benachrichtigen, wenn ein offenes Netzwerk verfügbar ist"</string>
<string name="wifi_password_incorrect_error">"Das eingegebene Netzwerkpasswort ist falsch. Bitte versuchen Sie es erneut."</string>
@@ -315,8 +313,8 @@
<string name="wifi_setting_num_channels_summary">"Anzahl an zu verwendenden Kanälen festlegen"</string>
<string name="wifi_setting_num_channels_error">"Beim Einrichten der Domain ist ein Problem aufgetreten."</string>
<string name="wifi_setting_num_channels_channel_phrase">"<xliff:g id="NUM_CHANNELS">%1$d</xliff:g> Kanäle"</string>
- <string name="wifi_setting_sleep_policy_title">"WLAN Standby-Richtlinie"</string>
- <string name="wifi_setting_sleep_policy_summary">"Festlegen, wann von WLAN auf mobile Daten umgeschaltet werden soll"</string>
+ <string name="wifi_setting_sleep_policy_title">"Wi-Fi Standby-Richtlinie"</string>
+ <string name="wifi_setting_sleep_policy_summary">"Festlegen, wann von Wi-Fi auf mobile Daten umgeschaltet werden soll"</string>
<string name="wifi_setting_sleep_policy_error">"Beim Einrichten der Standby-Richtlinie ist ein Problem aufgetreten."</string>
<string name="wifi_advanced_mac_address_title">"MAC-Adresse"</string>
<string name="fragment_status_scanning">"Scannen…"</string>
@@ -335,7 +333,7 @@
<string name="status_disconnecting">"Verbindung wird getrennt..."</string>
<string name="status_disconnected">"Nicht verbunden"</string>
<string name="status_failed">"Fehlgeschlagen"</string>
- <string name="sound_and_display_settings">"Sound und Display"</string>
+ <string name="sound_and_display_settings">"Töne und Display"</string>
<string name="sound_settings">"Toneinstellungen"</string>
<string name="sound_and_display_settings_summary">"Klingeltöne, Benachrichtigungen und Helligkeit festlegen"</string>
<string name="silent_mode_title">"Lautlosmodus"</string>
@@ -403,7 +401,7 @@
<string name="system_update_settings_list_item_summary">"Nach Systemaktualisierungen suchen"</string>
<string name="firmware_version">"Firmware-Version"</string>
<string name="model_number">"Modellnummer"</string>
- <string name="baseband_version">"Baseband-Version"</string>
+ <string name="baseband_version">"Basisband-Version"</string>
<string name="kernel_version">"Kernel-Version"</string>
<string name="build_number">"Build-Nummer"</string>
<string name="device_info_not_available">"Nicht verfügbar"</string>
@@ -414,7 +412,7 @@
<string name="storage_settings_summary">"SD-Karte entnehmen, verfügbaren Speicher anzeigen"</string>
<string name="status_number">"Telefonnummer"</string>
<string name="status_network_type">"Mobiler Netzwerktyp"</string>
- <string name="status_data_state">"Mobiler Netzwerkstatus"</string>
+ <string name="status_data_state">"Status des mobilen Netzwerks"</string>
<string name="status_service_state">"Servicestatus"</string>
<string name="status_signal_strength">"Signalstärke"</string>
<string name="status_roaming">"Roaming"</string>
@@ -482,7 +480,7 @@
<string name="media_format_gesture_prompt">"Bitte zeichnen Sie Ihr Entsperrungsmuster."</string>
<string name="media_format_gesture_explanation">"Sie müssen Ihr Entsperrungsmuster eingeben, um eine SD-Karten-Formatierung zu bestätigen."</string>
<string name="call_settings_title">"Anrufeinstellungen"</string>
- <string name="call_settings_summary">"Mailbox, Rufweiterleitung, Anklopfen, Anruferkennung einrichten"</string>
+ <string name="call_settings_summary">"Mailbox, Anrufweiterleitung, Anklopfen, Anruferkennung einrichten"</string>
<string name="network_settings_title">"Mobile Netzwerke"</string>
<string name="network_settings_summary">"Optionen für Roaming, Netzwerke, APNs festlegen"</string>
<string name="location_title">"Standortquellen"</string>
@@ -492,10 +490,6 @@
<string name="location_gps">"GPS-Satelliten aktivieren"</string>
<string name="location_street_level">"Auf Straßenebene lokalisieren (deaktivieren, um Akku zu sparen)"</string>
<string name="location_gps_disabled">"Auf Straßenebene lokalisieren (höherer Akkuverbrauch, im Freien)"</string>
- <string name="location_warning_title">"Standortgenehmigung"</string>
- <string name="location_warning_message">"Erlauben Sie dem Google-Standortservice, anonyme und aggregierte Standortdaten zu erfassen. Die Erfassung wird unabhängig davon durchgeführt, ob Anwendungen aktiv sind oder nicht."</string>
- <string name="agree">"Zustimmen"</string>
- <string name="disagree">"Ablehnen"</string>
<string name="about_settings">"Telefoninfo"</string>
<string name="about_settings_summary">"Rechtliche Hinweise, Telefonstatus und Softwareversion anzeigen"</string>
<string name="legal_information">"Rechtliche Hinweise"</string>
diff --git a/res/values-es-rUS-nokeys/strings.xml b/res/values-es-rUS-nokeys/strings.xml
new file mode 100644
index 0000000..0a6a749
--- /dev/null
+++ b/res/values-es-rUS-nokeys/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="applications_settings_summary">"Administrar aplicaciones"</string>
+</resources>
diff --git a/res/values-es-rUS/arrays.xml b/res/values-es-rUS/arrays.xml
new file mode 100644
index 0000000..b368143
--- /dev/null
+++ b/res/values-es-rUS/arrays.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string-array name="timezone_filters">
+ <item>"América"</item>
+ <item>"Europa"</item>
+ <item>"África"</item>
+ <item>"Asia"</item>
+ <item>"Australia"</item>
+ <item>"Pacífico"</item>
+ <item>"Todos"</item>
+ </string-array>
+ <string-array name="screen_timeout_entries">
+ <item>"15 segundos"</item>
+ <item>"30 segundos"</item>
+ <item>"1 minuto"</item>
+ <item>"2 minutos"</item>
+ <item>"10 minutos"</item>
+ <item>"Nunca se debe agotar el tiempo de espera"</item>
+ </string-array>
+ <string-array name="wifi_security_entries">
+ <item>"Automáticamente"</item>
+ <item>"Ninguno"</item>
+ <item>"WEP"</item>
+ <item>"WPA Personal"</item>
+ <item>"WPA2 Personal"</item>
+ </string-array>
+ <string-array name="wifi_security_without_auto_entries">
+ <item>"Ninguno"</item>
+ <item>"WEP"</item>
+ <item>"WPA Personal"</item>
+ <item>"WPA2 Personal"</item>
+ </string-array>
+ <string-array name="wifi_wep_type">
+ <item>"Automáticamente"</item>
+ <item>"WEP ASCII"</item>
+ <item>"WEP hexadecimal"</item>
+ </string-array>
+ <string-array name="wifi_sleep_policy_entries">
+ <item>"Cuando se apaga la pantalla"</item>
+ <item>"Nunca cuando está conectado"</item>
+ <item>"Nunca"</item>
+ </string-array>
+ <string-array name="battery_history_type_spinner">
+ <item>"Uso de CPU"</item>
+ <item>"Uso de red"</item>
+ <item>"Uso de GPS"</item>
+ <item>"Uso del sensor"</item>
+ <item>"Uso de despertador parcial"</item>
+ <item>"Otro uso"</item>
+ </string-array>
+ <string-array name="battery_history_which_spinner">
+ <item>"Desde la última vez que se desconectó"</item>
+ <item>"Total desde el reinicio"</item>
+ <item>"Total en todo el tiempo"</item>
+ </string-array>
+ <string-array name="usage_stats_display_order_types">
+ <item>"Hora de uso"</item>
+ <item>"Lanzar recuento"</item>
+ <item>"Nombre de la aplicación"</item>
+ </string-array>
+</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..9aa86af
--- /dev/null
+++ b/res/values-es-rUS/strings.xml
@@ -0,0 +1,701 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="device_info_default">"Desconocido"</string>
+ <string name="turn_on_radio">"Encender la radio"</string>
+ <string name="turn_off_radio">"Apagar la radio"</string>
+ <string name="turn_on_qxdm">"Activar el registro SD de QXDM"</string>
+ <string name="turn_off_qxdm">"Desactivar el registro SD de QXDM"</string>
+ <string name="radioInfo_menu_viewADN">"Ver libreta de direcciones de SIM"</string>
+ <string name="radioInfo_menu_viewFDN">"Ver números fijos"</string>
+ <string name="radioInfo_menu_viewSDN">"Ver números del servicio técnico"</string>
+ <string name="radioInfo_menu_getPDP">"Obtener lista PDP"</string>
+ <string name="radioInfo_menu_enableData">"Activar la conexión de datos"</string>
+ <string name="radioInfo_menu_disableData">"Desactivar conexión de datos"</string>
+ <string name="radioInfo_menu_enableDataOnBoot">"Activar datos durante el reinicio"</string>
+ <string name="radioInfo_menu_disableDataOnBoot">"Desactivar datos durante el reinicio"</string>
+ <string name="radioInfo_service_in">"En servicio"</string>
+ <string name="radioInfo_service_out">"Fuera de servicio"</string>
+ <string name="radioInfo_service_emergency">"Sólo llamadas de emergencia"</string>
+ <string name="radioInfo_service_off">"Radio apagada"</string>
+ <string name="radioInfo_roaming_in">"Roaming"</string>
+ <string name="radioInfo_roaming_not">"No hay roaming"</string>
+ <string name="radioInfo_phone_idle">"Inactivo"</string>
+ <string name="radioInfo_phone_ringing">"Timbrando"</string>
+ <string name="radioInfo_phone_offhook">"Llamada en curso"</string>
+ <string name="radioInfo_data_disconnected">"Desconectado"</string>
+ <string name="radioInfo_data_connecting">"Conectando"</string>
+ <string name="radioInfo_data_connected">"Conectado"</string>
+ <string name="radioInfo_data_suspended">"Suspendido"</string>
+ <string name="radioInfo_unknown">"desconocida"</string>
+ <string name="radioInfo_display_packets">"paquetes"</string>
+ <string name="radioInfo_display_bytes">"bytes"</string>
+ <string name="radioInfo_display_dbm">"dBm"</string>
+ <string name="radioInfo_display_asu">"asu"</string>
+ <string name="radioInfo_lac">"LAC"</string>
+ <string name="radioInfo_cid">"CID"</string>
+ <string name="sdcard_unmount">"Desmontar la tarjeta SD"</string>
+ <string name="sdcard_format">"Formatear tarjeta SD"</string>
+ <string name="small_font">"Pequeño"</string>
+ <string name="medium_font">"Mediano"</string>
+ <string name="large_font">"Grande"</string>
+ <string name="font_size_save">"Aceptar"</string>
+ <string name="sdcard_setting">"Tarjeta SD"</string>
+ <string name="battery_info_status_label">"Estado de batería:"</string>
+ <string name="battery_info_scale_label">"Escala de batería:"</string>
+ <string name="battery_info_level_label">"Nivel de la batería:"</string>
+ <string name="battery_info_health_label">"Estado de la batería:"</string>
+ <string name="battery_info_technology_label">"Tecnología de la batería:"</string>
+ <string name="battery_info_voltage_label">"Voltaje de la batería:"</string>
+ <string name="battery_info_voltage_units">"mV"</string>
+ <string name="battery_info_temperature_label">"Temperatura de la batería:"</string>
+ <string name="battery_info_temperature_units">"° C"</string>
+ <string name="battery_info_uptime">"Tiempo desde el reinicio:"</string>
+ <string name="battery_info_awake_battery">"Hora de actividad en la batería:"</string>
+ <string name="battery_info_awake_plugged">"Hora de actividad durante la carga:"</string>
+ <string name="battery_info_screen_on">"Hora de Encendido de la pantalla:"</string>
+ <string name="battery_info_status_unknown">"Desconocido"</string>
+ <string name="battery_info_status_charging">"Cargando"</string>
+ <string name="battery_info_status_charging_ac">"(AC)"</string>
+ <string name="battery_info_status_charging_usb">"(USB)"</string>
+ <string name="battery_info_status_discharging">"Descargando"</string>
+ <string name="battery_info_status_not_charging">"No se realiza la carga"</string>
+ <string name="battery_info_status_full">"Total"</string>
+ <string name="battery_info_health_unknown">"Desconocido"</string>
+ <string name="battery_info_health_good">"Bueno"</string>
+ <string name="battery_info_health_overheat">"Recalentar"</string>
+ <string name="battery_info_health_dead">"Muerto"</string>
+ <string name="battery_info_health_over_voltage">"Voltaje excesivo"</string>
+ <string name="battery_info_health_unspecified_failure">"Error desconocido"</string>
+ <string name="bluetooth">"Bluetooth"</string>
+ <string name="bluetooth_visibility">"Visible"</string>
+ <string name="bluetooth_is_discoverable">"Visible durante <xliff:g id="DISCOVERABLE_TIME_PERIOD">%1$s</xliff:g> segundos…"</string>
+ <string name="bluetooth_not_discoverable">"Hacer que el dispositivo sea visible"</string>
+ <string name="bluetooth_devices">"Dispositivos de Bluetooth"</string>
+ <string name="bluetooth_device_name">"Nombre del dispositivo"</string>
+ <string name="bluetooth_name_not_set">"No hay nombre establecido, se utiliza el nombre de cuenta"</string>
+ <string name="bluetooth_scan_for_devices">"Explorar dispositivos"</string>
+ <string name="bluetooth_disconnect_blank">"Se desconectará <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+ <string name="bluetooth_connected">"Conectado"</string>
+ <string name="bluetooth_disconnected">"Desconectado"</string>
+ <string name="bluetooth_disconnecting">"Desconectando…"</string>
+ <string name="bluetooth_connecting">"Conectando…"</string>
+ <!-- no translation found for bluetooth_unknown (644716244548801421) -->
+ <skip />
+ <string name="bluetooth_not_connected">"Vincular con este dispositivo"</string>
+ <string name="bluetooth_pairing">"Vinculando..."</string>
+ <string name="bluetooth_paired">"Vinculado pero no conectado"</string>
+ <string name="bluetooth_device">"manos libres/auriculares"</string>
+ <string name="progress_scanning">"Explorando"</string>
+ <string name="bluetooth_notif_ticker">"Solicitud de vinculación de Bluetooth"</string>
+ <string name="bluetooth_notif_title">"Vinculando solicitud"</string>
+ <string name="bluetooth_notif_message">"Seleccionar para vincularse con "</string>
+ <string name="date_and_time">"Configuración de fecha y hora"</string>
+ <string name="date_time_12_hour_sample">"1:00 p.m."</string>
+ <string name="date_time_24_hour_sample">"13:00"</string>
+ <string name="choose_timezone">"Seleccionar zona horaria"</string>
+ <string name="display_preview_label">"Vista previa:"</string>
+ <string name="display_font_size_label">"Tamaño de fuente:"</string>
+ <!-- no translation found for intent_sender_data_label (6332324780477289261) -->
+ <skip />
+ <string name="intent_sender_sendbroadcast_text">"Enviar <xliff:g id="BROADCAST">broadcast</xliff:g>"</string>
+ <string name="intent_sender_action_label">"<xliff:g id="ACTION">Action</xliff:g>:"</string>
+ <string name="intent_sender_startactivity_text">"Inicio <xliff:g id="ACTIVITY">activity</xliff:g>"</string>
+ <string name="intent_sender_resource_label">"<xliff:g id="RESOURCE">Resource</xliff:g>:"</string>
+ <string name="intent_sender_account_label">"Cuenta:"</string>
+ <string name="proxy_clear_text">"Borrar"</string>
+ <string name="proxy_port_label">"Puerto"</string>
+ <string name="proxy_defaultView_text">"Restaurar configuraciones predeterminadas"</string>
+ <string name="proxy_action_text">"Guardar"</string>
+ <string name="proxy_hostname_label">"Nombre del servidor"</string>
+ <string name="proxy_error">"Atención"</string>
+ <string name="proxy_error_dismiss">"Aceptar"</string>
+ <string name="proxy_error_invalid_host">"El nombre del servidor que has escrito no es válido."</string>
+ <string name="proxy_error_empty_port">"Debes completar el campo de puerto."</string>
+ <string name="proxy_error_empty_host_set_port">"El campo del puerto debe estar vacío si el campo de servidor está vacío."</string>
+ <string name="proxy_error_invalid_port">"El puerto que has escrito no es válido."</string>
+ <string name="radio_info_signal_location_label">"Ubicación:"</string>
+ <string name="radio_info_neighboring_location_label">"CID cercano:"</string>
+ <string name="radio_info_data_attempts_label">"Intentos de datos:"</string>
+ <string name="radio_info_gprs_service_label">"Servicio GPRS:"</string>
+ <string name="radio_info_roaming_label">"Roaming:"</string>
+ <string name="radio_info_imei_label">"IMEI:"</string>
+ <string name="radio_info_call_redirect_label">"Redireccionamiento de llamada:"</string>
+ <string name="radio_info_ppp_resets_label">"Cantidad de PPP restablecidos desde el reinicio:"</string>
+ <string name="radio_info_gsm_disconnects_label">"Desconexiones de GSM:"</string>
+ <string name="radio_info_current_network_label">"Red actual:"</string>
+ <string name="radio_info_data_successes_label">"Datos correctos:"</string>
+ <string name="radio_info_ppp_received_label">"PPP recibido:"</string>
+ <string name="radio_info_gsm_service_label">"Servicio GSM:"</string>
+ <string name="radio_info_signal_strength_label">"Potencia de la señal:"</string>
+ <string name="radio_info_call_status_label">"Estado de llamada:"</string>
+ <string name="radio_info_ppp_sent_label">"PPP enviado:"</string>
+ <string name="radio_info_radio_resets_label">"Restablecimiento de la radio:"</string>
+ <string name="radio_info_message_waiting_label">"Mensaje en espera:"</string>
+ <string name="radio_info_phone_number_label">"Número de teléfono"</string>
+ <string name="radio_info_band_mode_label">"Seleccionar banda de radio"</string>
+ <string name="radio_info_network_type_label">"Tipo de red:"</string>
+ <string name="radio_info_set_perferred_label">"Establecer el tipo de red preferida:"</string>
+ <string name="radio_info_ping_ipaddr">"Buscar direcciones de Internet de IpAddr:"</string>
+ <string name="radio_info_ping_hostname">"Buscar direcciones de Internet del nombre del servidor (www.google.com):"</string>
+ <string name="radio_info_http_client_test">"Prueba de cliente HTTP:"</string>
+ <string name="radio_info_toggle_ciph_label">"Cambiar el cifrado"</string>
+ <string name="ping_test_label">"Ejecutar la prueba de búsqueda de direcciones de Internet"</string>
+ <string name="radio_info_smsc_label">"SMSC:"</string>
+ <string name="radio_info_smsc_update_label">"Actualizar"</string>
+ <string name="radio_info_smsc_refresh_label">"Actualizar"</string>
+ <string name="radio_info_toggle_dns_check_label">"Cambiar la verificación de DNS"</string>
+ <string name="band_mode_title">"Establecer banda GSM y UMTS"</string>
+ <string name="band_mode_loading">"Cargando lista de banda..."</string>
+ <string name="band_mode_set">"Establecer"</string>
+ <string name="band_mode_failed">"Incorrecto"</string>
+ <string name="band_mode_succeeded">"Correcto"</string>
+ <string name="sdcard_changes_instructions">"Los cambios se aplican cuando se vuelve a conectar el cable USB"</string>
+ <string name="sdcard_settings_screen_mass_storage_text">"Activar el espacio de almacenamiento masivo USB"</string>
+ <string name="sdcard_settings_total_bytes_label">"Total de bytes:"</string>
+ <string name="sdcard_settings_not_present_status">"No hay tarjeta SD"</string>
+ <string name="sdcard_settings_available_bytes_label">"Bytes disponibles:"</string>
+ <string name="sdcard_settings_mass_storage_status">"La tarjeta SD se utiliza como dispositivo de almacenamiento masivo"</string>
+ <string name="sdcard_settings_unmounted_status">"Ahora es seguro extraer la tarjeta SD"</string>
+ <string name="sdcard_settings_bad_removal_status">"¡Se ha extraído la tarjeta SD mientras se encontraba en uso!"</string>
+ <string name="sdcard_settings_used_bytes_label">"Bytes utilizados:"</string>
+ <string name="sdcard_settings_scanning_status">"Explorando medios en la tarjeta SD..."</string>
+ <string name="sdcard_settings_read_only_status">"Tarjeta SD montada para sólo lectura"</string>
+ <string name="next_label">"Siguiente"</string>
+ <string name="language_picker_title">"País"</string>
+ <string name="select_your_language">"Selecciona tu idioma"</string>
+ <string name="activity_picker_label">"Seleccionar actividad"</string>
+ <string name="device_info_label">"Información de dispositivo"</string>
+ <string name="battery_info_label">"Información de la batería"</string>
+ <string name="battery_history_label">"Historial de batería"</string>
+ <string name="display_label">"Mostrar"</string>
+ <string name="phone_info_label">"Información del teléfono"</string>
+ <string name="sd_card_settings_label">"Tarjeta SD"</string>
+ <string name="proxy_settings_label">"Configuración de proxy"</string>
+ <string name="cancel">"Cancelar"</string>
+ <string name="settings_label">"Configuración"</string>
+ <string name="airplane_mode">"Modo avión"</string>
+ <string name="airplane_mode_summary">"Desactivar todas las conexiones inalámbricas"</string>
+ <string name="airplane_mode_turning_on">"Desactivando conexiones inalámbricas…"</string>
+ <string name="airplane_mode_turning_off">"Activando conexiones inalámbricas…"</string>
+ <string name="radio_controls_title">"Controles de teléfono inalámbrico"</string>
+ <string name="radio_controls_summary">"Administrar Wi-Fi, Bluetooth, modo avión y redes de celulares"</string>
+ <!-- no translation found for roaming (3596055926335478572) -->
+ <skip />
+ <!-- no translation found for roaming_enable (3737380951525303961) -->
+ <skip />
+ <!-- no translation found for roaming_disable (1295279574370898378) -->
+ <skip />
+ <!-- no translation found for roaming_reenable_message (9141007271031717369) -->
+ <skip />
+ <!-- no translation found for roaming_turn_it_on_button (4387601818162120589) -->
+ <skip />
+ <!-- no translation found for roaming_warning (1269870211689178511) -->
+ <skip />
+ <!-- no translation found for roaming_reenable_title (7626425894611573131) -->
+ <skip />
+ <!-- no translation found for networks (6333316876545927039) -->
+ <skip />
+ <!-- no translation found for sum_carrier_select (6648929373316748020) -->
+ <skip />
+ <string name="date_and_time_settings_title">"Fecha y hora"</string>
+ <string name="date_and_time_settings_summary">"Establecer fecha, hora, zona horaria y formatos"</string>
+ <string name="date_time_auto">"Automático"</string>
+ <string name="date_time_auto_summaryOn">"Utilizar valores proporcionados por la red"</string>
+ <string name="date_time_auto_summaryOff">"Utilizar valores proporcionados por la red"</string>
+ <string name="date_time_24hour">"Utilizar el formato de 24 horas"</string>
+ <string name="date_time_set_time">"Establecer la hora"</string>
+ <string name="date_time_set_timezone">"Seleccionar zona horaria"</string>
+ <string name="date_time_set_date">"Establecer fecha"</string>
+ <string name="date_time_date_format">"Seleccionar el formato de fecha"</string>
+ <string name="zone_list_menu_sort_alphabetically">"Ordenar alfabéticamente"</string>
+ <string name="zone_list_menu_sort_by_timezone">"Ordenar por zona horaria"</string>
+ <string name="security_settings_title">"Seguridad y ubicación"</string>
+ <string name="security_settings_summary">"Establecer Mi ubicación, desbloqueo de pantalla, bloqueo de tarjeta SIM"</string>
+ <string name="security_passwords_title">"Contraseñas"</string>
+ <string name="bluetooth_quick_toggle_title">"Bluetooth"</string>
+ <string name="bluetooth_quick_toggle_summary">"Activar Bluetooth"</string>
+ <string name="bluetooth_settings">"Configuración de Bluetooth"</string>
+ <string name="bluetooth_settings_title">"Configuración de Bluetooth"</string>
+ <string name="bluetooth_settings_summary">"Administrar conexiones, establecer nombre y detección del dispositivo"</string>
+ <string name="bluetooth_pin_entry">"Solicitud de vinculación de Bluetooth"</string>
+ <string name="bluetooth_device_info">"Información del dispositivo Bluetooth"</string>
+ <string name="bluetooth_enter_pin_msg">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"\n\n"Escribe el PIN para poder vincular."\n"(prueba con 0000 ó 1234.)"</string>
+ <string name="bluetooth_error_title">"Atención"</string>
+ <string name="bluetooth_pairing_error_message">"Se ha producido un problema al vincular con <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+ <string name="bluetooth_pairing_pin_error_message">"Se ha producido un problema al vincular <xliff:g id="DEVICE_NAME">%1$s</xliff:g> debido a que el PIN que has escrito es incorrecto."</string>
+ <!-- no translation found for bluetooth_pairing_device_down_error_message (6688215193824686741) -->
+ <skip />
+ <!-- no translation found for bluetooth_pairing_rejected_error_message (1648157108520832454) -->
+ <skip />
+ <string name="bluetooth_connecting_error_message">"Se ha producido un problema al conectarse con <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+ <string name="bluetooth_preference_scan_title">"Explorar dispositivos"</string>
+ <string name="bluetooth_device_context_connect">"Conectar"</string>
+ <string name="bluetooth_device_context_disconnect">"Desconectar"</string>
+ <string name="bluetooth_device_context_pair_connect">"Vincular y conectar"</string>
+ <string name="bluetooth_device_context_unpair">"Desvincular"</string>
+ <string name="bluetooth_device_context_disconnect_unpair">"Desconectar y desvincular"</string>
+ <string name="bluetooth_device_context_connect_advanced">"Opciones..."</string>
+ <string name="bluetooth_connect_specific_profiles_title">"Conectar a..."</string>
+ <string name="bluetooth_profile_a2dp">"Medios"</string>
+ <string name="bluetooth_profile_headset">"Teléfono"</string>
+ <string name="bluetooth_summary_connected_to_a2dp">"Conectado al audio de medios"</string>
+ <string name="bluetooth_summary_connected_to_headset">"Conectado al audio del teléfono"</string>
+ <string name="bluetooth_summary_connected_to_a2dp_headset">"Conectado al audio del teléfono y los medios"</string>
+ <string name="bluetooth_device_advanced_title">"opciones de <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_device_advanced_online_mode_title">"Conectar"</string>
+ <string name="bluetooth_device_advanced_online_mode_summary">"Conectar al dispositivo Bluetooth"</string>
+ <string name="bluetooth_device_advanced_profile_header_title">"Perfiles"</string>
+ <string name="bluetooth_a2dp_profile_summary_connected">"Conectado al audio de medios"</string>
+ <string name="bluetooth_headset_profile_summary_connected">"Conectado al audio del teléfono"</string>
+ <string name="bluetooth_a2dp_profile_summary_use_for">"Utilizar para el audio de medios"</string>
+ <string name="bluetooth_headset_profile_summary_use_for">"Utilizar para el audio del teléfono"</string>
+ <string name="wifi">"Wi-Fi"</string>
+ <string name="wifi_quick_toggle_title">"Wi-Fi"</string>
+ <string name="wifi_quick_toggle_summary">"Encender Wi-Fi"</string>
+ <string name="wifi_settings">"Configuración Wi-Fi"</string>
+ <string name="wifi_settings_category">"Configuración Wi-Fi"</string>
+ <string name="wifi_settings_summary">"Configurar y administrar los puntos de acceso de teléfonos inalámbricos"</string>
+ <string name="forget_network">"Olvidar"</string>
+ <string name="wifi_status">"Estado"</string>
+ <string name="wifi_link_speed">"Velocidad"</string>
+ <string name="wifi_signal_3">"Excelente"</string>
+ <string name="wifi_signal_2">"Bueno"</string>
+ <string name="wifi_signal_1">"Aceptable"</string>
+ <string name="wifi_signal_0">"Baja calidad"</string>
+ <string name="security">"Seguridad"</string>
+ <string name="wifi_security_open">"Abrir"</string>
+ <string name="wifi_security_wep">"WEP"</string>
+ <string name="wifi_security_wpa">"WPA"</string>
+ <string name="wifi_security_wpa2">"WPA2"</string>
+ <string name="wifi_security_unknown">"Desconocido"</string>
+ <string name="wifi_security_verbose_open">"Abrir red"</string>
+ <string name="wifi_security_verbose_wep">"Asegurado con WEP"</string>
+ <string name="wifi_security_verbose_wpa">"Asegurado con WPA"</string>
+ <string name="wifi_security_verbose_wpa2">"Asegurado con WPA2"</string>
+ <string name="ip_address">"Dirección IP"</string>
+ <string name="signal">"Potencia de la señal"</string>
+ <string name="wifi_starting">"Encendiendo..."</string>
+ <string name="wifi_stopping">"Apagándose..."</string>
+ <string name="wifi_error">"Error"</string>
+ <string name="error_starting">"No se ha podido iniciar Wi-Fi"</string>
+ <string name="error_stopping">"No se ha podido detener Wi-Fi"</string>
+ <string name="error_scanning">"No se han podido explorar redes"</string>
+ <string name="error_connecting">"No se puede conectar a la red"</string>
+ <string name="error_saving">"No se ha podido guardar la red"</string>
+ <string name="connect">"Conectar"</string>
+ <string name="connect_to_blank">"Conectar a <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+ <string name="please_type_passphrase">"Contraseña de teléfono inalámbrico"</string>
+ <string name="please_type_hex_key">"Clave hexadecimal WEP (0-9, A-F)"</string>
+ <string name="wifi_show_password">"Mostrar contraseña."</string>
+ <string name="scan_wifi">"Explorar"</string>
+ <string name="summary_not_in_range">"Fuera del alcance"</string>
+ <string name="summary_remembered">"Recordado"</string>
+ <string name="summary_connection_failed">"La conexión no se ha realizado correctamente, selecciona para volver a intentarlo"</string>
+ <string name="wifi_access_points">"Redes de Wi-Fi"</string>
+ <string name="wifi_type_ssid">"SSID de red"</string>
+ <string name="wifi_security">"Seguridad"</string>
+ <string name="wifi_save_config">"Guardar"</string>
+ <string name="wifi_password_unchanged">"(sin cambios)"</string>
+ <string name="wifi_add_other_network">"Agregar red de Wi-Fi"</string>
+ <string name="wifi_notify_open_networks">"Notificación de red"</string>
+ <string name="wifi_notify_open_networks_summary">"Notificarme cuando se encuentre disponible una red abierta"</string>
+ <string name="wifi_password_incorrect_error">"La contraseña de la red que has escrito no es correcta. Vuelve a intentarlo."</string>
+ <string name="wifi_generic_connection_error">"Hay un problema de conexión de red. Vuelve a intentarlo."</string>
+ <string name="wifi_menu_advanced">"Avanzado"</string>
+ <string name="wifi_ip_settings_titlebar">"Configuración de IP"</string>
+ <string name="wifi_ip_settings_menu_save">"Guardar"</string>
+ <string name="wifi_ip_settings_menu_cancel">"Cancelar"</string>
+ <string name="wifi_ip_settings_invalid_ip">"Escribe una dirección IP válida."</string>
+ <string name="wifi_use_static_ip">"Utilizar IP estática"</string>
+ <string name="wifi_ip_address">"Dirección IP"</string>
+ <string name="wifi_dns1">"DNS 1"</string>
+ <string name="wifi_dns2">"DNS 2"</string>
+ <string name="wifi_gateway">"Acceso"</string>
+ <string name="wifi_netmask">"Máscara de red"</string>
+ <string name="wifi_context_menu_connect">"Conectar a la red"</string>
+ <string name="wifi_context_menu_forget">"Olvidar red"</string>
+ <string name="wifi_context_menu_change_password">"Cambiar contraseña"</string>
+ <string name="wifi_advanced_titlebar">"Avanzado"</string>
+ <string name="wifi_setting_num_channels_title">"Dominio regulador"</string>
+ <string name="wifi_setting_num_channels_summary">"Establecer la cantidad de canales a utilizar"</string>
+ <string name="wifi_setting_num_channels_error">"Se ha producido un problema al establecer el dominio regulador."</string>
+ <string name="wifi_setting_num_channels_channel_phrase">"<xliff:g id="NUM_CHANNELS">%1$d</xliff:g> canales"</string>
+ <string name="wifi_setting_sleep_policy_title">"Política de estado de inactividad de Wi-Fi"</string>
+ <string name="wifi_setting_sleep_policy_summary">"Especificar cuándo se debe cambiar de Wi-Fi a datos de celular"</string>
+ <string name="wifi_setting_sleep_policy_error">"Se ha producido un problema al establecer la política de estado de inactividad."</string>
+ <string name="wifi_advanced_mac_address_title">"Dirección de MAC"</string>
+ <string name="fragment_status_scanning">"Explorando..."</string>
+ <string name="fragment_status_connecting">"Conectando a <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</string>
+ <string name="fragment_status_authenticating">"Autenticando con <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</string>
+ <string name="fragment_status_obtaining_ip">"Obteniendo dirección IP de <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</string>
+ <string name="fragment_status_connected">"Conectado a <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+ <string name="fragment_status_disconnecting">"Desconectando de <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</string>
+ <string name="fragment_status_disconnected">"Desconectado"</string>
+ <string name="fragment_status_failed">"Incorrecto"</string>
+ <string name="status_scanning">"Explorando..."</string>
+ <string name="status_connecting">"Conectando…"</string>
+ <string name="status_authenticating">"Autenticando…"</string>
+ <string name="status_obtaining_ip">"Obteniendo dirección..."</string>
+ <string name="status_connected">"Conectado"</string>
+ <string name="status_disconnecting">"Desconectando…"</string>
+ <string name="status_disconnected">"Desconectado"</string>
+ <string name="status_failed">"Incorrecto"</string>
+ <string name="sound_and_display_settings">"Sonido y visualización"</string>
+ <string name="sound_settings">"Configuración de sonido"</string>
+ <string name="sound_and_display_settings_summary">"Establecer tonos de llamada, notificaciones, brillo de pantalla"</string>
+ <string name="silent_mode_title">"Modo silencioso"</string>
+ <string name="silent_mode_summary">"Todos los sonidos excepto los medios y las alarmas están en silencio"</string>
+ <!-- no translation found for silent_mode_incl_alarm_summary (2088830834182228458) -->
+ <skip />
+ <string name="ringtone_title">"Tono de llamada del teléfono"</string>
+ <string name="ringtone_summary">"Establece tu tono predeterminado de llamada entrante"</string>
+ <string name="ring_volume_title">"Volumen del timbre"</string>
+ <string name="ring_volume_summary">"Establecer el volumen para las llamadas entrantes y notificaciones"</string>
+ <string name="vibrate_title">"Vibración del teléfono"</string>
+ <string name="vibrate_summary">"Hacer vibrar al teléfono para las llamadas entrantes"</string>
+ <string name="notification_sound_title">"Tono de llamada de notificación"</string>
+ <string name="notification_sound_summary">"Establecer tono predeterminado de llamada de notificación"</string>
+ <string name="incoming_call_volume_title">"Volumen de llamada entrante"</string>
+ <string name="notification_volume_title">"Volumen de notificación"</string>
+ <string name="checkbox_notification_same_as_incoming_call">"Utilizar el volumen de las llamadas entrantes para las notificaciones"</string>
+ <string name="notification_sound_dialog_title">"Seleccionar tono de llamada de notificación"</string>
+ <string name="media_volume_title">"Volumen de los medios"</string>
+ <string name="media_volume_summary">"Establecer volumen para la música y los videos"</string>
+ <string name="dtmf_tone_enable_title">"Tonos audibles"</string>
+ <string name="dtmf_tone_enable_summary_on">"Reproducir tonos cuando se utilice el teclado de marcación"</string>
+ <string name="dtmf_tone_enable_summary_off">"Reproducir tonos cuando se utilice el teclado de marcación"</string>
+ <string name="sound_effects_enable_title">"Selección audible"</string>
+ <string name="sound_effects_enable_summary_on">"Reproducir el sonido al realizar la selección de pantalla"</string>
+ <string name="sound_effects_enable_summary_off">"Reproducir el sonido al realizar la selección de pantalla"</string>
+ <string name="play_media_notification_sounds_enable_title">"Notificaciones de tarjeta SD"</string>
+ <string name="play_media_notification_sounds_enable_summary_on">"Desactivar los sonidos de notificación de la tarjeta SD"</string>
+ <string name="play_media_notification_sounds_enable_summary_off">"Activar los sonidos de notificación de la tarjeta SD"</string>
+ <string name="sync_settings">"Sincronización de datos"</string>
+ <string name="sync_settings_summary">"Seleccionar las aplicaciones que se sincronizan"</string>
+ <string name="display_settings">"Configuración de visualización"</string>
+ <string name="animations_title">"Animación"</string>
+ <string name="animations_summary_on">"Mostrar animación al abrir y cerrar ventanas"</string>
+ <string name="animations_summary_off">"Mostrar animación al abrir y cerrar ventanas"</string>
+ <string name="accelerometer_title">"Orientación"</string>
+ <string name="accelerometer_summary_on">"Cambiar la orientación automáticamente al girar el teléfono"</string>
+ <string name="accelerometer_summary_off">"Cambiar la orientación automáticamente al girar el teléfono"</string>
+ <string name="brightness">"Brillo"</string>
+ <string name="brightness_summary">"Ajustar el brillo de la pantalla"</string>
+ <string name="screen_timeout">"Tiempo de espera de la pantalla"</string>
+ <string name="screen_timeout_summary">"Ajustar el tiempo de demora para que la pantalla se apague automáticamente"</string>
+ <string name="sim_lock_settings">"Configuración de bloqueo de la tarjeta SIM"</string>
+ <string name="sim_lock_settings_category">"Establecer bloqueo de la tarjeta SIM"</string>
+ <string name="sim_lock_settings_title">"Bloqueo de la tarjeta SIM"</string>
+ <string name="sim_pin_toggle">"Bloquear la tarjeta SIM"</string>
+ <string name="sim_lock_on">"Se requiere PIN para utilizar el teléfono"</string>
+ <string name="sim_lock_off">"Se requiere PIN para utilizar el teléfono"</string>
+ <string name="sim_pin_change">"Cambiar el PIN de SIM"</string>
+ <string name="sim_enter_pin">"PIN de SIM"</string>
+ <string name="sim_enable_sim_lock">"Bloquear la tarjeta SIM"</string>
+ <string name="sim_disable_sim_lock">"Desbloquear tarjeta SIM"</string>
+ <string name="sim_enter_old">"PIN de SIM anterior"</string>
+ <string name="sim_enter_new">"Nuevo PIN de SIM"</string>
+ <string name="sim_reenter_new">"Volver a escribir el PIN nuevo"</string>
+ <string name="sim_change_pin">"PIN de SIM"</string>
+ <string name="sim_bad_pin">"¡PIN incorrecto!"</string>
+ <string name="sim_pins_dont_match">"¡Los PIN no coinciden!"</string>
+ <string name="sim_change_failed">"No se ha podido cambiar el PIN."\n"PIN posiblemente incorrecto."</string>
+ <string name="sim_change_succeeded">"El PIN de SIM se ha cambiado correctamente"</string>
+ <string name="sim_lock_failed">"No se ha podido cambiar el estado de bloqueo de la tarjeta SIM. "\n"PIN posiblemente incorrecto."</string>
+ <string name="sim_enter_ok">"Aceptar"</string>
+ <string name="sim_enter_cancel">"Cancelar"</string>
+ <string name="device_info_settings">"Estado del teléfono"</string>
+ <string name="system_update_settings_list_item_title">"Actualizaciones del sistema"</string>
+ <string name="system_update_settings_list_item_summary">"Verificar si hay actualizaciones de sistema"</string>
+ <string name="firmware_version">"Versión de los programas inalterables"</string>
+ <string name="model_number">"Número de modelo"</string>
+ <string name="baseband_version">"Versión de banda de base"</string>
+ <string name="kernel_version">"Versión núcleo"</string>
+ <string name="build_number">"Crear número"</string>
+ <string name="device_info_not_available">"No disponible"</string>
+ <string name="device_status_activity_title">"Estado"</string>
+ <string name="device_status">"Estado"</string>
+ <string name="device_status_summary">"IMEI, número de teléfono, señal, etc."</string>
+ <string name="storage_settings_title">"Tarjeta SD y almacenamiento del teléfono"</string>
+ <string name="storage_settings_summary">"Desmontar tarjeta SD, ver espacio de almacenamiento disponible"</string>
+ <string name="status_number">"Número de teléfono"</string>
+ <string name="status_network_type">"Tipo de red de celulares"</string>
+ <string name="status_data_state">"Estado de red de celulares"</string>
+ <string name="status_service_state">"Estado del servicio"</string>
+ <string name="status_signal_strength">"Potencia de la señal"</string>
+ <string name="status_roaming">"Roaming"</string>
+ <string name="status_operator">"Red"</string>
+ <string name="status_wifi_mac_address">"Dirección MAC de Wi-Fi"</string>
+ <string name="status_bt_address">"Dirección de Bluetooth"</string>
+ <string name="status_unavailable">"No disponible"</string>
+ <string name="status_up_time">"Hora productiva"</string>
+ <string name="status_awake_time">"Hora de actividad"</string>
+ <string name="internal_memory">"Espacio de almacenamiento interno del teléfono"</string>
+ <string name="sd_memory">"Tarjeta SD"</string>
+ <string name="memory_available">"Espacio disponible"</string>
+ <string name="memory_size">"Espacio total"</string>
+ <string name="sd_eject">"Desmontar la tarjeta SD"</string>
+ <string name="sd_eject_summary">"Desmontar la tarjeta SD para extraerla de manera segura"</string>
+ <string name="sd_format">"Formatear tarjeta SD"</string>
+ <string name="sd_format_summary">"Formato (borrar) la tarjeta SD"</string>
+ <string name="sd_unavailable">"No disponible"</string>
+ <string name="read_only">" (Sólo lectura)"</string>
+ <string name="battery_status_title">"Estado de batería"</string>
+ <string name="battery_level_title">"Nivel de la batería"</string>
+ <string name="apn_settings">"APN"</string>
+ <string name="apn_edit">"Editar el punto de acceso"</string>
+ <string name="apn_not_set">"&lt;No establecido&gt;"</string>
+ <string name="apn_name">"Nombre"</string>
+ <string name="apn_apn">"APN"</string>
+ <string name="apn_http_proxy">"Proxy"</string>
+ <string name="apn_http_port">"Puerto"</string>
+ <string name="apn_user">"Nombre de usuario"</string>
+ <string name="apn_password">"Contraseña"</string>
+ <string name="apn_server">"Servidor"</string>
+ <string name="apn_mmsc">"MMSC"</string>
+ <string name="apn_mms_proxy">"Proxy de MMS"</string>
+ <string name="apn_mms_port">"Puerto MMS"</string>
+ <string name="apn_mcc">"MCC"</string>
+ <string name="apn_mnc">"MNC"</string>
+ <string name="apn_type">"Tipo de APN"</string>
+ <string name="menu_delete">"Eliminar APN"</string>
+ <string name="menu_new">"APN nuevo"</string>
+ <string name="menu_save">"Guardar"</string>
+ <string name="menu_cancel">"Descartar"</string>
+ <string name="error_title">"Atención"</string>
+ <string name="error_name_empty">"El campo Nombre no puede estar vacío"</string>
+ <string name="error_apn_empty">"El APN no puede estar vacío."</string>
+ <string name="error_mcc_not3">"El campo de MCC debe contener 3 dígitos."</string>
+ <string name="error_mnc_not23">"El campo MNC debe contener 2 ó 3 dígitos."</string>
+ <string name="restore_default_apn">"Restaurando la configuración APN predeterminada"</string>
+ <string name="menu_restore">"Reestablecer a la forma predeterminada"</string>
+ <string name="restore_default_apn_completed">"Restablecimiento completado de configuración de APN predeterminada"</string>
+ <string name="master_clear_title">"Restablecimiento de los datos de fábrica"</string>
+ <string name="master_clear_summary">"Borra todos los datos del teléfono"</string>
+ <string name="master_clear_desc">"¡Esta acción restablecerá el teléfono a su estado de fábrica inicial y borrará todos los datos y aplicaciones descargadas!"</string>
+ <string name="master_clear_button_text">"Restablecer el teléfono"</string>
+ <string name="master_clear_final_desc">"¿Deseas restablecer el teléfono y borrar todos los datos y aplicaciones? ¡Esta acción no se puede cambiar!"</string>
+ <string name="master_clear_final_button_text">"Borrar todo"</string>
+ <string name="master_clear_gesture_prompt">"Extrae tu patrón de desbloqueo"</string>
+ <string name="master_clear_gesture_explanation">"Debes extraer tu patrón de desbloqueo para confirmar el restablecimiento de un teléfono."</string>
+ <string name="master_clear_failed">"No se ha realizado ningún restablecimiento debido a que el servicio \"Borrar sistema\" no se encuentra disponible."</string>
+ <string name="media_format_title">"Formatear tarjeta SD."</string>
+ <string name="media_format_summary">"Borra todos los datos en la tarjeta SD"</string>
+ <string name="media_format_desc">"Esta acción borrará la tarjeta SD en el teléfono. ¡Perderás TODA la información de la tarjeta!"</string>
+ <string name="media_format_button_text">"Formatear tarjeta SD"</string>
+ <string name="media_format_final_desc">"¿Deseas formatear tarjeta SD y borrar todos tus medios? ¡Esta acción no se puede cambiar!"</string>
+ <string name="media_format_final_button_text">"Borrar todo"</string>
+ <string name="media_format_gesture_prompt">"Extrae tu patrón de desbloqueo"</string>
+ <string name="media_format_gesture_explanation">"Debes extraer tu patrón de desbloqueo parar confirmar un formato de tarjeta SD."</string>
+ <string name="call_settings_title">"Configuración de llamada"</string>
+ <string name="call_settings_summary">"Establecer correo de voz, desvío de llamadas, llamada en espera, identificador de llamadas"</string>
+ <string name="network_settings_title">"Redes de celulares"</string>
+ <string name="network_settings_summary">"Establecer opciones para roaming, redes, APN"</string>
+ <string name="location_title">"Mis fuentes de ubicación"</string>
+ <string name="location_network_based">"Utilizar redes inalámbricas"</string>
+ <string name="location_networks_disabled">"Ver ubicación en las aplicaciones (como Mapas) mediante redes inalámbricas"</string>
+ <string name="location_neighborhood_level">"Ubicación determinada por Wi-Fi o redes de celulares"</string>
+ <string name="location_gps">"Activar satélites de GPS"</string>
+ <string name="location_street_level">"Localizar con una precisión del nivel de calle (deseleccionar para conservar la batería)"</string>
+ <string name="location_gps_disabled">"Localizar a nivel de calle (requiere más batería además de la vista del cielo)"</string>
+ <string name="about_settings">"Acerca del teléfono"</string>
+ <string name="about_settings_summary">"Ver información legal, estado del teléfono, versión de software"</string>
+ <string name="legal_information">"Información legal"</string>
+ <string name="contributors_title">"Colaboradores"</string>
+ <string name="copyright_title">"Derechos de autor"</string>
+ <string name="license_title">"Licencia"</string>
+ <string name="terms_title">"Términos y condiciones"</string>
+ <!-- no translation found for system_tutorial_list_item_title (4315834755909579018) -->
+ <skip />
+ <!-- no translation found for system_tutorial_list_item_summary (3861815254521030201) -->
+ <skip />
+ <string name="settings_license_activity_title">"Abrir licencias de origen"</string>
+ <string name="settings_license_activity_unavailable">"Hay un problema para cargar las licencias."</string>
+ <string name="settings_license_activity_loading">"Cargando…"</string>
+ <string name="lock_settings_title">"Patrón de desbloqueo de la pantalla"</string>
+ <string name="lockpattern_change_lock_pattern_label">"Cambiar patrón de desbloqueo"</string>
+ <string name="lockpattern_need_to_unlock">"Confirmar el patrón guardado"</string>
+ <string name="lockpattern_need_to_unlock_wrong">"Lo sentimos, vuelve a intentarlo:"</string>
+ <string name="lockpattern_recording_intro_header">"Extraer un patrón de desbloqueo"</string>
+ <string name="lockpattern_recording_intro_footer">"Presiona el Menú para obtener ayuda."</string>
+ <string name="lockpattern_recording_inprogress">"Sacar el dedo cuando haya finalizado."</string>
+ <string name="lockpattern_recording_incorrect_too_short">"Conectar al menos <xliff:g id="NUMBER">%d</xliff:g> puntos. Vuelve a intentarlo."</string>
+ <string name="lockpattern_pattern_entered_header">"¡Patrón grabado!"</string>
+ <string name="lockpattern_need_to_confirm">"Extrae el patrón nuevamente para confirmar:"</string>
+ <string name="lockpattern_pattern_confirmed_header">"Tu nuevo patrón de desbloqueo:"</string>
+ <string name="lockpattern_confirm_button_text">"Confirmar"</string>
+ <string name="lockpattern_restart_button_text">"Revisar"</string>
+ <string name="lockpattern_retry_button_text">"Intentar nuevamente"</string>
+ <string name="lockpattern_continue_button_text">"Continuar"</string>
+ <string name="lockpattern_settings_title">"Patrón de desbloqueo"</string>
+ <string name="lockpattern_settings_enable_title">"Requiere un patrón"</string>
+ <string name="lockpattern_settings_enable_summary">"Debes extraer el patrón para desbloquear la pantalla"</string>
+ <string name="lockpattern_settings_enable_visible_pattern_title">"Utilizar un patrón visible"</string>
+ <string name="lockpattern_settings_enable_tactile_feedback_title">"Usar retroalimentación táctil"</string>
+ <string name="lockpattern_settings_choose_lock_pattern">"Establecer patrón de desbloqueo"</string>
+ <string name="lockpattern_settings_change_lock_pattern">"Cambiar patrón de desbloqueo"</string>
+ <string name="lockpattern_settings_help_how_to_record">"Cómo se debe extraer un patrón de desbloqueo"</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_header">"¡Demasiados intentos incorrectos!"</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_footer">"Vuelve a intentarlo en <xliff:g id="NUMBER">%d</xliff:g> segundos."</string>
+ <string name="skip_button_label">"Cancelar"</string>
+ <string name="next_button_label">"Siguiente"</string>
+ <string name="lock_title">"Asegurando tu teléfono"</string>
+ <string name="lock_intro_message"><font size="17">"Protege a tu teléfono de usos no autorizados al crear un patrón de desbloqueo en la pantalla personal. "\n<font height="17">\n</font><b>"1"</b>"  En la pantalla siguiente, observa cómo se extrae un patrón de ejemplo. "\n<font height="17">\n</font><b>"2"</b>"  Cuando estés listo, extrae tu propio patrón de desbloqueo personal. Experimenta con diferentes patrones pero conecta al menos cuatro puntos. "\n<font height="17">\n</font><b>"3"</b>"  Revisa tu patrón para confirmar. "\n<font height="17">\n</font><b>"¿Estás listo para comenzar? Selecciona “Siguiente”"</b>". "\n<font height="3">\n</font>"Si deseas dejar sin protección a tu teléfono, selecciona “Cancelar”."</font></string>
+ <string name="lock_example_title">"Patrón de ejemplo"</string>
+ <string name="lock_example_message">"Conecta al menos cuatro puntos."\n" "\n"Selecciona “Siguiente” cuando estés listo para extraer tu propio patrón."</string>
+ <string name="manageapplications_settings_title">"Administrar aplicaciones"</string>
+ <string name="manageapplications_settings_summary">"Administrar y eliminar aplicaciones instaladas"</string>
+ <string name="applications_settings">"Aplicaciones"</string>
+ <string name="applications_settings_summary">"Administrar aplicaciones, configurar accesos directos para lanzamientos rápidos"</string>
+ <string name="applications_settings_header">"Configuración de aplicación"</string>
+ <string name="install_applications">"Fuentes desconocidas"</string>
+ <string name="install_unknown_applications">"Admite la instalación de aplicaciones que no pertenezcan a Market"</string>
+ <string name="install_all_warning">"Tu teléfono y datos personales son más vulnerables a sufrir ataques de aplicaciones provenientes de fuentes desconocidas. Aceptas que eres el único responsable de cualquier daño que sufra tu teléfono o de cualquier pérdida de datos que pueda ocasionar el uso de estas aplicaciones."</string>
+ <string name="application_info_label">"Información de aplicación"</string>
+ <string name="storage_label">"Espacio de almacenamiento"</string>
+ <string name="auto_launch_label">"Lanzar de manera predeterminada"</string>
+ <string name="permissions_label">"Permisos"</string>
+ <string name="cache_header_label">"Memoria caché"</string>
+ <string name="clear_cache_btn_text">"Borrar memoria caché"</string>
+ <string name="cache_size_label">"Memoria caché"</string>
+ <string name="controls_label">"Controles"</string>
+ <string name="force_stop">"Provocar la detención"</string>
+ <string name="total_size_label">"Total"</string>
+ <string name="application_size_label">"Aplicación"</string>
+ <string name="data_size_label">"Datos"</string>
+ <string name="uninstall_text">"Desinstalar..."</string>
+ <string name="clear_user_data_text">"Borrar datos"</string>
+ <string name="auto_launch_enable_text">"Has elegido lanzar esta aplicación de manera predeterminada para algunas acciones."</string>
+ <string name="auto_launch_disable_text">"No hay configuraciones predeterminadas establecidas."</string>
+ <string name="clear_activities">"Borrar configuraciones predeterminadas"</string>
+ <string name="unknown">"Desconocido"</string>
+ <string name="sort_order_alpha">"Ordenar"</string>
+ <string name="sort_order_size">"Ordenar por tamaño"</string>
+ <string name="manage_space_text">"Administrar el espacio"</string>
+ <string name="filter">"Filtro"</string>
+ <string name="filter_dlg_title">"Seleccionar opciones de filtro"</string>
+ <string name="filter_apps_all">"Todos"</string>
+ <string name="filter_apps_third_party">"Tercero"</string>
+ <string name="filter_apps_running">"En ejecución"</string>
+ <string name="loading">"Cargando…"</string>
+ <string name="recompute_size">"Recalculando el tamaño…"</string>
+ <string name="clear_data_dlg_title">"Eliminar"</string>
+ <string name="clear_data_dlg_text">"Toda la información que has guardado en esta aplicación se eliminará de manera permanente."</string>
+ <string name="dlg_ok">"Aceptar"</string>
+ <string name="dlg_cancel">"Cancelar"</string>
+ <string name="app_not_found_dlg_title">"No se ha encontrado la aplicación"</string>
+ <string name="app_not_found_dlg_text">"No se ha encontrado la aplicación en la lista de aplicaciones instaladas."</string>
+ <string name="clear_data_failed">"No se han podido borrar los datos de la aplicación."</string>
+ <string name="security_settings_desc">"Esta aplicación puede acceder a lo siguiente en tu teléfono:"</string>
+ <string name="computing_size">"Calculando..."</string>
+ <string name="invalid_size_value">"No se ha podido calcular el tamaño del paquete"</string>
+ <string name="empty_list_msg">"No tienes instalada ninguna aplicación de terceros."</string>
+ <string name="language_settings">"País y texto"</string>
+ <string name="language_settings_summary">"Establecer opciones de país (idioma y región), ingreso de texto y corrección automática"</string>
+ <string name="language_category">"Configuración de país"</string>
+ <string name="text_category">"Configuración de texto"</string>
+ <string name="phone_language">"Seleccionar país"</string>
+ <string name="phone_language_summary">"Seleccionar idioma y región"</string>
+ <string name="auto_replace">"Reemplazar automáticamente"</string>
+ <string name="auto_replace_summary">"Corregir palabras mal escritas"</string>
+ <string name="auto_caps">"Uso automático de mayúsculas"</string>
+ <string name="auto_caps_summary">"Escribir con mayúscula la primera letra en las oraciones"</string>
+ <string name="auto_punctuate">"Colocar la puntuación automáticamente"</string>
+ <string name="hardkeyboard_category">"Configuración de teclado físico"</string>
+ <string name="auto_punctuate_summary">"Presionar la tecla de espacio dos veces para insertar \".\""</string>
+ <string name="show_password">"Contraseñas visibles"</string>
+ <string name="show_password_summary">"Mostrar contraseña cuando escribas"</string>
+ <!-- no translation found for ime_security_warning (3458652708716006477) -->
+ <skip />
+ <string name="user_dict_settings_titlebar">"Diccionario del usuario"</string>
+ <string name="user_dict_settings_title">"Diccionario del usuario"</string>
+ <string name="user_dict_settings_summary">"Agregar y eliminar palabras del diccionario del usuario"</string>
+ <string name="user_dict_settings_add_menu_title">"Agregar"</string>
+ <string name="user_dict_settings_add_dialog_title">"Agregar al diccionario"</string>
+ <string name="user_dict_settings_edit_dialog_title">"Editar trabajo"</string>
+ <string name="user_dict_settings_context_menu_edit_title">"Editar"</string>
+ <string name="user_dict_settings_context_menu_delete_title">"Eliminar"</string>
+ <string name="user_dict_settings_empty_text">"El diccionario del usuario no contiene ninguna palabra. Puedes agregar una palabra a través del menú."</string>
+ <string name="testing">"Probando"</string>
+ <string name="testing_phone_info">"Información del teléfono"</string>
+ <string name="testing_battery_info">"Información sobre la batería"</string>
+ <string name="testing_battery_history">"Historial de batería"</string>
+ <string name="quick_launch_title">"Lanzamiento rápido"</string>
+ <string name="quick_launch_summary">"Establecer métodos abreviados de teclado para lanzar aplicaciones"</string>
+ <string name="quick_launch_assign_application">"Asignar aplicación"</string>
+ <string name="quick_launch_no_shortcut">"No hay acceso directo"</string>
+ <string name="quick_launch_shortcut">"Buscar + <xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g>"</string>
+ <string name="quick_launch_clear_dialog_title">"Borrar"</string>
+ <string name="quick_launch_clear_dialog_message">"Se borrará tu acceso directo para <xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g> (<xliff:g id="APPLICATION_NAME">%2$s</xliff:g>)."</string>
+ <string name="quick_launch_clear_ok_button">"Aceptar"</string>
+ <string name="quick_launch_clear_cancel_button">"Cancelar"</string>
+ <string name="quick_launch_display_mode_applications">"Aplicaciones"</string>
+ <string name="quick_launch_display_mode_shortcuts">"Accesos directos"</string>
+ <string name="input_methods_settings_title">"Ingreso de texto"</string>
+ <string name="input_methods_settings_summary">"Administrar opciones de ingreso de texto"</string>
+ <string name="input_methods_settings_label_format">"Configuración de <xliff:g id="IME_NAME">%1$s</xliff:g>"</string>
+ <string name="onscreen_keyboard_settings_summary">"Configuración de teclado en la pantalla"</string>
+ <string name="builtin_keyboard_settings_title">"Teclado del dispositivo"</string>
+ <string name="builtin_keyboard_settings_summary">"Configuración de teclado integrado"</string>
+ <string name="development_settings_title">"Desarrollo"</string>
+ <string name="development_settings_summary">"Establecer opciones para desarrollar aplicaciones"</string>
+ <string name="enable_adb">"Depuración de USB"</string>
+ <string name="enable_adb_summary">"Modo de depuración cuando se conecta el USB"</string>
+ <string name="keep_screen_on">"Permanecer activo"</string>
+ <string name="keep_screen_on_summary">"La pantalla nunca quedará inactiva mientras se realiza la carga"</string>
+ <string name="allow_mock_location">"Permitir la creación de ubicaciones de prueba"</string>
+ <string name="allow_mock_location_summary">"Permitir la creación de ubicaciones de prueba"</string>
+ <string name="gadget_picker_title">"Elegir gadget"</string>
+ <string name="widget_picker_title">"Elegir control"</string>
+ <string name="battery_history_details_for">"Detalles de %d de UID"</string>
+ <string name="battery_history_uid">"ID de usuario <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
+ <string name="battery_history_network_usage">"Detalles de uso de la red para <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="battery_history_bytes_received">"Bytes recibidos: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_sent">"Bytes enviados: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_total">"Total de bytes: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_cpu_usage">"Detalles de uso de CPU para <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
+ <string name="battery_history_user_time">"Hora del usuario:"</string>
+ <string name="battery_history_system_time">"Hora del sistema:"</string>
+ <string name="battery_history_total_time">"Tiempo total:"</string>
+ <string name="battery_history_starts">"Comienza: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
+ <string name="battery_history_days">"<xliff:g id="DAYS">%1$d</xliff:g> días, <xliff:g id="HOURS">%2$d</xliff:g> horas, <xliff:g id="MINUTES">%3$d</xliff:g> minutos, <xliff:g id="SECONDS">%4$d</xliff:g> segundos"</string>
+ <string name="battery_history_hours">"<xliff:g id="HOURS">%1$d</xliff:g> horas, <xliff:g id="MINUTES">%2$d</xliff:g> minutos, <xliff:g id="SECONDS">%3$d</xliff:g> segundos"</string>
+ <string name="battery_history_minutes">"<xliff:g id="MINUTES">%1$d</xliff:g> minutos, <xliff:g id="SECONDS">%2$d</xliff:g> segundos"</string>
+ <string name="battery_history_seconds">"<xliff:g id="SECONDS">%1$d</xliff:g> segundos"</string>
+ <string name="battery_history_packages_sharing_this_uid">"Paquetes que comparten esta UID:"</string>
+ <string name="battery_history_no_data">"No hay datos disponibles del uso de la batería"</string>
+ <string name="battery_history_sensor">"Sensor:"</string>
+ <string name="battery_history_wakelock">"Bloqueo de despertador parcial:"</string>
+ <string name="battery_history_used_by_packages">"Sensor utilizado por los paquetes:"</string>
+ <string name="battery_history_sensor_usage">"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">"Utilizado <xliff:g id="COUNT">%1$d</xliff:g> veces por uno de:"</string>
+ <string name="battery_history_awake_label">"En ejecución"</string>
+ <string name="battery_history_screen_on_label">"Pantalla encendida"</string>
+ <string name="battery_history_phone_on_label">"Teléfono encendido"</string>
+ <string name="battery_history_awake">"Tiempo de encendido sin estar en estado de inactividad:"</string>
+ <string name="battery_history_screen_on">"Tiempo de encendido de la pantalla:"</string>
+ <string name="battery_history_phone_on">"Tiempo de encendido del teléfono:"</string>
+ <string name="battery_history_screen_on_battery">"En la batería:"</string>
+ <string name="battery_history_screen_on_plugged">"Conectado:"</string>
+ <string name="usage_stats_label">"Estadísticas de uso"</string>
+ <string name="testing_usage_stats">"Estadísticas de uso"</string>
+ <string name="display_order_text">"Ordenar por:"</string>
+ <string name="app_name_label">"Aplicación"</string>
+ <string name="launch_count_label">"Contar"</string>
+ <string name="usage_time_label">"Hora de uso"</string>
+</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 1c867fd..5e6c425 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -107,8 +107,6 @@
<string name="date_and_time">"Configuración de fecha y hora"</string>
<string name="date_time_12_hour_sample">"1:00 p.m."</string>
<string name="date_time_24_hour_sample">"13:00"</string>
- <string name="date_time_changeTime_text">"Cambiar hora"</string>
- <string name="date_time_changeDate_text">"Fecha"</string>
<string name="choose_timezone">"Seleccionar zona horaria"</string>
<string name="display_preview_label">"Vista previa:"</string>
<string name="display_font_size_label">"Tamaño de fuente:"</string>
@@ -201,7 +199,7 @@
<string name="date_time_auto">"Automático"</string>
<string name="date_time_auto_summaryOn">"Utilizar valores proporcionados por la red"</string>
<string name="date_time_auto_summaryOff">"Utilizar valores proporcionados por la red"</string>
- <string name="date_time_24hour">"Formato de 24 horas"</string>
+ <string name="date_time_24hour">"Utilizar formato de 24 horas"</string>
<string name="date_time_set_time">"Establecer hora"</string>
<string name="date_time_set_timezone">"Seleccionar zona horaria"</string>
<string name="date_time_set_date">"Establecer fecha"</string>
@@ -361,7 +359,7 @@
<string name="sound_effects_enable_title">"Selección sonora"</string>
<string name="sound_effects_enable_summary_on">"Reproducir sonido cuando se realiza una selección de pantalla"</string>
<string name="sound_effects_enable_summary_off">"Reproducir sonido cuando se realiza una selección de pantalla"</string>
- <string name="play_media_notification_sounds_enable_title">"Notificaciones tarjeta SD"</string>
+ <string name="play_media_notification_sounds_enable_title">"Notificaciones de la tarjeta SD"</string>
<string name="play_media_notification_sounds_enable_summary_on">"Inhabilitar sonidos de notificación de la tarjeta SD"</string>
<string name="play_media_notification_sounds_enable_summary_off">"Habilitar sonidos de notificación de la tarjeta SD"</string>
<string name="sync_settings">"Sincronización de datos"</string>
@@ -375,10 +373,10 @@
<string name="accelerometer_summary_off">"Cambiar orientación automáticamente al girar el teléfono"</string>
<string name="brightness">"Brillo"</string>
<string name="brightness_summary">"Ajustar el brillo de la pantalla"</string>
- <string name="screen_timeout">"Tiempo espera pantalla"</string>
+ <string name="screen_timeout">"Tiempo de espera de pantalla"</string>
<string name="screen_timeout_summary">"Ajustar el tiempo de retraso antes de que la pantalla se apague automáticamente"</string>
<string name="sim_lock_settings">"Configuración de bloqueo de tarjeta SIM"</string>
- <string name="sim_lock_settings_category">"Bloqueo de tarjeta SIM"</string>
+ <string name="sim_lock_settings_category">"Configurar bloqueo de tarjeta SIM"</string>
<string name="sim_lock_settings_title">"Bloqueo de tarjeta SIM"</string>
<string name="sim_pin_toggle">"Bloquear tarjeta SIM"</string>
<string name="sim_lock_on">"Solicitar PIN para utilizar el teléfono"</string>
@@ -419,7 +417,7 @@
<string name="status_signal_strength">"Intensidad de la señal"</string>
<string name="status_roaming">"Itinerancia"</string>
<string name="status_operator">"Red"</string>
- <string name="status_wifi_mac_address">"Dirección MAC de Wi-Fi"</string>
+ <string name="status_wifi_mac_address">"Dirección MAC de la red Wi-Fi"</string>
<string name="status_bt_address">"Dirección de Bluetooth"</string>
<string name="status_unavailable">"No disponible"</string>
<string name="status_up_time">"Tiempo de actividad"</string>
@@ -464,7 +462,7 @@
<string name="restore_default_apn">"Restaurando la configuración de APN predeterminada"</string>
<string name="menu_restore">"Restablecer valores predeterminados"</string>
<string name="restore_default_apn_completed">"Restablecimiento de la configuración de APN predeterminada completado"</string>
- <string name="master_clear_title">"Rest. datos de fábrica"</string>
+ <string name="master_clear_title">"Restablecer datos de fábrica"</string>
<string name="master_clear_summary">"Borrar todos los datos del teléfono"</string>
<string name="master_clear_desc">"Esta acción restablecerá el teléfono a su estado de fábrica inicial y borrará todos los datos y todas las aplicaciones descargadas."</string>
<string name="master_clear_button_text">"Reiniciar teléfono"</string>
@@ -485,17 +483,13 @@
<string name="call_settings_summary">"Configurar buzón, llamada en espera, desvío e identificador"</string>
<string name="network_settings_title">"Redes móviles"</string>
<string name="network_settings_summary">"Establecer opciones para itinerancia, redes, APN"</string>
- <string name="location_title">"Mis fuentes de ubicación"</string>
+ <string name="location_title">"Fuentes de Mi Ubicación"</string>
<string name="location_network_based">"Usar redes inalámbricas"</string>
<string name="location_networks_disabled">"Para ver una ubicación en aplicaciones (por ejemplo, Google Maps)"</string>
<string name="location_neighborhood_level">"Ubicación determinada por redes móviles o Wi-Fi"</string>
<string name="location_gps">"Habilitar satélites GPS"</string>
<string name="location_street_level">"Preciso en el nivel de calle (anula la selección para ahorrar batería)"</string>
<string name="location_gps_disabled">"Localizar en nivel de calle (requiere más batería además de la vista aérea)"</string>
- <string name="location_warning_title">"Consentimiento de ubicación"</string>
- <string name="location_warning_message">"Permite que el servicio de ubicación de Google recopile los datos de ubicación anónimos y globales. La recopilación tiene lugar aunque otras aplicaciones estén activas."</string>
- <string name="agree">"Acepto"</string>
- <string name="disagree">"No acepto"</string>
<string name="about_settings">"Acerca del teléfono"</string>
<string name="about_settings_summary">"Ver información legal, estado del teléfono, versión del software"</string>
<string name="legal_information">"Información legal"</string>
@@ -505,7 +499,7 @@
<string name="terms_title">"Términos y condiciones"</string>
<string name="system_tutorial_list_item_title">"Tutorial del sistema"</string>
<string name="system_tutorial_list_item_summary">"Aprende a utilizar tu teléfono"</string>
- <string name="settings_license_activity_title">"Licencias de SW libre"</string>
+ <string name="settings_license_activity_title">"Licencias de software libre"</string>
<string name="settings_license_activity_unavailable">"Se ha producido un problema al intentar cargar las licencias."</string>
<string name="settings_license_activity_loading">"Cargando..."</string>
<string name="lock_settings_title">"Patrón de desbloqueo de pantalla"</string>
@@ -527,8 +521,8 @@
<string name="lockpattern_settings_enable_title">"Patrón obligatorio"</string>
<string name="lockpattern_settings_enable_summary">"Se debe crear un patrón para desbloquear la pantalla."</string>
<string name="lockpattern_settings_enable_visible_pattern_title">"Utilizar patrón visible"</string>
- <string name="lockpattern_settings_enable_tactile_feedback_title">"Comentarios al crear patrón"</string>
- <string name="lockpattern_settings_choose_lock_pattern">"Patrón de desbloqueo"</string>
+ <string name="lockpattern_settings_enable_tactile_feedback_title">"Utilizar comentarios al crear patrón"</string>
+ <string name="lockpattern_settings_choose_lock_pattern">"Establecer patrón de desbloqueo"</string>
<string name="lockpattern_settings_change_lock_pattern">"Cambiar patrón de desbloqueo"</string>
<string name="lockpattern_settings_help_how_to_record">"Cómo crear un patrón de desbloqueo"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts_header">"Se han realizado demasiados intentos incorrectos."</string>
@@ -590,7 +584,7 @@
<string name="language_settings_summary">"Configuración local, opciones de autocorrección e introducción de texto"</string>
<string name="language_category">"Configuración local"</string>
<string name="text_category">"Configuración de texto"</string>
- <string name="phone_language">"Configuración local"</string>
+ <string name="phone_language">"Seleccionar configuración local"</string>
<string name="phone_language_summary">"Seleccionar idioma y región"</string>
<string name="auto_replace">"Corrección automática"</string>
<string name="auto_replace_summary">"Corregir palabras con errores de escritura"</string>
@@ -606,7 +600,7 @@
<string name="user_dict_settings_title">"Diccionario del usuario"</string>
<string name="user_dict_settings_summary">"Añadir y eliminar palabras del diccionario del usuario"</string>
<string name="user_dict_settings_add_menu_title">"Añadir"</string>
- <string name="user_dict_settings_add_dialog_title">"Añadir al diccionario"</string>
+ <string name="user_dict_settings_add_dialog_title">"Añadir al usuario"</string>
<string name="user_dict_settings_edit_dialog_title">"Editar palabra"</string>
<string name="user_dict_settings_context_menu_edit_title">"Editar"</string>
<string name="user_dict_settings_context_menu_delete_title">"Suprimir"</string>
@@ -638,7 +632,7 @@
<string name="enable_adb_summary">"Modo de depuración cuando está conectado el dispositivo USB"</string>
<string name="keep_screen_on">"Pantalla activa"</string>
<string name="keep_screen_on_summary">"La pantalla nunca entra en modo de suspensión durante la carga"</string>
- <string name="allow_mock_location">"Ubicaciones simuladas"</string>
+ <string name="allow_mock_location">"Permitir ubicaciones simuladas"</string>
<string name="allow_mock_location_summary">"Permitir ubicaciones simuladas"</string>
<string name="gadget_picker_title">"Seleccionar gadget"</string>
<string name="widget_picker_title">"Seleccionar widget"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index edf7753..26abe66 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -16,8 +16,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="device_info_default">"Inconnu"</string>
- <string name="turn_on_radio">"Allumer le signal radio"</string>
- <string name="turn_off_radio">"Éteindre le signal radio"</string>
+ <string name="turn_on_radio">"Allumer la radio"</string>
+ <string name="turn_off_radio">"Éteindre la radio"</string>
<string name="turn_on_qxdm">"Activer le journal SD QXDM"</string>
<string name="turn_off_qxdm">"Désactiver le journal QXMD SD"</string>
<string name="radioInfo_menu_viewADN">"Afficher le carnet d\'adresses de la carte SIM"</string>
@@ -31,7 +31,7 @@
<string name="radioInfo_service_in">"Service en cours"</string>
<string name="radioInfo_service_out">"Hors-service"</string>
<string name="radioInfo_service_emergency">"Appels d\'urgence uniquement"</string>
- <string name="radioInfo_service_off">"Signal radio désactivé"</string>
+ <string name="radioInfo_service_off">"Radio désactivée"</string>
<string name="radioInfo_roaming_in">"Itinérance"</string>
<string name="radioInfo_roaming_not">"Sans itinérance"</string>
<string name="radioInfo_phone_idle">"Inactif"</string>
@@ -69,7 +69,7 @@
<string name="battery_info_awake_plugged">"Temps en activité lors du rechargement :"</string>
<string name="battery_info_screen_on">"Écran activé :"</string>
<string name="battery_info_status_unknown">"Inconnu"</string>
- <string name="battery_info_status_charging">"Batterie en charge"</string>
+ <string name="battery_info_status_charging">"Chargement"</string>
<string name="battery_info_status_charging_ac">"(AC)"</string>
<string name="battery_info_status_charging_usb">"(USB)"</string>
<string name="battery_info_status_discharging">"Baisse du niveau de charge"</string>
@@ -88,7 +88,7 @@
<string name="bluetooth_devices">"Appareils Bluetooth"</string>
<string name="bluetooth_device_name">"Nom de l\'appareil"</string>
<string name="bluetooth_name_not_set">"Aucun nom n\'a été défini. Utilisation du nom du compte..."</string>
- <string name="bluetooth_scan_for_devices">"Recherche d\'appareils"</string>
+ <string name="bluetooth_scan_for_devices">"Rechercher d\'appareils"</string>
<string name="bluetooth_disconnect_blank">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> va être déconnecté."</string>
<string name="bluetooth_connected">"Connecté"</string>
<string name="bluetooth_disconnected">"Déconnecté"</string>
@@ -107,8 +107,6 @@
<string name="date_and_time">"Paramètres d\'heure et de date"</string>
<string name="date_time_12_hour_sample">"13:00 h"</string>
<string name="date_time_24_hour_sample">"13:00"</string>
- <string name="date_time_changeTime_text">"Changer l\'heure"</string>
- <string name="date_time_changeDate_text">"Date"</string>
<string name="choose_timezone">"Choisir fuseau horaire"</string>
<string name="display_preview_label">"Aperçu :"</string>
<string name="display_font_size_label">"Taille de police :"</string>
@@ -135,7 +133,7 @@
<string name="radio_info_data_attempts_label">"Tentatives :"</string>
<string name="radio_info_gprs_service_label">"Service GPRS :"</string>
<string name="radio_info_roaming_label">"Itinérance :"</string>
- <string name="radio_info_imei_label">"Code IMEI :"</string>
+ <string name="radio_info_imei_label">"IIEM :"</string>
<string name="radio_info_call_redirect_label">"Redirection des appels :"</string>
<string name="radio_info_ppp_resets_label">"Nombre de réinitialisations PPP depuis le démarrage :"</string>
<string name="radio_info_gsm_disconnects_label">"Déconnexions GSM :"</string>
@@ -146,7 +144,7 @@
<string name="radio_info_signal_strength_label">"Intensité du signal :"</string>
<string name="radio_info_call_status_label">"État de l\'appel :"</string>
<string name="radio_info_ppp_sent_label">"PPP envoyés :"</string>
- <string name="radio_info_radio_resets_label">"Réinitialisations du signal radio :"</string>
+ <string name="radio_info_radio_resets_label">"Réinitialisations de la radio :"</string>
<string name="radio_info_message_waiting_label">"Message en attente :"</string>
<string name="radio_info_phone_number_label">"Numéro de téléphone :"</string>
<string name="radio_info_band_mode_label">"Choisir une bande radio"</string>
@@ -195,7 +193,7 @@
<string name="airplane_mode_turning_on">"Désactivation des connexions sans fil…"</string>
<string name="airplane_mode_turning_off">"Activation des connexions sans fil…"</string>
<string name="radio_controls_title">"Connexions sans fil"</string>
- <string name="radio_controls_summary">"Gérer le Wi-Fi, le mode Bluetooth, le mode Avion et les réseaux mobiles"</string>
+ <string name="radio_controls_summary">"Gérer le Wi-Fi, le mode Bluetooth, le mode avion et les réseaux mobiles"</string>
<string name="date_and_time_settings_title">"Date et heure"</string>
<string name="date_and_time_settings_summary">"Configurer la date, l\'heure, le fuseau horaire et les formats"</string>
<string name="date_time_auto">"Automatique"</string>
@@ -349,7 +347,7 @@
<string name="vibrate_summary">"Activer le vibreur pour les appels entrants"</string>
<string name="notification_sound_title">"Sonnerie de notification"</string>
<string name="notification_sound_summary">"Définir votre sonnerie de notification par défaut"</string>
- <string name="incoming_call_volume_title">"Volume des appels entrants"</string>
+ <string name="incoming_call_volume_title">"Volume de l\'appel entrant"</string>
<string name="notification_volume_title">"Volume des notifications"</string>
<string name="checkbox_notification_same_as_incoming_call">"Utiliser le volume des appels entrants pour les notifications"</string>
<string name="notification_sound_dialog_title">"Sélectionner une sonnerie de notification"</string>
@@ -405,11 +403,11 @@
<string name="model_number">"Numéro du modèle"</string>
<string name="baseband_version">"Version de bande de base"</string>
<string name="kernel_version">"Version du noyau"</string>
- <string name="build_number">"Numéro de build"</string>
+ <string name="build_number">"Numéro de version"</string>
<string name="device_info_not_available">"Non disponible"</string>
<string name="device_status_activity_title">"État"</string>
<string name="device_status">"État"</string>
- <string name="device_status_summary">"Code IMEI, numéro de téléphone, signal, etc."</string>
+ <string name="device_status_summary">"IIEM, numéro de téléphone, signal, etc."</string>
<string name="storage_settings_title">"Carte SD et mémoire"</string>
<string name="storage_settings_summary">"Retirer la carte SD, afficher la mémoire disponible"</string>
<string name="status_number">"Numéro de téléphone"</string>
@@ -470,8 +468,8 @@
<string name="master_clear_button_text">"Réinitialiser le téléphone"</string>
<string name="master_clear_final_desc">"Réinitialiser le téléphone et effacer toutes les données et applications ? Cette action ne peut être inversée."</string>
<string name="master_clear_final_button_text">"Tout effacer"</string>
- <string name="master_clear_gesture_prompt">"Saisissez votre schéma de déverrouillage"</string>
- <string name="master_clear_gesture_explanation">"Vous devez dessiner votre schéma de déverrouillage pour confirmer la réinitialisation du téléphone."</string>
+ <string name="master_clear_gesture_prompt">"Saisissez votre motif de déverrouillage"</string>
+ <string name="master_clear_gesture_explanation">"Vous devez dessiner votre motif de déverrouillage pour confirmer la réinitialisation du téléphone."</string>
<string name="master_clear_failed">"Les données n\'ont pas été réinitialisées car le service de nettoyage du système n\'est pas disponible."</string>
<string name="media_format_title">"Formater la carte SD."</string>
<string name="media_format_summary">"Permet d\'effacer toutes les données de la carte SD"</string>
@@ -482,20 +480,16 @@
<string name="media_format_gesture_prompt">"Créez votre schéma de déverrouillage"</string>
<string name="media_format_gesture_explanation">"Vous devez créer votre schéma de déverrouillage pour confirmer le format de la carte SD."</string>
<string name="call_settings_title">"Paramètres d\'appel"</string>
- <string name="call_settings_summary">"Configurer mess. vocale, transferts d\'appel, mises en attente, numéro de l\'appelant"</string>
+ <string name="call_settings_summary">"Configurer mess. vocale, transferts d\'appel, mises en attente, ID d\'appelant"</string>
<string name="network_settings_title">"Réseaux mobiles"</string>
<string name="network_settings_summary">"Définir les options d\'itinérance, réseaux, noms de points d\'accès"</string>
- <string name="location_title">"Mes sources de positionnement"</string>
+ <string name="location_title">"Sources pour Ma position"</string>
<string name="location_network_based">"Utiliser réseaux sans fil"</string>
<string name="location_networks_disabled">"Afficher position dans les applications (comme Google Maps)"</string>
<string name="location_neighborhood_level">"Position géographique déterminée par réseaux Wi-Fi et/ou mobile"</string>
<string name="location_gps">"Activer les satellites GPS"</string>
<string name="location_street_level">"Localisation précise au niveau de la rue lors du positionnement géographique (désélectionner pour économiser la batterie)"</string>
<string name="location_gps_disabled">"Localiser au niveau rue (requiert + de batterie et une vue dégagée)"</string>
- <string name="location_warning_title">"Votre lieu va être enregistré."</string>
- <string name="location_warning_message">"Autoriser le service de positionnement géographique de Google à collecter des données de lieu ne permettant pas de vous identifier personnellement. Les données seront collectées, quelles que soient les applications activées."</string>
- <string name="agree">"Accepter"</string>
- <string name="disagree">"Refuser"</string>
<string name="about_settings">"À propos du téléphone"</string>
<string name="about_settings_summary">"Informations légales, état du téléphone et version du logiciel"</string>
<string name="legal_information">"Informations légales"</string>
@@ -503,42 +497,42 @@
<string name="copyright_title">"Copyright"</string>
<string name="license_title">"Licence"</string>
<string name="terms_title">"Conditions d\'utilisation"</string>
- <string name="system_tutorial_list_item_title">"Didacticiel système"</string>
+ <string name="system_tutorial_list_item_title">"Didacticiel relatif au système"</string>
<string name="system_tutorial_list_item_summary">"Comment utiliser votre téléphone ?"</string>
<string name="settings_license_activity_title">"Licences open source"</string>
<string name="settings_license_activity_unavailable">"Un problème est survenu lors du chargement des licences."</string>
<string name="settings_license_activity_loading">"Chargement..."</string>
- <string name="lock_settings_title">"Schéma de déverrouillage de l\'écran"</string>
- <string name="lockpattern_change_lock_pattern_label">"Modifier le schéma de déverrouillage"</string>
- <string name="lockpattern_need_to_unlock">"Confirmer le schéma enregistré"</string>
+ <string name="lock_settings_title">"Motif de déverrouillage de l\'écran"</string>
+ <string name="lockpattern_change_lock_pattern_label">"Modifier le motif de déverrouillage"</string>
+ <string name="lockpattern_need_to_unlock">"Confirmer le motif enregistré"</string>
<string name="lockpattern_need_to_unlock_wrong">"Désolé. Merci de réessayer :"</string>
- <string name="lockpattern_recording_intro_header">"Dessiner un schéma de déverrouillage :"</string>
+ <string name="lockpattern_recording_intro_header">"Dessiner un motif de déverrouillage :"</string>
<string name="lockpattern_recording_intro_footer">"Appuyer sur Menu pour obtenir de l\'aide."</string>
<string name="lockpattern_recording_inprogress">"Ôtez le doigt lorsque vous avez terminé."</string>
<string name="lockpattern_recording_incorrect_too_short">"Reliez au moins <xliff:g id="NUMBER">%d</xliff:g> points. Veuillez réessayer :"</string>
- <string name="lockpattern_pattern_entered_header">"Schéma enregistré !"</string>
- <string name="lockpattern_need_to_confirm">"Redessinez le schéma pour confirmer :"</string>
- <string name="lockpattern_pattern_confirmed_header">"Votre nouveau schéma de déverrouillage :"</string>
+ <string name="lockpattern_pattern_entered_header">"Motif enregistré !"</string>
+ <string name="lockpattern_need_to_confirm">"Redessinez le motif pour confirmer :"</string>
+ <string name="lockpattern_pattern_confirmed_header">"Votre nouveau motif de déverrouillage :"</string>
<string name="lockpattern_confirm_button_text">"Confirmer"</string>
<string name="lockpattern_restart_button_text">"Redessiner"</string>
<string name="lockpattern_retry_button_text">"Réessayer"</string>
<string name="lockpattern_continue_button_text">"Continuer"</string>
- <string name="lockpattern_settings_title">"Schéma de déverrouillage"</string>
- <string name="lockpattern_settings_enable_title">"Demander un schéma"</string>
- <string name="lockpattern_settings_enable_summary">"Vous devez dessiner le schéma pour déverrouiller l\'écran."</string>
- <string name="lockpattern_settings_enable_visible_pattern_title">"Utiliser un schéma visible"</string>
+ <string name="lockpattern_settings_title">"Motif de déverrouillage"</string>
+ <string name="lockpattern_settings_enable_title">"Demander un motif"</string>
+ <string name="lockpattern_settings_enable_summary">"Vous devez dessiner le motif pour déverrouiller l\'écran."</string>
+ <string name="lockpattern_settings_enable_visible_pattern_title">"Utiliser un motif visible"</string>
<string name="lockpattern_settings_enable_tactile_feedback_title">"Commentaires tactiles"</string>
- <string name="lockpattern_settings_choose_lock_pattern">"Créer un schéma de déverrouillage"</string>
- <string name="lockpattern_settings_change_lock_pattern">"Modifier le schéma de déverrouillage"</string>
- <string name="lockpattern_settings_help_how_to_record">"Comment dessiner un schéma de déverrouillage :"</string>
+ <string name="lockpattern_settings_choose_lock_pattern">"Créer un motif de déverrouillage"</string>
+ <string name="lockpattern_settings_change_lock_pattern">"Modifier le motif de déverrouillage"</string>
+ <string name="lockpattern_settings_help_how_to_record">"Comment dessiner un motif de déverrouillage :"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts_header">"Trop de tentatives échouées !"</string>
<string name="lockpattern_too_many_failed_confirmation_attempts_footer">"Réessayer dans <xliff:g id="NUMBER">%d</xliff:g> secondes."</string>
<string name="skip_button_label">"Annuler"</string>
<string name="next_button_label">"Suivant"</string>
<string name="lock_title">"Sécurisation de votre téléphone"</string>
- <string name="lock_intro_message"><font size="17">"Protégez votre téléphone contre toute utilisation non autorisée en créant un schéma personnel de déverrouillage de l\'écran."\n<font height="17">\n</font><b>"1"</b>" L\'écran suivant vous présente un exemple de schéma "\n<font height="17">\n</font><b>"2"</b>" Lorsque vous êtes prêt, dessinez votre propre schéma de déverrouillage. Essayez différents schémas, mais reliez au moins quatre points."\n<font height="17">\n</font><b></b>"Reproduisez votre schéma pour confirmer."\n<font height="17">\n</font><b>"Pour commencer, sélectionnez \"Suivant\"."</b>\n<font height="3">\n</font>"Si vous ne souhaitez pas activer cette protection, sélectionnez \"Annuler\"."</font></string>
- <string name="lock_example_title">"Exemple de schéma"</string>
- <string name="lock_example_message">"Reliez au moins quatre points."\n" "\n"Sélectionnez \"Suivant\" pour créer votre propre schéma."</string>
+ <string name="lock_intro_message"><font size="17">"Protégez votre téléphone contre toute utilisation non autorisée en créant un motif personnel de déverrouillage de l\'écran."\n<font height="17">\n</font><b>"1"</b>" L\'écran suivant vous présente un exemple de motif. "\n<font height="17">\n</font><b>"2"</b>" Lorsque vous êtes prêt, dessinez votre propre motif de déverrouillage. Essayez différents motifs, mais reliez au moins quatre points."\n<font height="17">\n</font>"Reproduisez votre motif pour confirmer."\n<font height="17">\n</font><b>"Pour commencer, sélectionnez \"Suivant\"."</b>\n<font height="3">\n</font>"Si vous ne souhaitez pas activer cette protection, sélectionnez \"Annuler\"."</font></string>
+ <string name="lock_example_title">"Exemple de motif"</string>
+ <string name="lock_example_message">"Reliez au moins quatre points."\n" "\n"Sélectionnez \"Suivant\" lorsque vous voulez créer votre propre motif."</string>
<string name="manageapplications_settings_title">"Gérer les applications"</string>
<string name="manageapplications_settings_summary">"Gérer et supprimer les applications installées"</string>
<string name="applications_settings">"Applications"</string>
@@ -594,7 +588,7 @@
<string name="phone_language_summary">"Sélectionner la langue et le pays"</string>
<string name="auto_replace">"Remplacement auto"</string>
<string name="auto_replace_summary">"Corriger les mots mal saisis"</string>
- <string name="auto_caps">"Majuscules auto"</string>
+ <string name="auto_caps">"Majuscules automatiques"</string>
<string name="auto_caps_summary">"Mettre une majuscule en début de phrase"</string>
<string name="auto_punctuate">"Ponctuation automatique"</string>
<string name="hardkeyboard_category">"Paramètres du clavier physique"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index b7c41bb..24a7972 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -107,8 +107,6 @@
<string name="date_and_time">"Impostazioni data e ora"</string>
<string name="date_time_12_hour_sample">"1:00 pm"</string>
<string name="date_time_24_hour_sample">"13:00"</string>
- <string name="date_time_changeTime_text">"Modifica ora"</string>
- <string name="date_time_changeDate_text">"Data"</string>
<string name="choose_timezone">"Seleziona fuso orario"</string>
<string name="display_preview_label">"Anteprima:"</string>
<string name="display_font_size_label">"Dimensioni carattere:"</string>
@@ -371,8 +369,8 @@
<string name="animations_summary_on">"Mostra l\'animazione durante l\'apertura e la chiusura di finestre"</string>
<string name="animations_summary_off">"Mostra l\'animazione durante l\'apertura e la chiusura di finestre"</string>
<string name="accelerometer_title">"Orientamento"</string>
- <string name="accelerometer_summary_on">"Cambia automaticamente quando il cellulare viene ruotato"</string>
- <string name="accelerometer_summary_off">"Cambia automatic. l\'orientamento quando il cell. viene ruotato"</string>
+ <string name="accelerometer_summary_on">"Cambia automaticamente l\'orientamento quando il cellulare viene ruotato"</string>
+ <string name="accelerometer_summary_off">"Cambia automaticamente l\'orientamento quando il cellulare viene ruotato"</string>
<string name="brightness">"Luminosità"</string>
<string name="brightness_summary">"Regola la luminosità dello schermo"</string>
<string name="screen_timeout">"Timeout schermo"</string>
@@ -492,10 +490,6 @@
<string name="location_gps">"Attiva satelliti GPS"</string>
<string name="location_street_level">"Accuratezza a livello stradale (deseleziona per risparmiare batteria)"</string>
<string name="location_gps_disabled">"Localizza a livello stradale (richiede più batteria e la vista del cielo)"</string>
- <string name="location_warning_title">"Consenso alla localizzazione"</string>
- <string name="location_warning_message">"Consenti al servizio di localizzazione di Google di raccogliere dati anonimi e aggregati sulla posizione. La raccolta dei dati verrà effettuata a prescindere dal fatto che ci siano o meno applicazioni attive."</string>
- <string name="agree">"Accetto"</string>
- <string name="disagree">"Non accetto"</string>
<string name="about_settings">"Info sul telefono"</string>
<string name="about_settings_summary">"Visualizza informazioni legali, stato del telefono, versione del software"</string>
<string name="legal_information">"Informazioni legali"</string>
@@ -503,7 +497,7 @@
<string name="copyright_title">"Copyright"</string>
<string name="license_title">"Licenza"</string>
<string name="terms_title">"Termini e condizioni"</string>
- <string name="system_tutorial_list_item_title">"Esercitazione"</string>
+ <string name="system_tutorial_list_item_title">"Esercitazione sul sistema"</string>
<string name="system_tutorial_list_item_summary">"Impara a utilizzare il tuo cellulare"</string>
<string name="settings_license_activity_title">"Licenze open source"</string>
<string name="settings_license_activity_unavailable">"Errore durante il caricamento delle licenze."</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index f793a67..b94265f 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -107,10 +107,6 @@
<string name="date_and_time">"日付形式"</string>
<string name="date_time_12_hour_sample">"1:00 PM"</string>
<string name="date_time_24_hour_sample">"13:00"</string>
- <!-- no translation found for date_time_changeTime_text (7037437020000867740) -->
- <skip />
- <!-- no translation found for date_time_changeDate_text (5259762626498028057) -->
- <skip />
<string name="choose_timezone">"タイムゾーンの選択"</string>
<string name="display_preview_label">"プレビュー:"</string>
<string name="display_font_size_label">"フォントサイズ:"</string>
@@ -296,7 +292,7 @@
<string name="wifi_add_other_network">"Wi-Fiネットワークを追加"</string>
<string name="wifi_notify_open_networks">"ネットワークの通知"</string>
<string name="wifi_notify_open_networks_summary">"オープンネットワークが利用可能なときに通知する"</string>
- <string name="wifi_password_incorrect_error">"ネットワークキーまたはパスワードが正しくありません。入力し直してください。"</string>
+ <string name="wifi_password_incorrect_error">"入力したネットワークパスワードは正しくありません。再入力してください。"</string>
<string name="wifi_generic_connection_error">"ネットワーク接続に問題があります。やり直してください。"</string>
<string name="wifi_menu_advanced">"詳細設定"</string>
<string name="wifi_ip_settings_titlebar">"IP設定"</string>
@@ -494,10 +490,6 @@
<string name="location_gps">"GPS機能をONにする"</string>
<string name="location_street_level">"高精度測位(電池の消費を節約する場合はOFFにしてください)"</string>
<string name="location_gps_disabled">"高精度測位(電池消費増、電波が良好な場所で使用)"</string>
- <string name="location_warning_title">"位置情報についての同意"</string>
- <string name="location_warning_message">"Googleの位置情報サービスによる匿名化された位置データの収集および集計を許可します。データ収集はアプリケーション起動の有無にかかわらず行われます。"</string>
- <string name="agree">"同意する"</string>
- <string name="disagree">"同意しない"</string>
<string name="about_settings">"端末情報"</string>
<string name="about_settings_summary">"端末情報、規約、バージョン情報"</string>
<string name="legal_information">"法的情報"</string>
@@ -595,9 +587,9 @@
<string name="phone_language">"地域/言語を選択"</string>
<string name="phone_language_summary">"言語と地域の選択"</string>
<string name="auto_replace">"自動修正"</string>
- <string name="auto_replace_summary">"入力間違いを自動修正する"</string>
+ <string name="auto_replace_summary">"入力ミスを自動修正する"</string>
<string name="auto_caps">"自動大文字変換"</string>
- <string name="auto_caps_summary">"英字入力で文頭文字を大文字にする"</string>
+ <string name="auto_caps_summary">"先頭文字を大文字に変換する"</string>
<string name="auto_punctuate">"ピリオド自動挿入"</string>
<string name="hardkeyboard_category">"キーボードの設定"</string>
<string name="auto_punctuate_summary">"英語: Spaceキー2回でピリオド(.)を挿入"</string>
@@ -606,13 +598,13 @@
<string name="ime_security_warning">"この入力方法では入力したすべてのテキストの収集を許可します。収集されるテキストには個人情報データやクレジットカード番号などが含まれます。これはアプリケーション<xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>によるものです。この入力方法を有効にしますか?"</string>
<string name="user_dict_settings_titlebar">"ユーザー辞書"</string>
<string name="user_dict_settings_title">"ユーザー辞書"</string>
- <string name="user_dict_settings_summary">"ユーザー辞書に単語を登録/削除する"</string>
+ <string name="user_dict_settings_summary">"ユーザー辞書への語句の追加と削除"</string>
<string name="user_dict_settings_add_menu_title">"追加"</string>
<string name="user_dict_settings_add_dialog_title">"辞書に追加"</string>
<string name="user_dict_settings_edit_dialog_title">"語句の編集"</string>
<string name="user_dict_settings_context_menu_edit_title">"編集"</string>
<string name="user_dict_settings_context_menu_delete_title">"削除"</string>
- <string name="user_dict_settings_empty_text">"ユーザー辞書に登録がありません。MENUから単語を登録してください。"</string>
+ <string name="user_dict_settings_empty_text">"ユーザー辞書に何も登録されていません。語句はメニューから登録できます。"</string>
<string name="testing">"テスト中"</string>
<string name="testing_phone_info">"携帯電話情報"</string>
<string name="testing_battery_info">"電池情報"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 93194fa..f813462 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -107,10 +107,6 @@
<string name="date_and_time">"날짜 및 시간 설정"</string>
<string name="date_time_12_hour_sample">"1:00 pm"</string>
<string name="date_time_24_hour_sample">"13:00"</string>
- <!-- no translation found for date_time_changeTime_text (7037437020000867740) -->
- <skip />
- <!-- no translation found for date_time_changeDate_text (5259762626498028057) -->
- <skip />
<string name="choose_timezone">"표준시간대 선택"</string>
<string name="display_preview_label">"미리보기:"</string>
<string name="display_font_size_label">"글꼴 크기:"</string>
@@ -494,10 +490,6 @@
<string name="location_gps">"GPS 위성 사용"</string>
<string name="location_street_level">"도로 수준으로 정확하게 탐색(배터리를 절약하려면 선택 취소)"</string>
<string name="location_gps_disabled">"도로 수준으로 탐색(항공사진이 더해져 배터리 추가로 필요)"</string>
- <string name="location_warning_title">"위치 정보 수집에 동의"</string>
- <string name="location_warning_message">"Google의 위치 서비스가 익명의 위치 데이터를 광범위하게 수집합니다. 사용 중인 응용프로그램에 관계 없이 정보가 수집됩니다."</string>
- <string name="agree">"동의"</string>
- <string name="disagree">"동의하지 않음"</string>
<string name="about_settings">"전화기 정보"</string>
<string name="about_settings_summary">"법률 정보, 전화기 상태, 소프트웨어 버전 보기"</string>
<string name="legal_information">"법률정보"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 60e2620..af7bb4c 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -107,10 +107,6 @@
<string name="date_and_time">"Innstillinger for dato og tid"</string>
<string name="date_time_12_hour_sample">"1:00 pm"</string>
<string name="date_time_24_hour_sample">"13:00"</string>
- <!-- no translation found for date_time_changeTime_text (7037437020000867740) -->
- <skip />
- <!-- no translation found for date_time_changeDate_text (5259762626498028057) -->
- <skip />
<string name="choose_timezone">"Velg tidssone"</string>
<string name="display_preview_label">"Forhåndsvisning:"</string>
<string name="display_font_size_label">"Skriftstørrelse:"</string>
@@ -342,7 +338,8 @@
<string name="sound_and_display_settings_summary">"Ringetoner, varsling, lysstyrke"</string>
<string name="silent_mode_title">"Stillemodus"</string>
<string name="silent_mode_summary">"Slå av alle lyder unntatt media og alarmer"</string>
- <string name="silent_mode_incl_alarm_summary">"Alle lyder unntatt media og alarmer er slått av"</string>
+ <!-- no translation found for silent_mode_incl_alarm_summary (2088830834182228458) -->
+ <skip />
<string name="ringtone_title">"Ringetone"</string>
<string name="ringtone_summary">"Standard ringetone for innkommende anrop"</string>
<string name="ring_volume_title">"Ringevolum"</string>
@@ -370,8 +367,10 @@
<string name="sync_settings_summary">"Applikasjoner som skal synkroniseres"</string>
<string name="display_settings">"Skjerminnstillinger"</string>
<string name="animations_title">"Animasjon"</string>
- <string name="animations_summary_on">"Vis animasjon under åpning og lukking av vinduer"</string>
- <string name="animations_summary_off">"Vis animasjon under åpning og lukking av vinduer"</string>
+ <!-- no translation found for animations_summary_on (8843613112130484436) -->
+ <skip />
+ <!-- no translation found for animations_summary_off (2777026828025551983) -->
+ <skip />
<string name="accelerometer_title">"Orientering"</string>
<string name="accelerometer_summary_on">"Bytt orientering automatisk når telefonen blir snudd"</string>
<string name="accelerometer_summary_off">"Bytt orientering automatisk når telefonen blir snudd"</string>
@@ -494,14 +493,6 @@
<string name="location_gps">"Bruk GPS-satellitter"</string>
<string name="location_street_level">"Nøyaktig til gatenivå (slå av for å spare batteri)"</string>
<string name="location_gps_disabled">"Finn plassering på gatenivå (bruker mer batteri, og trenger fri sikt til himmelen)"</string>
- <!-- no translation found for location_warning_title (788624242969337259) -->
- <skip />
- <!-- no translation found for location_warning_message (2455390825908728808) -->
- <skip />
- <!-- no translation found for agree (6288718671527758326) -->
- <skip />
- <!-- no translation found for disagree (6221069272309799230) -->
- <skip />
<string name="about_settings">"Om telefonen"</string>
<string name="about_settings_summary">"Vis juridisk informasjon, telefonstatus, programvareversjon"</string>
<string name="legal_information">"Juridisk informasjon"</string>
@@ -509,8 +500,10 @@
<string name="copyright_title">"Opphavsrett"</string>
<string name="license_title">"Lisens"</string>
<string name="terms_title">"Betingelser"</string>
- <string name="system_tutorial_list_item_title">"Systemguide"</string>
- <string name="system_tutorial_list_item_summary">"Lær å bruke telefonen"</string>
+ <!-- no translation found for system_tutorial_list_item_title (4315834755909579018) -->
+ <skip />
+ <!-- no translation found for system_tutorial_list_item_summary (3861815254521030201) -->
+ <skip />
<string name="settings_license_activity_title">"Åpen kildekode-lisenser"</string>
<string name="settings_license_activity_unavailable">"Kunne ikke hente lisensene."</string>
<string name="settings_license_activity_loading">"henter…"</string>
@@ -607,7 +600,8 @@
<string name="auto_punctuate_summary">"Trykk mellomromstasten to ganger for å skrive punktum"</string>
<string name="show_password">"Synlige passord"</string>
<string name="show_password_summary">"Vis passord mens de skrives inn"</string>
- <string name="ime_security_warning">"Inndatametoden har mulighet til å samle inn all tekst du skriver, inkludert personlige data som passord og kredittkortnummer. Den kommer fra applikasjonen <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Aktiver inndatametoden?"</string>
+ <!-- no translation found for ime_security_warning (3458652708716006477) -->
+ <skip />
<string name="user_dict_settings_titlebar">"Ordliste"</string>
<string name="user_dict_settings_title">"Ordliste"</string>
<string name="user_dict_settings_summary">"Legg til og fjern ord fra ordlisten"</string>
@@ -634,7 +628,8 @@
<string name="quick_launch_display_mode_shortcuts">"Snarveier"</string>
<string name="input_methods_settings_title">"Skriving av tekst"</string>
<string name="input_methods_settings_summary">"Innstillinger for skriving av tekst"</string>
- <string name="input_methods_settings_label_format">"Innstillinger for <xliff:g id="IME_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for input_methods_settings_label_format (6002887604815693322) -->
+ <skip />
<string name="onscreen_keyboard_settings_summary">"Innstillinger for skjermtastatur"</string>
<string name="builtin_keyboard_settings_title">"Enhetstastatur"</string>
<string name="builtin_keyboard_settings_summary">"Innstillinger for innebygget tastatur"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index a89c8a9..3a3e40a 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -107,8 +107,6 @@
<string name="date_and_time">"Datum- en tijdinstellingen"</string>
<string name="date_time_12_hour_sample">"13:00 uur"</string>
<string name="date_time_24_hour_sample">"01:00:00 PM"</string>
- <string name="date_time_changeTime_text">"Tijd wijzigen"</string>
- <string name="date_time_changeDate_text">"datum"</string>
<string name="choose_timezone">"Tijdzone selecteren"</string>
<string name="display_preview_label">"Voorbeeld:"</string>
<string name="display_font_size_label">"Lettergrootte:"</string>
@@ -209,7 +207,7 @@
<string name="zone_list_menu_sort_alphabetically">"Alfabetisch sorteren"</string>
<string name="zone_list_menu_sort_by_timezone">"Sorteren op tijdzone"</string>
<string name="security_settings_title">"Beveiliging en locatie"</string>
- <string name="security_settings_summary">"Mijn locatie instellen, scherm ontgrendelen en SIM-kaart vergrendelen"</string>
+ <string name="security_settings_summary">"\'Mijn locatie\' instellen, scherm ontgrendelen en SIM-kaart vergrendelen"</string>
<string name="security_passwords_title">"Wachtwoorden"</string>
<string name="bluetooth_quick_toggle_title">"Bluetooth"</string>
<string name="bluetooth_quick_toggle_summary">"Bluetooth inschakelen"</string>
@@ -355,7 +353,7 @@
<string name="notification_sound_dialog_title">"Beltoon voor meldingen selecteren"</string>
<string name="media_volume_title">"Mediavolume"</string>
<string name="media_volume_summary">"Volume voor muziek en video\'s instellen"</string>
- <string name="dtmf_tone_enable_title">"Aanraaktonen"</string>
+ <string name="dtmf_tone_enable_title">"Hoorbare aanraaktonen"</string>
<string name="dtmf_tone_enable_summary_on">"Tonen afspelen bij gebruik van toetsenblok"</string>
<string name="dtmf_tone_enable_summary_off">"Tonen afspelen bij gebruik van toetsenblok"</string>
<string name="sound_effects_enable_title">"Hoorbare selectie"</string>
@@ -490,12 +488,8 @@
<string name="location_networks_disabled">"Locatie in toepassingen (zoals Maps) bekijken via draadloze netwerken"</string>
<string name="location_neighborhood_level">"Locatie bepaald door Wi-Fi en/of mobiele netwerken"</string>
<string name="location_gps">"GPS-satellieten inschakelen"</string>
- <string name="location_street_level">"Locatie tot op straatniveau (uit om acculading te sparen)"</string>
- <string name="location_gps_disabled">"Locatie bepalen tot op straatniveau (meer stroom nodig en luchtweergave)"</string>
- <string name="location_warning_title">"Locatietoestemming"</string>
- <string name="location_warning_message">"Toestaan dat de locatieservice van Google anonieme, getotaliseerde locatiegegevens verzamelt. De gegevens worden verzameld, ongeacht of er toepassingen actief zijn."</string>
- <string name="agree">"Akkoord"</string>
- <string name="disagree">"Niet akkoord"</string>
+ <string name="location_street_level">"Bij locatie bepalen nauwkeurig tot op straatniveau (deselecteren om acculading te sparen)"</string>
+ <string name="location_gps_disabled">"Locatie bepalen tot op straatniveau (meer stroom nodig en weergave van lucht)"</string>
<string name="about_settings">"Over de telefoon"</string>
<string name="about_settings_summary">"Juridische info, telefoonstatus, softwareversie weergeven"</string>
<string name="legal_information">"Juridische informatie"</string>
@@ -503,7 +497,7 @@
<string name="copyright_title">"Auteursrecht"</string>
<string name="license_title">"Licentie"</string>
<string name="terms_title">"Algemene voorwaarden"</string>
- <string name="system_tutorial_list_item_title">"Systeemhandleiding"</string>
+ <string name="system_tutorial_list_item_title">"Systeemzelfstudie"</string>
<string name="system_tutorial_list_item_summary">"Meer informatie over het gebruik van uw telefoon"</string>
<string name="settings_license_activity_title">"Open-sourcelicenties"</string>
<string name="settings_license_activity_unavailable">"Er is een probleem bij het laden van de licenties."</string>
@@ -536,7 +530,7 @@
<string name="skip_button_label">"Annuleren"</string>
<string name="next_button_label">"Volgende"</string>
<string name="lock_title">"Uw telefoon beveiligen"</string>
- <string name="lock_intro_message"><font size="17">"Beveilig uw telefoon tegen ongeoorloofd gebruik door het instellen van een persoonlijk schermontgrendelingspatroon. "\n<font height="17">\n</font><b>"1"</b>" Op het volgende scherm ziet u hoe een voorbeeldpatroon wordt getekend. "\n<font height="17">\n</font><b>"2"</b>" Teken uw eigen persoonlijke ontgrendelingspatroon als het voorbeeld is voltooid. U kunt verschillende patronen uitproberen, maar u moet minimaal vier punten met elkaar verbinden. "\n<font height="17">\n</font><b>"3"</b>" Teken uw patroon nogmaals ter bevestiging. "\n<font height="17">\n</font><b>"Bent u er klaar voor? Selecteer \'Volgende\'"</b>". "\n<font height="3">\n</font>"Als u uw telefoon niet wilt beveiligen, selecteert u \'Annuleren\'."</font></string>
+ <string name="lock_intro_message"><font size="17">"Beveilig uw telefoon tegen ongeoorloofd gebruik door het instellen van een persoonlijk schermontgrendelingspatroon. "\n<font height="17">\n</font><b>"1"</b>" Op het volgende scherm ziet u hoe een voorbeeldpatroon wordt getekend. "\n<font height="17">\n</font><b>"2"</b>" Teken uw eigen persoonlijke deblokkeringspatroon als het voorbeeld is voltooid. U kunt verschillende patronen uitproberen, maar u moet minimaal vier punten met elkaar verbinden. "\n<font height="17">\n</font><b>"3"</b>" Teken uw patroon nogmaals ter bevestiging. "\n<font height="17">\n</font><b>"Bent u er klaar voor? Selecteer \'Volgende\'"</b>". "\n<font height="3">\n</font>"Als u uw telefoon niet wilt beveiligen, selecteert u \'Annuleren\'."</font></string>
<string name="lock_example_title">"Voorbeeldpatroon"</string>
<string name="lock_example_message">"Verbind minimaal vier punten. "\n" "\n"Selecteer \'Volgende\' als u klaar bent om uw eigen patroon te tekenen."</string>
<string name="manageapplications_settings_title">"Toepassingen beheren"</string>
@@ -598,13 +592,13 @@
<string name="auto_caps_summary">"Eerste letters in zinnen met hoofdletter"</string>
<string name="auto_punctuate">"Automatische interpunctie"</string>
<string name="hardkeyboard_category">"Instellingen voor vast toetsenbord"</string>
- <string name="auto_punctuate_summary">"Druk twee keer op de spatiebalk om een punt (.) in te voegen"</string>
+ <string name="auto_punctuate_summary">"Druk twee keer op de spatiebalk om \'.\' in te voegen"</string>
<string name="show_password">"Zichtbare wachtwoorden"</string>
<string name="show_password_summary">"Wachtwoord weergeven tijdens het typen"</string>
<string name="ime_security_warning">"Deze invoermethode verzamelt mogelijk alle tekst die u typt, inclusief persoonlijke gegevens zoals wachtwoorden en creditcardnummers. De methode is afkomstig uit de toepassing <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Deze invoermethode inschakelen?"</string>
<string name="user_dict_settings_titlebar">"Gebruikerswoordenboek"</string>
<string name="user_dict_settings_title">"Gebruikerswoordenboek"</string>
- <string name="user_dict_settings_summary">"Woorden toevoegen en verwijderen"</string>
+ <string name="user_dict_settings_summary">"Woorden toevoegen aan en verwijderen uit gebruikerswoordenboek"</string>
<string name="user_dict_settings_add_menu_title">"Toevoegen"</string>
<string name="user_dict_settings_add_dialog_title">"Toevoegen aan woordenboek"</string>
<string name="user_dict_settings_edit_dialog_title">"Woord bewerken"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 83c18cb..ba3ed98 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -107,8 +107,6 @@
<string name="date_and_time">"Ustawienia daty i czasu"</string>
<string name="date_time_12_hour_sample">"1:00 (po południu)"</string>
<string name="date_time_24_hour_sample">"13:00"</string>
- <string name="date_time_changeTime_text">"Zmień godzinę"</string>
- <string name="date_time_changeDate_text">"Data"</string>
<string name="choose_timezone">"Wybierz strefę czasową"</string>
<string name="display_preview_label">"Podgląd:"</string>
<string name="display_font_size_label">"Rozmiar czcionki:"</string>
@@ -199,8 +197,8 @@
<string name="date_and_time_settings_title">"Data i czas"</string>
<string name="date_and_time_settings_summary">"Ustaw format daty, czasu i strefę czasową"</string>
<string name="date_time_auto">"Automatycznie"</string>
- <string name="date_time_auto_summaryOn">"Używaj wartości dostarczonych przez sieć"</string>
- <string name="date_time_auto_summaryOff">"Używaj informacji dostarczonych przez operatora"</string>
+ <string name="date_time_auto_summaryOn">"Skorzystaj z wartości dostarczonych przez sieć"</string>
+ <string name="date_time_auto_summaryOff">"Skorzystaj z informacji dostarczonych przez operatora"</string>
<string name="date_time_24hour">"Format 24-godzinny"</string>
<string name="date_time_set_time">"Ustaw czas"</string>
<string name="date_time_set_timezone">"Wybierz strefę czasową"</string>
@@ -292,7 +290,7 @@
<string name="wifi_save_config">"Zapisz"</string>
<string name="wifi_password_unchanged">"(niezmienione)"</string>
<string name="wifi_add_other_network">"Dodaj sieć Wi-Fi"</string>
- <string name="wifi_notify_open_networks">"Powiadomienie o sieci"</string>
+ <string name="wifi_notify_open_networks">"Powiadomienie sieciowe"</string>
<string name="wifi_notify_open_networks_summary">"Powiadom mnie, gdy będę w zasięgu otwartej sieci"</string>
<string name="wifi_password_incorrect_error">"Wprowadzone hasło sieci jest nieprawidłowe. Spróbuj ponownie."</string>
<string name="wifi_generic_connection_error">"Wystąpił problem podczas łączenia z siecią. Spróbuj ponownie."</string>
@@ -403,9 +401,9 @@
<string name="system_update_settings_list_item_summary">"Sprawdź aktualizacje systemu"</string>
<string name="firmware_version">"Wersja oprogramowania"</string>
<string name="model_number">"Numer modelu"</string>
- <string name="baseband_version">"Wersja pasma podstawowego"</string>
+ <string name="baseband_version">"Pasmo podstawowe"</string>
<string name="kernel_version">"Wersja jądra"</string>
- <string name="build_number">"Numer kompilacji"</string>
+ <string name="build_number">"Numer wersji"</string>
<string name="device_info_not_available">"Niedostępna"</string>
<string name="device_status_activity_title">"Informacje o telefonie"</string>
<string name="device_status">"Informacje o telefonie"</string>
@@ -427,9 +425,9 @@
<string name="internal_memory">"Pamięć wewnętrzna telefonu"</string>
<string name="sd_memory">"Karta SD"</string>
<string name="memory_available">"Dostępne miejsce"</string>
- <string name="memory_size">"Całkowita pojemność"</string>
- <string name="sd_eject">"Odłącz kartę SD"</string>
- <string name="sd_eject_summary">"Odłącz kartę SD, aby bezpiecznie ją usunąć"</string>
+ <string name="memory_size">"Łączna pojemność"</string>
+ <string name="sd_eject">"Odmontuj kartę SD"</string>
+ <string name="sd_eject_summary">"Odmontuj kartę SD, aby bezpiecznie ją usunąć"</string>
<string name="sd_format">"Formatuj kartę SD"</string>
<string name="sd_format_summary">"Formatuj (wymaż) kartę SD"</string>
<string name="sd_unavailable">"Niedostępna"</string>
@@ -479,23 +477,19 @@
<string name="media_format_button_text">"Formatuj kartę SD"</string>
<string name="media_format_final_desc">"Czy sformatować kartę SD i wymazać wszystkie multimedia? Nie można cofnąć tej akcji!"</string>
<string name="media_format_final_button_text">"Wymaż wszystko"</string>
- <string name="media_format_gesture_prompt">"Narysuj wzór odblokowania"</string>
- <string name="media_format_gesture_explanation">"Aby potwierdzić formatowanie karty SD, należy narysować swój wzór odblokowania."</string>
+ <string name="media_format_gesture_prompt">"Narysuj wzorzec odblokowania"</string>
+ <string name="media_format_gesture_explanation">"Aby potwierdzić formatowanie karty SD, należy narysować swój wzorzec do odblokowania."</string>
<string name="call_settings_title">"Ustawienia połączeń"</string>
- <string name="call_settings_summary">"Poczta głosowa, przekierowania połączeń, poł. oczekujące, ID rozmówcy"</string>
+ <string name="call_settings_summary">"Poczta głosowa, przekierowania połączeń, poł. oczekujące, ID dzwoniącego"</string>
<string name="network_settings_title">"Sieci komórkowe"</string>
<string name="network_settings_summary">"Ustaw opcje roamingu, sieci, nazw APN"</string>
<string name="location_title">"Źródło Mojej lokalizacji"</string>
<string name="location_network_based">"Użyj sieci Wi-Fi"</string>
<string name="location_networks_disabled">"Zobacz położenie w aplikacjach (takich jak Mapy), korzystając z sieci bezprzewodowych"</string>
- <string name="location_neighborhood_level">"Położenie określane jest za pomocą Wi-Fi i/lub sieci komórkowych"</string>
+ <string name="location_neighborhood_level">"Położenie określane jest za pomocą Wi-Fi i/lub sieci komórkowych."</string>
<string name="location_gps">"Użyj satelit GPS"</string>
<string name="location_street_level">"Ustalanie położenia z dokładnością do ulicy (wyłącz, aby oszczędzać baterię)"</string>
<string name="location_gps_disabled">"Podaje dokładne położenie (zużywa więcej baterii, działa na zewnątrz)"</string>
- <string name="location_warning_title">"Zgoda na usługę lokalizacji"</string>
- <string name="location_warning_message">"Zezwól usłudze lokalizacji Google na zbieranie anonimowych, zbiorczych danych o lokalizacji. Zbieranie danych będzie się odbywać bez względu na to, czy aktywne są aplikacje."</string>
- <string name="agree">"Zgadzam się"</string>
- <string name="disagree">"Nie zgadzam się"</string>
<string name="about_settings">"Informacje o telefonie"</string>
<string name="about_settings_summary">"Wyświetl informacje prawne, stan telefonu, wersję oprogramowania"</string>
<string name="legal_information">"Informacje prawne"</string>
@@ -536,7 +530,7 @@
<string name="skip_button_label">"Anuluj"</string>
<string name="next_button_label">"Dalej"</string>
<string name="lock_title">"Zabezpieczanie telefonu"</string>
- <string name="lock_intro_message"><font size="17">"Chroń swój telefon przed nieuprawnionym użyciem przez utworzenie osobistego wzoru odblokowania ekranu. "\n<font height="17">\n</font><b>"1"</b>" Obejrzyj rysowanie przykładowego wzoru na następnym ekranie. "\n<font height="17">\n</font><b>"2"</b>" Następnie narysuj swój własny wzór odblokowania. Eksperymentuj z różnymi wzorami, ale połącz co najmniej 4 punkty. "\n<font height="17">\n</font><b>"3"</b>" Narysuj swój wzór ponownie dla potwierdzenia. "\n<font height="17">\n</font><b>"Możemy zaczynać? Wybierz „Dalej”"</b>". "\n<font height="3">\n</font>"Aby zrezygnować z ustawiania blokady, wybierz „Anuluj”."</font></string>
+ <string name="lock_intro_message"><font size="17">"Chroń swój telefon przed nieuprawnionym użyciem przez stworzenie osobistego wzoru odblokowania ekranu. "\n<font height="17">\n</font><b>"1"</b>" Obejrzyj rysowanie przykładowego wzoru na następnym ekranie. "\n<font height="17">\n</font><b>"2"</b>" Następnie narysuj swój własny wzór odblokowania. Eksperymentuj z różnymi wzorami, ale połącz co najmniej 4 punkty. "\n<font height="17">\n</font><b>"3"</b>" Narysuj swój wzór ponownie dla potwierdzenia. "\n<font height="17">\n</font><b>"Możemy zaczynać? Wybierz „Dalej”"</b>". "\n<font height="3">\n</font>"Aby zrezygnować z ustawiania blokady, wybierz „Anuluj”."</font></string>
<string name="lock_example_title">"Przykładowy wzór"</string>
<string name="lock_example_message">"Połącz co najmniej cztery kropki."\n" "\n"Wybierz polecenie „Dalej”, aby narysować własny wzór."</string>
<string name="manageapplications_settings_title">"Zarządzaj aplikacjami"</string>
@@ -595,10 +589,10 @@
<string name="auto_replace">"Autokorekta"</string>
<string name="auto_replace_summary">"Poprawiaj błędnie wpisane słowa"</string>
<string name="auto_caps">"Wielka litera po kropce"</string>
- <string name="auto_caps_summary">"Zaczynaj zdania wielką literą"</string>
+ <string name="auto_caps_summary">"Zdanie zaczynaj wielką literą"</string>
<string name="auto_punctuate">"Łatwa interpunkcja"</string>
<string name="hardkeyboard_category">"Ustawienia klawiatury fizycznej"</string>
- <string name="auto_punctuate_summary">"Naciśnij dwukrotnie klawisz spacji, aby wstawić kropkę"</string>
+ <string name="auto_punctuate_summary">"Naciśnij klawisz spacji dwukrotnie, aby wstawić kropkę."</string>
<string name="show_password">"Widoczne hasła"</string>
<string name="show_password_summary">"Pokazuj hasło podczas wpisywania"</string>
<string name="ime_security_warning">"Ta metoda wprowadzania może gromadzić cały wpisywany tekst, w tym dane osobiste, takie jak hasła i numery kart kredytowych. Ta metoda pochodzi z aplikacji <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Włączyć tę metodę wprowadzania?"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 5297e2f..ee7d1dc 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -107,10 +107,6 @@
<string name="date_and_time">"Настройки даты и времени"</string>
<string name="date_time_12_hour_sample">"13:00"</string>
<string name="date_time_24_hour_sample">"13:00"</string>
- <!-- no translation found for date_time_changeTime_text (7037437020000867740) -->
- <skip />
- <!-- no translation found for date_time_changeDate_text (5259762626498028057) -->
- <skip />
<string name="choose_timezone">"Выбрать часовой пояс"</string>
<string name="display_preview_label">"Предварительный просмотр:"</string>
<string name="display_font_size_label">"Размер шрифта:"</string>
@@ -494,10 +490,6 @@
<string name="location_gps">"Включить спутники GPS"</string>
<string name="location_street_level">"Определение местоположения с точностью до улицы (для экономии заряда батареи отмените выбор)"</string>
<string name="location_gps_disabled">"Находить меня до уровня улицы (требуется больше заряда батареи, а также прямая видимость неба)"</string>
- <string name="location_warning_title">"Разрешение на отслеживание местоположения"</string>
- <string name="location_warning_message">"Разрешить Google собирать данные о местоположении без идентификации личной информации. Данные будут собираться, даже если не будет запущено ни одного приложения."</string>
- <string name="agree">"Принимаю"</string>
- <string name="disagree">"Не принимаю"</string>
<string name="about_settings">"О телефоне"</string>
<string name="about_settings_summary">"Просмотреть юридические сведения, состояние телефона, версию ПО"</string>
<string name="legal_information">"Юридическая информация"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 2089b98..1428b85 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -107,10 +107,6 @@
<string name="date_and_time">"日期和时间设置"</string>
<string name="date_time_12_hour_sample">"下午 1:00"</string>
<string name="date_time_24_hour_sample">"13:00"</string>
- <!-- no translation found for date_time_changeTime_text (7037437020000867740) -->
- <skip />
- <!-- no translation found for date_time_changeDate_text (5259762626498028057) -->
- <skip />
<string name="choose_timezone">"选择时区"</string>
<string name="display_preview_label">"预览:"</string>
<string name="display_font_size_label">"字体大小:"</string>
@@ -495,14 +491,6 @@
<string name="location_gps">"启用 GPS 卫星设置"</string>
<string name="location_street_level">"定位时,精确到街道级别(取消选择可节约电量)"</string>
<string name="location_gps_disabled">"定位到街道级别(需要更多电量来观看天空)"</string>
- <!-- no translation found for location_warning_title (788624242969337259) -->
- <skip />
- <!-- no translation found for location_warning_message (2455390825908728808) -->
- <skip />
- <!-- no translation found for agree (6288718671527758326) -->
- <skip />
- <!-- no translation found for disagree (6221069272309799230) -->
- <skip />
<string name="about_settings">"关于手机"</string>
<string name="about_settings_summary">"查看法律信息、手机状态和软件版本"</string>
<string name="legal_information">"法律信息"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 7d0c54f..bbaae3d 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -107,10 +107,6 @@
<string name="date_and_time">"日期與時間設定"</string>
<string name="date_time_12_hour_sample">"下午 1:00"</string>
<string name="date_time_24_hour_sample">"13:00"</string>
- <!-- no translation found for date_time_changeTime_text (7037437020000867740) -->
- <skip />
- <!-- no translation found for date_time_changeDate_text (5259762626498028057) -->
- <skip />
<string name="choose_timezone">"選取時區"</string>
<string name="display_preview_label">"預覽:"</string>
<string name="display_font_size_label">"字型大小:"</string>
@@ -494,10 +490,6 @@
<string name="location_gps">"啟用 GPS 衛星接收器"</string>
<string name="location_street_level">"定位時,精準度設定為街道等級 (取消選取此項可較省電)"</string>
<string name="location_gps_disabled">"定位至街道等級 (需要更多電力及天候允許)"</string>
- <string name="location_warning_title">"同意記錄位置資訊"</string>
- <string name="location_warning_message">"允許 Google 的定位服務收集匿名綜合位置資料。無論是否有應用程式處於作用中,均會進行收集。"</string>
- <string name="agree">"同意"</string>
- <string name="disagree">"不同意"</string>
<string name="about_settings">"關於手機"</string>
<string name="about_settings_summary">"檢視法律資訊、手機狀態、軟體版本"</string>
<string name="legal_information">"法律資訊"</string>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 6cfa7f0..1c480a8 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -81,6 +81,42 @@
<item>-1</item>
</string-array>
+ <!-- TTS settings -->
+
+ <!-- Default speech rate choices -->
+ <string-array name="tts_rate_entries">
+ <item>Very slow</item>
+ <item>Slow</item>
+ <item>Normal</item>
+ <item>Fast</item>
+ <item>Very fast</item>
+ </string-array>
+ <!-- Do not translate. -->
+ <string-array name="tts_rate_values">
+ <item>60</item>
+ <item>100</item>
+ <item>140</item>
+ <item>180</item>
+ <item>220</item>
+ </string-array>
+
+ <!-- Default pitch choices -->
+ <string-array name="tts_pitch_entries">
+ <item>Very low</item>
+ <item>Low</item>
+ <item>Normal</item>
+ <item>High</item>
+ <item>Very high</item>
+ </string-array>
+ <!-- Do not translate. -->
+ <string-array name="tts_pitch_values">
+ <item>50</item>
+ <item>80</item>
+ <item>100</item>
+ <item>120</item>
+ <item>150</item>
+ </string-array>
+
<!-- Wi-Fi settings -->
<!-- Match this with code. --> <skip />
@@ -93,9 +129,13 @@
<!-- Do not translate. The Wi-Fi network has WEP security. -->
<item>WEP</item>
<!-- The Wi-Fi network has WPA personal security. WPA Personal is a tech term, and might be better left untranslated? -->
- <item>WPA Personal</item>
+ <item>WPA personal</item>
<!-- The Wi-Fi network has WPA2 personal security. WPA Personal is a tech term, and might be better left untranslated? -->
- <item>WPA2 Personal</item>
+ <item>WPA2 personal</item>
+ <!-- The Wi-Fi network has WPA EAP extensible authentication protocol. -->
+ <item>WPA-EAP</item>
+ <!-- IEEE 802.1X key management -->
+ <item>IEEE 802.1x</item>
</string-array>
<!-- Match this with code. --> <skip />
@@ -106,9 +146,14 @@
<!-- Do not translate. The Wi-Fi network has WEP security. -->
<item>WEP</item>
<!-- The Wi-Fi network has WPA personal security. WPA Personal is a tech term, and might be better left untranslated? -->
- <item>WPA Personal</item>
+ <item>WPA personal</item>
<!-- The Wi-Fi network has WPA2 personal security. WPA Personal is a tech term, and might be better left untranslated? -->
- <item>WPA2 Personal</item>
+ <item>WPA2 personal</item>
+ <!-- The Wi-Fi network has WPA enterprise security. WPA Enterprise is a tech term, and might be better left untranslated? -->
+ <!-- The Wi-Fi network has WPA EAP extensible authentication protocol. -->
+ <item>WPA-EAP</item>
+ <!-- IEEE 802.1X key management -->
+ <item>IEEE 802.1x</item>
</string-array>
<!-- Match this with code. --> <skip />
@@ -167,4 +212,20 @@
<item>Application Name</item>
</string-array>
+ <!-- EAP method -->
+ <string-array name="wifi_eap_entries">
+ <item>PEAP</item>
+ <item>TLS</item>
+ <item>TTLS</item>
+ </string-array>
+
+ <!-- Phase 2 options -->
+ <string-array name="wifi_phase2_entries">
+ <item>None</item>
+ <item>PAP</item>
+ <item>MSCHAP</item>
+ <item>MSCHAP2</item>
+ <item>GTC</item>
+ </string-array>
+
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 70e1618..9119edc 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -291,6 +291,7 @@
<!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
<string name="radio_info_data_attempts_label">Data attempts:</string>
<!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+
<string name="radio_info_gprs_service_label">GPRS service:</string>
<!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
<string name="radio_info_roaming_label">Roaming:</string>
@@ -433,6 +434,25 @@
<string name="radio_controls_summary">Manage Wi-Fi, Bluetooth, airplane mode, &amp; mobile networks</string>
+ <!-- mobile network settings screen, setting check box title -->
+ <string name="roaming">Data roaming</string>
+ <!-- mobile network settings screen, setting option summary text when check box is selected -->
+ <string name="roaming_enable">Connect to data services when roaming</string>
+ <!-- mobile network settings screen, setting option summary text when check box is clear -->
+ <string name="roaming_disable">Connect to data services when roaming</string>
+ <!-- mobile network settings screen, dialog message when you are roaming and clear the "Data roaming" check box -->
+ <string name="roaming_reenable_message">You have lost data connectivity because you left your home network with data roaming turned off.</string>
+ <!-- mobile network settings screen, button on dialog box that appears when you are roaming and clear the "Data roaming" check box -->
+ <string name="roaming_turn_it_on_button">Turn it on</string>
+ <!-- mobile network settings screen, message in dialog box that appears when you select the "Data roaming" check box -->
+ <string name="roaming_warning">Allow data roaming? You may incur significant roaming charges!</string>
+ <!-- mobile network settings screen, title of dialog box that appears when you select the "Data roaming" check box -->
+ <string name="roaming_reenable_title">Attention</string>
+ <!-- mobile network settings screen, setting option name -->
+ <string name="networks">Operator selection</string>
+ <!-- mobile network settings screen, setting option summary text -->
+ <string name="sum_carrier_select">Select a network operator</string>
+
<!-- Date and time settings -->
<!-- Main Settings screen setting option name to go into the date and time settings-->
<string name="date_and_time_settings_title">Date &amp; time</string>
@@ -491,6 +511,10 @@
<string name="bluetooth_pairing_error_message">There was a problem pairing with <xliff:g id="device_name">%1$s</xliff:g>.</string>
<!-- Message for the error dialog when BT pairing fails because the PIN entered is incorrect. -->
<string name="bluetooth_pairing_pin_error_message">There was a problem pairing with <xliff:g id="device_name">%1$s</xliff:g> because the typed PIN is incorrect.</string>
+ <!-- Message for the error dialog when BT pairing fails because the other device is down. -->
+ <string name="bluetooth_pairing_device_down_error_message">Cannot establish communication with <xliff:g id="device_name">%1$s</xliff:g>.</string>
+ <!-- Message for the error dialog when BT pairing fails because the other device rejected the pairing. -->
+ <string name="bluetooth_pairing_rejected_error_message">Pairing rejected by <xliff:g id="device_name">%1$s</xliff:g>.</string>
<!-- Message for the error dialog when BT connecting operation fails generically. -->
<string name="bluetooth_connecting_error_message">There was a problem connecting to <xliff:g id="device_name">%1$s</xliff:g>.</string>
@@ -590,6 +614,11 @@
<string name="wifi_security_wpa">WPA</string>
<!-- Value for the wifi security -->
<string name="wifi_security_wpa2">WPA2</string>
+ <!-- Value for the wifi security -->
+ <string name="wifi_security_wpa_eap">WPA-EAP</string>
+ <!-- Value for the wifi security -->
+ <string name="wifi_security_ieee8021x">IEEE8021X</string>
+
<!-- Value for the wifi security when it is unknown -->
<string name="wifi_security_unknown">Unknown</string>
<!-- Verbose security type of a wifi network. Open means no security. -->
@@ -600,6 +629,10 @@
<string name="wifi_security_verbose_wpa">Secured with WPA</string>
<!-- Verbose security type of a wifi network. -->
<string name="wifi_security_verbose_wpa2">Secured with WPA2</string>
+ <!-- Verbose security type of a wifi network. -->
+ <string name="wifi_security_verbose_wpa_eap">Secured with WPA-EAP</string>
+ <!-- Verbose security type of a wifi network. -->
+ <string name="wifi_security_verbose_ieee8021x">Secured with IEEE 802.1x</string>
<!-- Wi-Fi IP addrress label -->
<string name="ip_address">IP address</string>
<!-- Label for the signal strength -->
@@ -624,6 +657,22 @@
<string name="connect">Connect</string>
<!-- Dialog title for when the user is trying to connect to a particular network-->
<string name="connect_to_blank">Connect to <xliff:g id="network_name">%1$s</xliff:g></string>
+ <!-- Caption for the eap method -->
+ <string name="please_select_eap">EAP method</string>
+ <!-- Caption for the phase2 -->
+ <string name="please_select_phase2">Phase 2 authentication</string>
+ <!-- Caption for the identity -->
+ <string name="please_type_identity">Identity</string>
+ <!-- Caption for the anonymous_identity -->
+ <string name="please_type_anonymous_identity">Anonymous identity</string>
+ <!-- Caption for the client_certificate -->
+ <string name="please_select_client_certificate">Client certificate</string>
+ <!-- Caption for the ca certificate -->
+ <string name="please_select_ca_certificate">CA certificate</string>
+ <!-- Caption for the Private Key -->
+ <string name="please_select_private_key">Private key</string>
+ <!-- Caption for the private key passwd -->
+ <string name="please_type_private_key_passwd">Private key password</string>
<!-- Caption for the wireless password -->
<string name="please_type_passphrase">Wireless password</string>
<!--Wi-Fi settings screen, connect to network dialog box, field label and hint text -->
@@ -808,6 +857,11 @@
<!-- Main Settings screen setting option summary text for the itme to go into the screen with data sync settings-->
<string name="sync_settings_summary">Select which applications are synchronized</string>
+ <!-- Main Settings screen, setting option name to go into search settings -->
+ <string name="search_settings">Search</string>
+ <!-- Main Settings screen, setting option summary to go into search settings -->
+ <string name="search_settings_summary">Manage system search, web search and search history</string>
+
<!-- Display settings -->
<!-- Sound & display settings screen, section header for settings related to display -->
<string name="display_settings">Display settings</string>
@@ -1079,13 +1133,6 @@
<!-- Security & location settings screen, setting summary when Enable GPS satellites check box is clear -->
<string name="location_gps_disabled">Locate to street-level (requires more battery plus view of sky)</string>
<!-- Title of warning dialog to user that location information will be logged -->
- <string name="location_warning_title">Location consent</string>
- <!-- Warning text to user that location information will be logged -->
- <string name="location_warning_message">"Allow Google's location service to collect anonymous and aggregate location data. Collection will occur regardless of whether any applications are active."</string>
- <!-- Agree button-->
- <string name="agree">Agree</string>
- <!-- Disagree button-->
- <string name="disagree">Disagree</string>
<!-- About -->
<!-- Main settings screen, setting title for the user to go into the About phone screen -->
@@ -1245,6 +1292,8 @@
<string name="uninstall_text">Uninstall</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 -->
+ <string name="app_factory_reset">Factory reset</string>
<!-- Manage applications, individual application info screen, screen, message text under Launch by default heading. This is present if the app is set as a default for some actions. -->
<string name="auto_launch_enable_text">You have selected to launch this application by default for some actions.</string>
<!-- Manage applications, individual application screen, text under Launch by default heading if the app is NOT a default for actions -->
@@ -1290,12 +1339,22 @@
found in the list of installed applications.</string>
<!-- Manage applications, individual application dialog box message. Shown when there was an error trying to clear the data. -->
<string name="clear_data_failed">Unable to clear application data.</string>
+ <!-- Manage applications, factory reset dialog title for system applications. -->
+ <string name="app_factory_reset_dlg_title">Factory reset system app</string>
+ <!-- Manage applications, factory reset option dialog text for system applications. -->
+ <string name="app_factory_reset_dlg_text">Do you want to fallback to factory version of system application?</string>
+ <!-- Manage applications, title for dialog if clear data fails-->
+ <string name="clear_failed_dlg_title">Clear data</string>
+ <!-- Manage applications, text for dialog if clear data fails-->
+ <string name="clear_failed_dlg_text">Failed clearing data for application</string>
<!-- Manage applications, individual application info screen, text that appears under the "Permissions" heading. This describes the permissions that the application has. -->
<string name="security_settings_desc">This application can access the following on your phone:</string>
<string name="computing_size">Computing\u2026</string>
<string name="invalid_size_value">Unable to compute package size</string>
<!-- String displayed when list is empty -->
<string name="empty_list_msg">You do not have any third-party apps installed.</string>
+ <!-- Manage applications, version string displayed in app snippet -->
+ <string name="version_text">version <xliff:g id="version_num">%1$s</xliff:g></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 -->
@@ -1462,16 +1521,16 @@ found in the list of installed applications.</string>
<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> days, <xliff:g id="hours">%2$d</xliff:g> hours, <xliff:g id="minutes">%3$d</xliff:g> minutes, <xliff:g id="seconds">%4$d</xliff:g> seconds</string>
+ <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>
<!-- Used to show an amount of time in the form "h hours, m minutes, s seconds" in BatteryHistory -->
- <string name="battery_history_hours"><xliff:g id="hours">%1$d</xliff:g> hours, <xliff:g id="minutes">%2$d</xliff:g> minutes, <xliff:g id="seconds">%3$d</xliff:g> seconds</string>
+ <string name="battery_history_hours"><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>
<!-- Used to show an amount of time in the form "m minutes, s seconds" in BatteryHistory -->
- <string name="battery_history_minutes"><xliff:g id="minutes">%1$d</xliff:g> minutes, <xliff:g id="seconds">%2$d</xliff:g> seconds</string>
+ <string name="battery_history_minutes"><xliff:g id="minutes">%1$d</xliff:g> m, <xliff:g id="seconds">%2$d</xliff:g> s</string>
<!-- 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> seconds</string>
+ <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>
@@ -1531,4 +1590,114 @@ found in the list of installed applications.</string>
<string name="launch_count_label">Count</string>
<!-- label for usage time -->
<string name="usage_time_label">Usage time</string>
+
+ <!-- Accessibility settings -->
+ <skip/>
+
+ <!-- Settings title for accessibility settings -->
+ <string name="accessibility_settings_title">Accessibility</string>
+ <!-- Settings summary for accessibility settings -->
+ <string name="accessibility_settings_summary">Manage accessibility options</string>
+ <!-- Setting Checkbox title for enabling accessibility -->
+ <string name="toggle_accessibility_title">Accessibility</string>
+ <!-- Setting Checkbox summary for enabling accessiblity - enable -->
+ <string name="enable_accessibility_service_summary">Enable accessibility</string>
+ <!-- Setting Checkbox summary for enabling accessibility - disable -->
+ <string name="disable_accessibility_service_summary">Disable accessibility</string>
+ <!-- Setting accessibility services category -->
+ <string name="accessibility_services_category">Accessibility services</string>
+ <!-- Message for announcing the lack of installed accessibility services. -->
+ <string name="no_accessibility_services_summary">No installed accessibility services.</string>
+ <!-- Warning message about security implications of enabling an accessibility service,
+ displayed as a dialog message when the user selects to enable an accessibility service. -->
+ <string name="accessibility_service_security_warning">This accessibility service may be able to collect
+ all the text you type, including personal data credit card numbers except passwords.
+ It may also log your user interface interactions. It comes from the application
+ <xliff:g id="accessibility_service_name">%1$s</xliff:g>. Enable this accessibility service?</string>
+ <!-- Warning about disabling accessibility displayed as a dialog message when the user
+ selects to disable accessibility. This avoids accidental disabling. -->
+ <string name="accessibility_service_disable_warning">Disable accessibility?</string>
+
+ <!-- App Fuel Gauge strings -->
+ <skip/>
+
+ <!-- Activity title for App Fuel Gauge summary -->
+ <string name="power_usage_summary_title">Battery usage</string>
+ <!-- Battery usage since unplugged -->
+ <string name="battery_since_unplugged">Battery usage since unplugged</string>
+ <!-- Battery usage since user reset the stats -->
+ <string name="battery_since_reset">Battery usage since reset</string>
+ <!-- CPU awake time title -->
+ <string name="awake">Device awake time</string>
+ <!-- Wifi on time -->
+ <string name="wifi_on_time">WiFi on time</string>
+
+ <!-- Activity title for battery usage details for an app. or power consumer -->
+ <string name="details_title">Battery usage details</string>
+ <!-- Subtitle for application/subsystem details -->
+ <string name="details_subtitle">Usage details</string>
+ <!-- Subtitle for possible options -->
+ <string name="controls_subtitle">Controls</string>
+
+ <!-- Label for power consumed by the screen -->
+ <string name="power_screen">Screen on</string>
+ <!-- Label for power consumed by WiFi -->
+ <string name="power_wifi">WiFi</string>
+ <!-- Label for power consumed by Cell idle -->
+ <string name="power_cell">Cell</string>
+ <!-- Label for power consumed by Calling -->
+ <string name="power_phone">Voice</string>
+ <!-- Label for power consumed when Idle -->
+ <string name="power_idle">Standby</string>
+
+ <!-- Label for CPU usage time -->
+ <string name="usage_type_cpu">CPU total</string>
+ <!-- Label for CPU usage in foreground -->
+ <string name="usage_type_cpu_foreground">CPU foreground</string>
+ <!-- Label for GPU usage time -->
+ <string name="usage_type_gps">GPS</string>
+ <!-- Label for Phone usage time -->
+ <string name="usage_type_phone">Phone</string>
+ <!-- Label for Data sent -->
+ <string name="usage_type_data_send">Data sent</string>
+ <!-- Label for Data received -->
+ <string name="usage_type_data_recv">Data received</string>
+ <!-- Label for Audio usage time -->
+ <string name="usage_type_audio">Audio</string>
+ <!-- Label for Video usage time -->
+ <string name="usage_type_video">Video</string>
+
+ <!-- Menu label for viewing battery usage since unplugged -->
+ <string name="menu_stats_unplugged">Usage since unplugged</string>
+ <!-- Menu label for viewing battery usage total -->
+ <string name="menu_stats_total">Usage totals</string>
+ <!-- Menu label for refreshing with latest usage numbers -->
+ <string name="menu_stats_refresh">Refresh</string>
+
+ <!-- Text-To-Speech (TTS) settings --><skip />
+ <!-- Title of setting on main settings screen. This item will take the user to the screen to tweak settings related to the text-to-speech functionality -->
+ <string name="tts_settings">Speech synthesis</string>
+ <!-- Summary of setting on main settings screen. This item will take the user to the screen to tweak settings related to the text-to-speech functionality -->
+ <string name="tts_settings_summary">Set text-to-speech options</string>
+ <!-- Main TTS Settings screen title -->
+ <string name="tts_settings_title">Speech synthesizer controls</string>
+ <!-- On main TTS Settings screen, title for toggle used to force use of default TTS settings -->
+ <string name="use_default_tts_settings_title">Always use my settings</string>
+ <!-- On main TTS Settings screen, summary for toggle used to force use of default TTS settings -->
+ <string name="use_default_tts_settings_summary">Default settings below override application settings</string>
+ <!-- On main TTS Settings screen, section header for default TTS settings -->
+ <string name="tts_default_settings_section">Default settings</string>
+ <!-- On main TTS Settings screen, in default settings section, setting default speech rate for synthesized voice -->
+ <string name="tts_default_rate_title">Speech rate</string>
+ <!-- On main TTS Settings screen, summary for default speech rate for synthesized voice -->
+ <string name="tts_default_rate_summary">Speed at which the text is spoken</string>
+ <!-- On main TTS Settings screen, in default settings section, setting default pitch for synthesized voice -->
+ <string name="tts_default_pitch_title">Pitch</string>
+ <!-- On main TTS Settings screen, summary for default pitch for synthesized voice -->
+ <string name="tts_default_pitch_summary">Affects the tone of the spoken text</string>
+ <!-- On main TTS Settings screen, section header for list of available speech synthesizers -->
+ <string name="tts_available_synths_section">Available speech synthesizers</string>
+
+ <!-- Power Control Widget -->
+ <string name="gadget_title">Power Control</string>
</resources>
diff --git a/res/xml/accessibility_settings.xml b/res/xml/accessibility_settings.xml
new file mode 100644
index 0000000..d419540
--- /dev/null
+++ b/res/xml/accessibility_settings.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res/com.android.settings">
+
+ <CheckBoxPreference
+ android:key="toggle_accessibility_service_checkbox"
+ android:title="@string/toggle_accessibility_title"
+ android:summaryOn="@string/disable_accessibility_service_summary"
+ android:summaryOff="@string/enable_accessibility_service_summary"
+ android:persistent="false"/>
+
+ <PreferenceCategory android:key="accessibility_services_category"
+ android:title="@string/accessibility_services_category" />
+
+</PreferenceScreen>
diff --git a/res/xml/application_settings.xml b/res/xml/application_settings.xml
index 8d0a7cb..4da2036 100644
--- a/res/xml/application_settings.xml
+++ b/res/xml/application_settings.xml
@@ -36,6 +36,14 @@
</PreferenceScreen>
<PreferenceScreen
+ android:key="power_usage"
+ android:title="@string/power_usage_summary_title">
+ <intent android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.fuelgauge.PowerUsageSummary" />
+ </PreferenceScreen>
+
+ <PreferenceScreen
android:title="@string/manageapplications_settings_title"
android:summary="@string/manageapplications_settings_summary">
<intent android:action="android.intent.action.MAIN"
diff --git a/res/xml/appwidget_info.xml b/res/xml/appwidget_info.xml
new file mode 100644
index 0000000..2186dab
--- /dev/null
+++ b/res/xml/appwidget_info.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
+ android:minWidth="294dip"
+ android:minHeight="72dip"
+ android:initialLayout="@layout/widget"
+ >
+</appwidget-provider>
diff --git a/res/xml/power_usage_summary.xml b/res/xml/power_usage_summary.xml
new file mode 100644
index 0000000..80342a8
--- /dev/null
+++ b/res/xml/power_usage_summary.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/battery_since_unplugged">
+
+</PreferenceScreen>
diff --git a/res/xml/settings.xml b/res/xml/settings.xml
index 5c0a1e1..9ca581a 100644
--- a/res/xml/settings.xml
+++ b/res/xml/settings.xml
@@ -115,6 +115,43 @@
android:targetClass="com.android.settings.LanguageSettings" />
</PreferenceScreen>
+ <!-- Search.
+ The settings activity will ensure that this is resolved to an
+ activity on the system image, otherwise it will remove this
+ preference.
+ The intent action is the same as
+ android.app.SearchManager.INTENT_ACTION_SEARCH_SETTINGS.
+ -->
+
+ <PreferenceScreen
+ android:title="@string/search_settings"
+ android:summary="@string/search_settings_summary"
+ android:key="search_settings">
+ <intent android:action="android.search.action.SEARCH_SETTINGS" />
+ </PreferenceScreen>
+
+ <!-- Accessibility feedback -->
+
+ <PreferenceScreen
+ android:title="@string/accessibility_settings_title"
+ android:summary="@string/accessibility_settings_summary">
+ <intent
+ android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.AccessibilitySettings" />
+ </PreferenceScreen>
+
+ <!-- Text-To-Speech -->
+
+ <PreferenceScreen
+ android:title="@string/tts_settings"
+ android:summary="@string/tts_settings_summary">
+ <intent
+ android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.TextToSpeechSettings" />
+ </PreferenceScreen>
+
<!-- About Device -->
<PreferenceScreen
diff --git a/res/xml/tts_settings.xml b/res/xml/tts_settings.xml
new file mode 100644
index 0000000..413e1cc
--- /dev/null
+++ b/res/xml/tts_settings.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/tts_settings_title">
+
+ <CheckBoxPreference
+ android:key="toggle_use_default_tts_settings"
+ android:title="@string/use_default_tts_settings_title"
+ android:summary="@string/use_default_tts_settings_summary"
+ android:persistent="false" />
+
+ <PreferenceCategory
+ android:title="@string/tts_default_settings_section">
+
+ <ListPreference
+ android:key="tts_default_rate"
+ android:title="@string/tts_default_rate_title"
+ android:summary="@string/tts_default_rate_summary"
+ android:persistent="false"
+ android:entries="@array/tts_rate_entries"
+ android:entryValues="@array/tts_rate_values" />
+
+ <ListPreference
+ android:key="tts_default_pitch"
+ android:title="@string/tts_default_pitch_title"
+ android:summary="@string/tts_default_pitch_summary"
+ android:persistent="false"
+ android:entries="@array/tts_pitch_entries"
+ android:entryValues="@array/tts_pitch_values" />
+
+ </PreferenceCategory>
+
+
+</PreferenceScreen>
diff --git a/src/com/android/settings/AccessibilitySettings.java b/src/com/android/settings/AccessibilitySettings.java
new file mode 100644
index 0000000..45602bc
--- /dev/null
+++ b/src/com/android/settings/AccessibilitySettings.java
@@ -0,0 +1,276 @@
+/*
+ * 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;
+
+import android.app.AlertDialog;
+import android.app.Service;
+import android.content.DialogInterface;
+import android.content.pm.ServiceInfo;
+import android.os.Bundle;
+import android.preference.CheckBoxPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceGroup;
+import android.preference.PreferenceScreen;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.view.accessibility.AccessibilityManager;
+
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Activity with the accessibility settings.
+ */
+public class AccessibilitySettings extends PreferenceActivity {
+ private final String TOGGLE_ACCESSIBILITY_SERVICE_CHECKBOX =
+ "toggle_accessibility_service_checkbox";
+
+ private static final String ACCESSIBILITY_SERVICES_CATEGORY =
+ "accessibility_services_category";
+
+ private CheckBoxPreference mToggleCheckBox;
+
+ private Map<String, ServiceInfo> mAccessibilityServices =
+ new LinkedHashMap<String, ServiceInfo>();
+
+ private TextUtils.SimpleStringSplitter mStringColonSplitter =
+ new TextUtils.SimpleStringSplitter(':');
+
+ private PreferenceGroup mAccessibilityServicesCategory;
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ addPreferencesFromResource(R.xml.accessibility_settings);
+
+ mToggleCheckBox = (CheckBoxPreference) findPreference(
+ TOGGLE_ACCESSIBILITY_SERVICE_CHECKBOX);
+
+ addAccessibilitServicePreferences();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ final HashSet<String> enabled = new HashSet<String>();
+ String settingValue = Settings.Secure.getString(getContentResolver(),
+ Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
+ if (settingValue != null) {
+ TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
+ splitter.setString(settingValue);
+ while (splitter.hasNext()) {
+ enabled.add(splitter.next());
+ }
+ }
+
+ Map<String, ServiceInfo> accessibilityServices = mAccessibilityServices;
+
+ for (String key : accessibilityServices.keySet()) {
+ CheckBoxPreference preference = (CheckBoxPreference) findPreference(key);
+ if (preference != null) {
+ preference.setChecked(enabled.contains(key));
+ }
+ }
+
+ int serviceState = Settings.Secure.getInt(getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_ENABLED, 0);
+
+ if (!accessibilityServices.isEmpty()) {
+ if (serviceState == 1) {
+ mToggleCheckBox.setChecked(true);
+ mToggleCheckBox.setSummaryOn(R.string.disable_accessibility_service_summary);
+ } else {
+ mToggleCheckBox.setSummaryOff(R.string.enable_accessibility_service_summary);
+ setAccessibilityServicePreferencesState(false);
+ }
+ mToggleCheckBox.setEnabled(true);
+ } else {
+ if (serviceState == 1) {
+ // no service and accessibility is enabled => disable
+ Settings.Secure.putInt(getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_ENABLED, 0);
+ setAccessibilityServicePreferencesState(false);
+ }
+ mToggleCheckBox.setSummaryOff(R.string.no_accessibility_services_summary);
+ mToggleCheckBox.setEnabled(false);
+ }
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+
+ persistEnabledAccessibilityServices();
+ }
+
+ /**
+ * Sets the state of the preferences for enabling/disabling AccessibilityServices.
+ *
+ * @param isEnabled If to enable or disable the preferences.
+ */
+ private void setAccessibilityServicePreferencesState(boolean isEnabled) {
+ if (mAccessibilityServicesCategory == null) {
+ return;
+ }
+
+ int count = mAccessibilityServicesCategory.getPreferenceCount();
+ for (int i = 0; i < count; i++) {
+ mAccessibilityServicesCategory.getPreference(i).setEnabled(isEnabled);
+ }
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+ final String key = preference.getKey();
+
+ if (TOGGLE_ACCESSIBILITY_SERVICE_CHECKBOX.equals(key)) {
+ boolean isChecked = ((CheckBoxPreference) preference).isChecked();
+ handleEnableAccessibilityStateChange((CheckBoxPreference) preference);
+ } else if (preference instanceof CheckBoxPreference) {
+ handleEnableAccessibilityServiceStateChange((CheckBoxPreference) preference);
+ }
+
+ return super.onPreferenceTreeClick(preferenceScreen, preference);
+ }
+
+ /**
+ * Handles the change of the accessibility enabled setting state.
+ *
+ * @param preference The preference for enabling/disabling accessibility.
+ */
+ private void handleEnableAccessibilityStateChange(CheckBoxPreference preference) {
+ if (preference.isChecked()) {
+ Settings.Secure.putInt(getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_ENABLED, 1);
+ setAccessibilityServicePreferencesState(true);
+ } else {
+ final CheckBoxPreference checkBoxPreference = preference;
+ AlertDialog dialog = (new AlertDialog.Builder(this))
+ .setTitle(android.R.string.dialog_alert_title)
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setMessage(getString(R.string.accessibility_service_disable_warning))
+ .setCancelable(true)
+ .setPositiveButton(android.R.string.ok,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ Settings.Secure.putInt(getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_ENABLED, 0);
+ setAccessibilityServicePreferencesState(false);
+ }
+ })
+ .setNegativeButton(android.R.string.cancel,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ checkBoxPreference.setChecked(true);
+ }
+ })
+ .create();
+ dialog.show();
+ }
+ }
+
+ /**
+ * Handles the change of the preference for enabling/disabling an AccessibilityService.
+ *
+ * @param preference The preference.
+ */
+ private void handleEnableAccessibilityServiceStateChange(CheckBoxPreference preference) {
+ if (preference.isChecked()) {
+ final CheckBoxPreference checkBoxPreference = preference;
+ AlertDialog dialog = (new AlertDialog.Builder(this))
+ .setTitle(android.R.string.dialog_alert_title)
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setMessage(getString(R.string.accessibility_service_security_warning,
+ mAccessibilityServices.get(preference.getKey())
+ .applicationInfo.loadLabel(getPackageManager())))
+ .setCancelable(true)
+ .setPositiveButton(android.R.string.ok,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ checkBoxPreference.setChecked(true);
+ persistEnabledAccessibilityServices();
+ }
+ })
+ .setNegativeButton(android.R.string.cancel,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ checkBoxPreference.setChecked(false);
+ }
+ })
+ .create();
+ dialog.show();
+ } else {
+ persistEnabledAccessibilityServices();
+ }
+ }
+
+ /**
+ * Persists the Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES setting.
+ * The AccessibilityManagerService watches this property and manages the
+ * AccessibilityServices.
+ */
+ private void persistEnabledAccessibilityServices() {
+ StringBuilder builder = new StringBuilder(256);
+
+ int firstEnabled = -1;
+ for (String key : mAccessibilityServices.keySet()) {
+ CheckBoxPreference preference = (CheckBoxPreference) findPreference(key);
+ if (preference.isChecked()) {
+ builder.append(key);
+ builder.append(':');
+ }
+ }
+
+ Settings.Secure.putString(getContentResolver(),
+ Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, builder.toString());
+ }
+
+ /**
+ * Adds {@link CheckBoxPreference} for enabling or disabling an accessibility services.
+ */
+ private void addAccessibilitServicePreferences() {
+ AccessibilityManager accessibilityManager =
+ (AccessibilityManager) getSystemService(Service.ACCESSIBILITY_SERVICE);
+
+ List<ServiceInfo> installedServices = accessibilityManager.getAccessibilityServiceList();
+
+ mAccessibilityServicesCategory =
+ (PreferenceGroup) findPreference(ACCESSIBILITY_SERVICES_CATEGORY);
+
+ if (installedServices.isEmpty()) {
+ getPreferenceScreen().removePreference(mAccessibilityServicesCategory);
+ mAccessibilityServicesCategory = null;
+ return;
+ }
+
+ for (int i = 0, count = installedServices.size(); i < count; ++i) {
+ ServiceInfo serviceInfo = installedServices.get(i);
+ String key = serviceInfo.packageName + "/" + serviceInfo.name;
+
+ mAccessibilityServices.put(key, serviceInfo);
+
+ CheckBoxPreference preference = new CheckBoxPreference(this);
+ preference.setKey(key);
+ preference.setTitle(serviceInfo.loadLabel(getPackageManager()));
+ mAccessibilityServicesCategory.addPreference(preference);
+ }
+ }
+}
diff --git a/src/com/android/settings/ApnEditor.java b/src/com/android/settings/ApnEditor.java
index f1fa2ef..0bd91a8 100644
--- a/src/com/android/settings/ApnEditor.java
+++ b/src/com/android/settings/ApnEditor.java
@@ -202,7 +202,7 @@ public class ApnEditor extends PreferenceActivity
mApnType.setText(mCursor.getString(TYPE_INDEX));
if (mNewApn) {
String numeric =
- SystemProperties.get(TelephonyProperties.PROPERTY_SIM_OPERATOR_NUMERIC);
+ SystemProperties.get(TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC);
// MCC is first 3 chars and then in 2 - 3 chars of MNC
if (numeric != null && numeric.length() > 4) {
// Country code
diff --git a/src/com/android/settings/ApnSettings.java b/src/com/android/settings/ApnSettings.java
index ecfdb24..2624990 100644
--- a/src/com/android/settings/ApnSettings.java
+++ b/src/com/android/settings/ApnSettings.java
@@ -146,7 +146,7 @@ public class ApnSettings extends PreferenceActivity implements
private void fillList() {
String where = "numeric=\""
- + android.os.SystemProperties.get(TelephonyProperties.PROPERTY_SIM_OPERATOR_NUMERIC, "")
+ + android.os.SystemProperties.get(TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC, "")
+ "\"";
Cursor cursor = managedQuery(Telephony.Carriers.CONTENT_URI, new String[] {
diff --git a/src/com/android/settings/ApplicationSettings.java b/src/com/android/settings/ApplicationSettings.java
index 85fe11f..6a8aa81 100644
--- a/src/com/android/settings/ApplicationSettings.java
+++ b/src/com/android/settings/ApplicationSettings.java
@@ -53,6 +53,14 @@ public class ApplicationSettings extends PreferenceActivity implements
}
@Override
+ protected void onDestroy() {
+ super.onDestroy();
+ if (mWarnInstallApps != null) {
+ mWarnInstallApps.dismiss();
+ }
+ }
+
+ @Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
if (preference == mToggleAppInstallation) {
if (mToggleAppInstallation.isChecked()) {
diff --git a/src/com/android/settings/DateTimeSettings.java b/src/com/android/settings/DateTimeSettings.java
index 1b9fecb..d6e85c4 100644
--- a/src/com/android/settings/DateTimeSettings.java
+++ b/src/com/android/settings/DateTimeSettings.java
@@ -109,14 +109,14 @@ public class DateTimeSettings
mTimePref.setEnabled(!autoEnabled);
mDatePref.setEnabled(!autoEnabled);
mTimeZone.setEnabled(!autoEnabled);
-
- getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onResume() {
super.onResume();
+
+ getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
((CheckBoxPreference)mTime24Pref).setChecked(is24Hour());
@@ -134,6 +134,7 @@ public class DateTimeSettings
protected void onPause() {
super.onPause();
unregisterReceiver(mIntentReceiver);
+ getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
private void updateTimeAndDateDisplay() {
diff --git a/src/com/android/settings/SimLockSettings.java b/src/com/android/settings/IccLockSettings.java
index 286e3d6..18beb32 100644
--- a/src/com/android/settings/SimLockSettings.java
+++ b/src/com/android/settings/IccLockSettings.java
@@ -22,35 +22,36 @@ import android.os.AsyncResult;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
+import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
-import android.preference.CheckBoxPreference;
import android.preference.PreferenceScreen;
+import android.widget.Toast;
+
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
-import android.widget.Toast;
/**
- * Implements the preference screen to enable/disable SIM lock and
- * also the dialogs to change the SIM PIN. In the former case, enabling/disabling
- * the SIM lock will prompt the user for the current PIN.
+ * Implements the preference screen to enable/disable ICC lock and
+ * also the dialogs to change the ICC PIN. In the former case, enabling/disabling
+ * the ICC lock will prompt the user for the current PIN.
* In the Change PIN case, it prompts the user for old pin, new pin and new pin
* again before attempting to change it. Calls the SimCard interface to execute
* these operations.
*
*/
-public class SimLockSettings extends PreferenceActivity
+public class IccLockSettings extends PreferenceActivity
implements EditPinPreference.OnPinEnteredListener {
private static final int OFF_MODE = 0;
- // State when enabling/disabling SIM lock
- private static final int SIM_LOCK_MODE = 1;
+ // State when enabling/disabling ICC lock
+ private static final int ICC_LOCK_MODE = 1;
// State when entering the old pin
- private static final int SIM_OLD_MODE = 2;
+ private static final int ICC_OLD_MODE = 2;
// State when entering the new pin - first time
- private static final int SIM_NEW_MODE = 3;
+ private static final int ICC_NEW_MODE = 3;
// State when entering the new pin - second time
- private static final int SIM_REENTER_MODE = 4;
+ private static final int ICC_REENTER_MODE = 4;
// Keys in xml file
private static final String PIN_DIALOG = "sim_pin";
@@ -70,7 +71,7 @@ public class SimLockSettings extends PreferenceActivity
private String mOldPin;
private String mNewPin;
private String mError;
- // Are we trying to enable or disable SIM lock?
+ // Are we trying to enable or disable ICC lock?
private boolean mToState;
private Phone mPhone;
@@ -81,19 +82,19 @@ public class SimLockSettings extends PreferenceActivity
private Resources mRes;
// For async handler to identify request type
- private static final int ENABLE_SIM_PIN_COMPLETE = 100;
- private static final int CHANGE_SIM_PIN_COMPLETE = 101;
+ private static final int ENABLE_ICC_PIN_COMPLETE = 100;
+ private static final int CHANGE_ICC_PIN_COMPLETE = 101;
- // For replies from SimCard interface
+ // For replies from IccCard interface
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
AsyncResult ar = (AsyncResult) msg.obj;
switch (msg.what) {
- case ENABLE_SIM_PIN_COMPLETE:
- simLockChanged(ar.exception == null);
+ case ENABLE_ICC_PIN_COMPLETE:
+ iccLockChanged(ar.exception == null);
break;
- case CHANGE_SIM_PIN_COMPLETE:
- simPinChanged(ar.exception == null);
+ case CHANGE_ICC_PIN_COMPLETE:
+ iccPinChanged(ar.exception == null);
break;
}
@@ -102,24 +103,24 @@ public class SimLockSettings extends PreferenceActivity
};
// For top-level settings screen to query
- static boolean isSimLockEnabled() {
- return PhoneFactory.getDefaultPhone().getSimCard().getSimLockEnabled();
+ static boolean isIccLockEnabled() {
+ return PhoneFactory.getDefaultPhone().getIccCard().getIccLockEnabled();
}
static String getSummary(Context context) {
Resources res = context.getResources();
- String summary = isSimLockEnabled()
- ? res.getString(R.string.sim_lock_on)
+ String summary = isIccLockEnabled()
+ ? res.getString(R.string.sim_lock_on)
: res.getString(R.string.sim_lock_off);
return summary;
}
-
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
-
+
addPreferencesFromResource(R.xml.sim_lock_settings);
-
+
mPinDialog = (EditPinPreference) findPreference(PIN_DIALOG);
mPinToggle = (CheckBoxPreference) findPreference(PIN_TOGGLE);
if (savedInstanceState != null && savedInstanceState.containsKey(DIALOG_STATE)) {
@@ -142,7 +143,7 @@ public class SimLockSettings extends PreferenceActivity
protected void onResume() {
super.onResume();
- mPinToggle.setChecked(mPhone.getSimCard().getSimLockEnabled());
+ mPinToggle.setChecked(mPhone.getIccCard().getIccLockEnabled());
if (mDialogState != OFF_MODE) {
showPinDialog();
@@ -182,21 +183,21 @@ public class SimLockSettings extends PreferenceActivity
mPinDialog.setText(mPin);
String message = "";
switch (mDialogState) {
- case SIM_LOCK_MODE:
+ case ICC_LOCK_MODE:
message = mRes.getString(R.string.sim_enter_pin);
mPinDialog.setDialogTitle(mToState
? mRes.getString(R.string.sim_enable_sim_lock)
: mRes.getString(R.string.sim_disable_sim_lock));
break;
- case SIM_OLD_MODE:
+ case ICC_OLD_MODE:
message = mRes.getString(R.string.sim_enter_old);
mPinDialog.setDialogTitle(mRes.getString(R.string.sim_change_pin));
break;
- case SIM_NEW_MODE:
+ case ICC_NEW_MODE:
message = mRes.getString(R.string.sim_enter_new);
mPinDialog.setDialogTitle(mRes.getString(R.string.sim_change_pin));
break;
- case SIM_REENTER_MODE:
+ case ICC_REENTER_MODE:
message = mRes.getString(R.string.sim_reenter_new);
mPinDialog.setDialogTitle(mRes.getString(R.string.sim_change_pin));
break;
@@ -222,26 +223,26 @@ public class SimLockSettings extends PreferenceActivity
return;
}
switch (mDialogState) {
- case SIM_LOCK_MODE:
- tryChangeSimLockState();
+ case ICC_LOCK_MODE:
+ tryChangeIccLockState();
break;
- case SIM_OLD_MODE:
+ case ICC_OLD_MODE:
mOldPin = mPin;
- mDialogState = SIM_NEW_MODE;
+ mDialogState = ICC_NEW_MODE;
mError = null;
mPin = null;
showPinDialog();
break;
- case SIM_NEW_MODE:
+ case ICC_NEW_MODE:
mNewPin = mPin;
- mDialogState = SIM_REENTER_MODE;
+ mDialogState = ICC_REENTER_MODE;
mPin = null;
showPinDialog();
break;
- case SIM_REENTER_MODE:
+ case ICC_REENTER_MODE:
if (!mPin.equals(mNewPin)) {
mError = mRes.getString(R.string.sim_pins_dont_match);
- mDialogState = SIM_NEW_MODE;
+ mDialogState = ICC_NEW_MODE;
mPin = null;
showPinDialog();
} else {
@@ -258,21 +259,21 @@ public class SimLockSettings extends PreferenceActivity
mToState = mPinToggle.isChecked();
// Flip it back and pop up pin dialog
mPinToggle.setChecked(!mToState);
- mDialogState = SIM_LOCK_MODE;
+ mDialogState = ICC_LOCK_MODE;
showPinDialog();
}
return true;
}
- private void tryChangeSimLockState() {
- // Try to change sim lock. If it succeeds, toggle the lock state and
+ private void tryChangeIccLockState() {
+ // Try to change icc lock. If it succeeds, toggle the lock state and
// reset dialog state. Else inject error message and show dialog again.
- Message callback = Message.obtain(mHandler, ENABLE_SIM_PIN_COMPLETE);
- mPhone.getSimCard().setSimLockEnabled(mToState, mPin, callback);
+ Message callback = Message.obtain(mHandler, ENABLE_ICC_PIN_COMPLETE);
+ mPhone.getIccCard().setIccLockEnabled(mToState, mPin, callback);
}
- private void simLockChanged(boolean success) {
+ private void iccLockChanged(boolean success) {
if (success) {
mPinToggle.setChecked(mToState);
} else {
@@ -283,14 +284,14 @@ public class SimLockSettings extends PreferenceActivity
resetDialogState();
}
- private void simPinChanged(boolean success) {
+ private void iccPinChanged(boolean success) {
if (!success) {
// TODO: I18N
- Toast.makeText(this, mRes.getString(R.string.sim_change_failed),
+ Toast.makeText(this, mRes.getString(R.string.sim_change_failed),
Toast.LENGTH_SHORT)
.show();
} else {
- Toast.makeText(this, mRes.getString(R.string.sim_change_succeeded),
+ Toast.makeText(this, mRes.getString(R.string.sim_change_succeeded),
Toast.LENGTH_SHORT)
.show();
@@ -299,8 +300,8 @@ public class SimLockSettings extends PreferenceActivity
}
private void tryChangePin() {
- Message callback = Message.obtain(mHandler, CHANGE_SIM_PIN_COMPLETE);
- mPhone.getSimCard().changeSimLockPassword(mOldPin,
+ Message callback = Message.obtain(mHandler, CHANGE_ICC_PIN_COMPLETE);
+ mPhone.getIccCard().changeIccLockPassword(mOldPin,
mNewPin, callback);
}
@@ -314,7 +315,7 @@ public class SimLockSettings extends PreferenceActivity
private void resetDialogState() {
mError = null;
- mDialogState = SIM_OLD_MODE; // Default for when Change PIN is clicked
+ mDialogState = ICC_OLD_MODE; // Default for when Change PIN is clicked
mPin = "";
setDialogValues();
}
diff --git a/src/com/android/settings/InstalledAppDetails.java b/src/com/android/settings/InstalledAppDetails.java
index 327874b..5a4e672 100644
--- a/src/com/android/settings/InstalledAppDetails.java
+++ b/src/com/android/settings/InstalledAppDetails.java
@@ -22,13 +22,16 @@ import com.android.settings.R;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
+import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageDataObserver;
+import android.content.pm.IPackageDeleteObserver;
import android.content.pm.IPackageStatsObserver;
+import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageStats;
import android.content.pm.PackageManager.NameNotFoundException;
@@ -36,6 +39,7 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
+import android.os.RemoteException;
import android.text.format.Formatter;
import android.util.Config;
import android.util.Log;
@@ -64,9 +68,8 @@ public class InstalledAppDetails extends Activity implements View.OnClickListene
private ApplicationInfo mAppInfo;
private Button mAppButton;
private Button mActivitiesButton;
- private boolean mCanUninstall;
- private boolean localLOGV=Config.LOGV || false;
- private TextView mAppSnippetSize;
+ private boolean localLOGV = false;
+ private TextView mAppVersion;
private TextView mTotalSize;
private TextView mAppSize;
private TextView mDataSize;
@@ -100,10 +103,18 @@ public class InstalledAppDetails extends Activity implements View.OnClickListene
private CharSequence mComputingStr;
private CharSequence mAppButtonText;
+ // Dialog identifiers used in showDialog
+ private static final int DLG_BASE = 0;
+ private static final int DLG_CLEAR_DATA = DLG_BASE + 1;
+ private static final int DLG_FACTORY_RESET = DLG_BASE + 2;
+ private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3;
+ private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4;
+
// Possible btn states
private enum AppButtonStates {
CLEAR_DATA,
UNINSTALL,
+ FACTORY_RESET,
NONE
}
private AppButtonStates mAppButtonState;
@@ -127,14 +138,6 @@ public class InstalledAppDetails extends Activity implements View.OnClickListene
}
};
- private boolean isUninstallable() {
- if (((mAppInfo.flags&ApplicationInfo.FLAG_SYSTEM) != 0) &&
- ((mAppInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0)) {
- return false;
- }
- return true;
- }
-
class ClearUserDataObserver extends IPackageDataObserver.Stub {
public void onRemoveCompleted(final String packageName, final boolean succeeded) {
final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA);
@@ -154,7 +157,7 @@ public class InstalledAppDetails extends Activity implements View.OnClickListene
}
}
-
+
class ClearCacheObserver extends IPackageDataObserver.Stub {
public void onRemoveCompleted(final String packageName, final boolean succeeded) {
final Message msg = mHandler.obtainMessage(CLEAR_CACHE);
@@ -170,40 +173,13 @@ public class InstalledAppDetails extends Activity implements View.OnClickListene
return Formatter.formatFileSize(this, size);
}
- private void setAppBtnState() {
- boolean visible = false;
- if(mCanUninstall) {
- //app can clear user data
- if((mAppInfo.flags & ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA)
- == ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA) {
- mAppButtonText = getText(R.string.clear_user_data_text);
- mAppButtonState = AppButtonStates.CLEAR_DATA;
- visible = true;
- } else {
- //hide button if diableClearUserData is set
- visible = false;
- mAppButtonState = AppButtonStates.NONE;
- }
- } else {
- visible = true;
- mAppButtonState = AppButtonStates.UNINSTALL;
- mAppButtonText = getText(R.string.uninstall_text);
- }
- if(visible) {
- mAppButton.setText(mAppButtonText);
- mAppButton.setVisibility(View.VISIBLE);
- } else {
- mAppButton.setVisibility(View.GONE);
- }
- }
-
/** Called when the activity is first created. */
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
- //get package manager
+ // Get package manager
mPm = getPackageManager();
- //get application's name from intent
+ // Get application's name from intent
Intent intent = getIntent();
final String packageName = intent.getStringExtra(ManageApplications.APP_PKG_NAME);
mComputingStr = getText(R.string.computing_size);
@@ -212,45 +188,31 @@ public class InstalledAppDetails extends Activity implements View.OnClickListene
totalSizeStr = appSizeStr = dataSizeStr = mComputingStr;
if(localLOGV) Log.i(TAG, "Have to compute package sizes");
mSizeObserver = new PkgSizeObserver();
- mPm.getPackageSizeInfo(packageName, mSizeObserver);
-
try {
mAppInfo = mPm.getApplicationInfo(packageName,
PackageManager.GET_UNINSTALLED_PACKAGES);
} catch (NameNotFoundException e) {
Log.e(TAG, "Exception when retrieving package:"+packageName, e);
- displayErrorDialog(R.string.app_not_found_dlg_text, true, true);
- }
- setContentView(R.layout.installed_app_details);
- ((ImageView)findViewById(R.id.app_icon)).setImageDrawable(mAppInfo.loadIcon(mPm));
- //set application name TODO version
- CharSequence appName = mAppInfo.loadLabel(mPm);
- if(appName == null) {
- appName = getString(_UNKNOWN_APP);
+ showDialogInner(DLG_APP_NOT_FOUND);
+ return;
}
- ((TextView)findViewById(R.id.app_name)).setText(appName);
- mAppSnippetSize = ((TextView)findViewById(R.id.app_size));
- mAppSnippetSize.setText(totalSizeStr);
+ setContentView(R.layout.installed_app_details);
//TODO download str and download url
- //set values on views
+ // 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 AppButton
mAppButton = ((Button)findViewById(R.id.uninstall_button));
- //determine if app is a system app
- mCanUninstall = !isUninstallable();
- if(localLOGV) Log.i(TAG, "Is systemPackage "+mCanUninstall);
- setAppBtnState();
+ // Get ManageSpaceButton
mManageSpaceButton = (Button)findViewById(R.id.manage_space_button);
if(mAppInfo.manageSpaceActivityName != null) {
mManageSpaceButton.setVisibility(View.VISIBLE);
mManageSpaceButton.setOnClickListener(this);
}
-
// Cache section
mCachePanel = findViewById(R.id.cache_panel);
mCacheSize = (TextView) findViewById(R.id.cache_size_text);
@@ -258,17 +220,16 @@ public class InstalledAppDetails extends Activity implements View.OnClickListene
mClearCacheButton = (Button) findViewById(R.id.clear_cache_button);
mForceStopButton = (Button) findViewById(R.id.force_stop_button);
mForceStopButton.setOnClickListener(this);
-
- //clear activities
+ // 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
+ // 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
+ // Disable clear activities button
autoLaunchView.setText(R.string.auto_launch_disable_text);
mActivitiesButton.setEnabled(false);
} else {
@@ -276,7 +237,7 @@ public class InstalledAppDetails extends Activity implements View.OnClickListene
mActivitiesButton.setOnClickListener(this);
}
- // security permissions section
+ // Security permissions section
LinearLayout permsView = (LinearLayout) findViewById(R.id.permissions_section);
AppSecurityPermissions asp = new AppSecurityPermissions(this, packageName);
if(asp.getPermissionCount() > 0) {
@@ -290,21 +251,85 @@ public class InstalledAppDetails extends Activity implements View.OnClickListene
}
}
- private void displayErrorDialog(int msgId, final boolean finish, final boolean changed) {
- //display confirmation dialog
- new AlertDialog.Builder(this)
- .setTitle(getString(R.string.app_not_found_dlg_title))
- .setIcon(android.R.drawable.ic_dialog_alert)
- .setMessage(getString(msgId))
- .setNeutralButton(getString(R.string.dlg_ok),
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- //force to recompute changed value
- setIntentAndFinish(finish, changed);
- }
+ private void refreshAppAttributes(PackageInfo pkgInfo) {
+ setAppLabelAndIcon();
+ // Version number of application
+ setAppVersion(pkgInfo);
+ setAppBtnState();
+ // Refresh size info
+ if (mAppInfo != null && mAppInfo.packageName != null) {
+ mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver);
+ }
+ }
+
+ // Utility method to set applicaiton label and icon.
+ private void setAppLabelAndIcon() {
+ ((ImageView)findViewById(R.id.app_icon)).setImageDrawable(mAppInfo.loadIcon(mPm));
+ //set application name TODO version
+ CharSequence appName = mAppInfo.loadLabel(mPm);
+ if(appName == null) {
+ appName = getString(_UNKNOWN_APP);
+ }
+ ((TextView)findViewById(R.id.app_name)).setText(appName);
+ }
+
+ // Utility method to set application version
+ private void setAppVersion(PackageInfo pkgInfo) {
+ // Version number of application
+ mAppVersion = ((TextView)findViewById(R.id.app_version));
+ if (pkgInfo != null) {
+ mAppVersion.setVisibility(View.VISIBLE);
+ mAppVersion.setText(getString(R.string.version_text,
+ String.valueOf(pkgInfo.versionCode)));
+ } else {
+ mAppVersion.setVisibility(View.GONE);
+ }
+ }
+
+ // Utility method to set button state
+ private void setAppBtnState() {
+ boolean visible = true;
+ if ((mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
+ if ((mAppInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
+ mAppButtonState = AppButtonStates.FACTORY_RESET;
+ mAppButtonText = getText(R.string.app_factory_reset);
+ } else {
+ if ((mAppInfo.flags & ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA) == 0) {
+ // Hide button if diableClearUserData is set
+ mAppButtonState = AppButtonStates.NONE;
+ visible = false;
+ } else {
+ mAppButtonState = AppButtonStates.CLEAR_DATA;
+ mAppButtonText = getText(R.string.clear_user_data_text);
}
- )
- .show();
+ }
+ } else {
+ mAppButtonState = AppButtonStates.UNINSTALL;
+ mAppButtonText = getText(R.string.uninstall_text);
+ }
+ if(visible) {
+ mAppButton.setText(mAppButtonText);
+ mAppButton.setVisibility(View.VISIBLE);
+ } else {
+ mAppButton.setVisibility(View.GONE);
+ }
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ PackageInfo pkgInfo;
+ // Get application info again to refresh changed properties of application
+ try {
+ mAppInfo = mPm.getApplicationInfo(mAppInfo.packageName,
+ PackageManager.GET_UNINSTALLED_PACKAGES);
+ pkgInfo = mPm.getPackageInfo(mAppInfo.packageName, 0);
+ } catch (NameNotFoundException e) {
+ Log.e(TAG, "Exception when retrieving package:" + mAppInfo.packageName, e);
+ showDialogInner(DLG_APP_NOT_FOUND);
+ return;
+ }
+ refreshAppAttributes(pkgInfo);
}
private void setIntentAndFinish(boolean finish, boolean appChanged) {
@@ -331,7 +356,6 @@ public class InstalledAppDetails extends Activity implements View.OnClickListene
mSizeInfo = newPs;
String str = getSizeStr(newTot);
mTotalSize.setText(str);
- mAppSnippetSize.setText(str);
mAppSize.setText(getSizeStr(newPs.codeSize));
mDataSize.setText(getSizeStr(newPs.dataSize));
mCacheSize.setText(getSizeStr(newPs.cacheSize));
@@ -340,7 +364,6 @@ public class InstalledAppDetails extends Activity implements View.OnClickListene
if(newTot != oldTot) {
String str = getSizeStr(newTot);
mTotalSize.setText(str);
- mAppSnippetSize.setText(str);
changed = true;
}
if(newPs.codeSize != mSizeInfo.codeSize) {
@@ -415,14 +438,76 @@ public class InstalledAppDetails extends Activity implements View.OnClickListene
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
boolean res = am.clearApplicationUserData(packageName, mClearDataObserver);
if(!res) {
- //doesnt initiate clear. some error. should not happen but just log error for now
+ // Clearing data failed for some obscure reason. Just log error for now
Log.i(TAG, "Couldnt clear application user data for package:"+packageName);
- displayErrorDialog(R.string.clear_data_failed, false, false);
+ showDialogInner(DLG_CANNOT_CLEAR_DATA);
} else {
mAppButton.setText(R.string.recompute_size);
}
}
+ private void showDialogInner(int id) {
+ //removeDialog(id);
+ showDialog(id);
+ }
+
+ @Override
+ public Dialog onCreateDialog(int id) {
+ switch (id) {
+ case DLG_CLEAR_DATA:
+ return new AlertDialog.Builder(this)
+ .setTitle(getString(R.string.clear_data_dlg_title))
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setMessage(getString(R.string.clear_data_dlg_text))
+ .setPositiveButton(R.string.dlg_ok, this)
+ .setNegativeButton(R.string.dlg_cancel, this)
+ .create();
+ case DLG_FACTORY_RESET:
+ return new AlertDialog.Builder(this)
+ .setTitle(getString(R.string.app_factory_reset_dlg_title))
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setMessage(getString(R.string.app_factory_reset_dlg_text))
+ .setPositiveButton(R.string.dlg_ok, this)
+ .setNegativeButton(R.string.dlg_cancel, this)
+ .create();
+ case DLG_APP_NOT_FOUND:
+ return new AlertDialog.Builder(this)
+ .setTitle(getString(R.string.app_not_found_dlg_title))
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setMessage(getString(R.string.app_not_found_dlg_title))
+ .setNeutralButton(getString(R.string.dlg_ok),
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ //force to recompute changed value
+ setIntentAndFinish(true, true);
+ }
+ })
+ .create();
+ case DLG_CANNOT_CLEAR_DATA:
+ return new AlertDialog.Builder(this)
+ .setTitle(getString(R.string.clear_failed_dlg_title))
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setMessage(getString(R.string.clear_failed_dlg_text))
+ .setNeutralButton(R.string.dlg_ok,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ //force to recompute changed value
+ setIntentAndFinish(false, false);
+ }
+ })
+ .create();
+ }
+ return null;
+ }
+
+ private void uninstallPkg(String packageName) {
+ // Create new intent to launch Uninstaller activity
+ Uri packageURI = Uri.parse("package:"+packageName);
+ Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
+ startActivity(uninstallIntent);
+ setIntentAndFinish(true, true);
+ }
+
/*
* Method implementing functionality of buttons clicked
* @see android.view.View.OnClickListener#onClick(android.view.View)
@@ -430,21 +515,12 @@ public class InstalledAppDetails extends Activity implements View.OnClickListene
public void onClick(View v) {
String packageName = mAppInfo.packageName;
if(v == mAppButton) {
- if(mCanUninstall) {
- //display confirmation dialog
- new AlertDialog.Builder(this)
- .setTitle(getString(R.string.clear_data_dlg_title))
- .setIcon(android.R.drawable.ic_dialog_alert)
- .setMessage(getString(R.string.clear_data_dlg_text))
- .setPositiveButton(R.string.dlg_ok, this)
- .setNegativeButton(R.string.dlg_cancel, this)
- .show();
- } else {
- //create new intent to launch Uninstaller activity
- Uri packageURI = Uri.parse("package:"+packageName);
- Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
- startActivity(uninstallIntent);
- setIntentAndFinish(true, true);
+ if (mAppButtonState == AppButtonStates.CLEAR_DATA) {
+ showDialogInner(DLG_CLEAR_DATA);
+ } else if (mAppButtonState == AppButtonStates.FACTORY_RESET) {
+ showDialogInner(DLG_FACTORY_RESET);
+ } else if (mAppButtonState == AppButtonStates.UNINSTALL) {
+ uninstallPkg(packageName);
}
} else if(v == mActivitiesButton) {
mPm.clearPackagePreferredActivities(packageName);
@@ -468,8 +544,13 @@ public class InstalledAppDetails extends Activity implements View.OnClickListene
public void onClick(DialogInterface dialog, int which) {
if(which == AlertDialog.BUTTON_POSITIVE) {
- //invoke uninstall or clear user data based on sysPackage
- initiateClearUserDataForSysPkg();
+ if (mAppButtonState == AppButtonStates.CLEAR_DATA) {
+ // Invoke uninstall or clear user data based on sysPackage
+ initiateClearUserDataForSysPkg();
+ } else if (mAppButtonState == AppButtonStates.FACTORY_RESET) {
+ // Initiate package installer to delete package
+ uninstallPkg(mAppInfo.packageName);
+ }
} else {
//cancel do nothing just retain existing screen
}
diff --git a/src/com/android/settings/LocalePicker.java b/src/com/android/settings/LocalePicker.java
index 386d7e0..ecd9689 100644
--- a/src/com/android/settings/LocalePicker.java
+++ b/src/com/android/settings/LocalePicker.java
@@ -30,6 +30,7 @@ import android.widget.ListView;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
+import java.text.Collator;
import java.util.Arrays;
import java.util.Locale;
@@ -38,7 +39,9 @@ public class LocalePicker extends ListActivity {
Loc[] mLocales;
- private static class Loc {
+ private static class Loc implements Comparable {
+ static Collator sCollator = Collator.getInstance();
+
String label;
Locale locale;
@@ -51,6 +54,10 @@ public class LocalePicker extends ListActivity {
public String toString() {
return this.label;
}
+
+ public int compareTo(Object o) {
+ return sCollator.compare(this.label, ((Loc) o).label);
+ }
}
int getContentView() {
@@ -71,38 +78,42 @@ public class LocalePicker extends ListActivity {
for (int i = 0 ; i < origSize; i++ ) {
String s = locales[i];
int len = s.length();
- if (len == 2) {
- Locale l = new Locale(s);
- preprocess[finalSize++] = new Loc(toTitleCase(l.getDisplayLanguage()), l);
- } else if (len == 5) {
+ if (len == 5) {
String language = s.substring(0, 2);
String country = s.substring(3, 5);
Locale l = new Locale(language, country);
if (finalSize == 0) {
- preprocess[finalSize++] = new Loc(toTitleCase(l.getDisplayLanguage()), l);
+ Log.v(TAG, "adding initial "+
+ toTitleCase(l.getDisplayLanguage(l)));
+ preprocess[finalSize++] =
+ new Loc(toTitleCase(l.getDisplayLanguage(l)), l);
} else {
// check previous entry:
- // same lang and no country -> overwrite it with a lang-only name
- // same lang and a country -> upgrade to full name and
+ // same lang and a country -> upgrade to full name and
// insert ours with full name
// diff lang -> insert ours with lang-only name
- if (preprocess[finalSize-1].locale.getLanguage().equals(language)) {
- String prevCountry = preprocess[finalSize-1].locale.getCountry();
- if (prevCountry.length() == 0) {
- preprocess[finalSize-1].locale = l;
- preprocess[finalSize-1].label = toTitleCase(l.getDisplayLanguage());
- } else {
- preprocess[finalSize-1].label = toTitleCase(preprocess[finalSize-1].locale.getDisplayName());
- preprocess[finalSize++] = new Loc(toTitleCase(l.getDisplayName()), l);
- }
+ if (preprocess[finalSize-1].locale.getLanguage().equals(
+ language)) {
+ Log.v(TAG, "backing up and fixing "+
+ preprocess[finalSize-1].label+" to "+
+ preprocess[finalSize-1].locale.
+ getDisplayName(l));
+ preprocess[finalSize-1].label = toTitleCase(
+ preprocess[finalSize-1].
+ locale.getDisplayName(l));
+ Log.v(TAG, " and adding "+
+ toTitleCase(l.getDisplayName(l)));
+ preprocess[finalSize++] =
+ new Loc(toTitleCase(l.getDisplayName(l)), l);
} else {
String displayName;
if (s.equals("zz_ZZ")) {
displayName = "Pseudo...";
} else {
- displayName = toTitleCase(l.getDisplayLanguage());
+ displayName = toTitleCase(l.getDisplayLanguage(l));
}
+ Log.v(TAG, "adding "+displayName);
preprocess[finalSize++] = new Loc(displayName, l);
}
}
@@ -112,9 +123,11 @@ public class LocalePicker extends ListActivity {
for (int i = 0; i < finalSize ; i++) {
mLocales[i] = preprocess[i];
}
+ Arrays.sort(mLocales);
int layoutId = R.layout.locale_picker_item;
int fieldId = R.id.locale;
- ArrayAdapter<Loc> adapter = new ArrayAdapter<Loc>(this, layoutId, fieldId, mLocales);
+ ArrayAdapter<Loc> adapter =
+ new ArrayAdapter<Loc>(this, layoutId, fieldId, mLocales);
getListView().setAdapter(adapter);
}
diff --git a/src/com/android/settings/RadioInfo.java b/src/com/android/settings/RadioInfo.java
index 5df9313..79327f2 100644
--- a/src/com/android/settings/RadioInfo.java
+++ b/src/com/android/settings/RadioInfo.java
@@ -94,7 +94,7 @@ public class RadioInfo extends Activity {
private static final int MENU_ITEM_TOGGLE_DATA = 5;
private static final int MENU_ITEM_TOGGLE_DATA_ON_BOOT = 6;
- private TextView mImei;
+ private TextView mDeviceId; //DeviceId is the IMEI in GSM and the MEID in CDMA
private TextView number;
private TextView callState;
private TextView operatorName;
@@ -405,7 +405,7 @@ public class RadioInfo extends Activity {
mTelephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
phone = PhoneFactory.getDefaultPhone();
- mImei = (TextView) findViewById(R.id.imei);
+ mDeviceId= (TextView) findViewById(R.id.imei);
number = (TextView) findViewById(R.id.number);
callState = (TextView) findViewById(R.id.call);
operatorName = (TextView) findViewById(R.id.operator);
@@ -518,7 +518,8 @@ public class RadioInfo extends Activity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
- menu.add(0, MENU_ITEM_SELECT_BAND, 0, R.string.radio_info_band_mode_label).setOnMenuItemClickListener(mSelectBandCallback)
+ menu.add(0, MENU_ITEM_SELECT_BAND, 0, R.string.radio_info_band_mode_label)
+ .setOnMenuItemClickListener(mSelectBandCallback)
.setAlphabeticShortcut('b');
menu.add(1, MENU_ITEM_VIEW_ADN, 0,
R.string.radioInfo_menu_viewADN).setOnMenuItemClickListener(mViewADNCallback);
@@ -531,14 +532,14 @@ public class RadioInfo extends Activity {
menu.add(1, MENU_ITEM_TOGGLE_DATA,
0, R.string.radioInfo_menu_disableData).setOnMenuItemClickListener(mToggleData);
menu.add(1, MENU_ITEM_TOGGLE_DATA_ON_BOOT,
- 0, R.string.radioInfo_menu_disableDataOnBoot).setOnMenuItemClickListener(mToggleDataOnBoot);
+ 0, R.string.radioInfo_menu_disableDataOnBoot).setOnMenuItemClickListener(
+ mToggleDataOnBoot);
return true;
}
@Override
- public boolean onPrepareOptionsMenu(Menu menu)
- {
+ public boolean onPrepareOptionsMenu(Menu menu) {
// Get the TOGGLE DATA menu item in the right state.
MenuItem item = menu.findItem(MENU_ITEM_TOGGLE_DATA);
int state = mTelephonyManager.getDataState();
@@ -575,11 +576,10 @@ public class RadioInfo extends Activity {
}
private void updatePowerState() {
- //log("updatePowerState");
String buttonText = isRadioOn() ?
getString(R.string.turn_off_radio) :
getString(R.string.turn_on_radio);
- radioPowerButton.setText(buttonText);
+ radioPowerButton.setText(buttonText);
}
private void updateQxdmState(Boolean newQxdmStatus) {
@@ -619,24 +619,24 @@ public class RadioInfo extends Activity {
}
private void updateDnsCheckState() {
- GSMPhone gsmPhone = (GSMPhone) phone;
- dnsCheckState.setText(gsmPhone.isDnsCheckDisabled() ?
+ dnsCheckState.setText(phone.isDnsCheckDisabled() ?
"0.0.0.0 allowed" :"0.0.0.0 not allowed");
}
-
+
private final void
updateSignalStrength() {
- int state =
- mPhoneStateReceiver.getServiceState().getState();
+ // TODO PhoneStateIntentReceiver is deprecated and PhoneStateListener
+ // should probably used instead.
+ int state = mPhoneStateReceiver.getServiceState().getState();
Resources r = getResources();
if ((ServiceState.STATE_OUT_OF_SERVICE == state) ||
(ServiceState.STATE_POWER_OFF == state)) {
dBm.setText("0");
}
-
+
int signalDbm = mPhoneStateReceiver.getSignalStrengthDbm();
-
+
if (-1 == signalDbm) signalDbm = 0;
int signalAsu = mPhoneStateReceiver.getSignalStrength();
@@ -650,11 +650,15 @@ public class RadioInfo extends Activity {
}
private final void updateLocation(CellLocation location) {
- GsmCellLocation loc = (GsmCellLocation)location;
- Resources r = getResources();
+ int lac = -1;
+ int cid = -1;
+ if (location instanceof GsmCellLocation) {
+ GsmCellLocation loc = (GsmCellLocation)location;
+ lac = loc.getLac();
+ cid = loc.getCid();
+ }
- int lac = loc.getLac();
- int cid = loc.getCid();
+ Resources r = getResources();
mLocation.setText(r.getString(R.string.radioInfo_lac) + " = "
+ ((lac == -1) ? "unknown" : Integer.toHexString(lac))
@@ -782,8 +786,9 @@ public class RadioInfo extends Activity {
s = phone.getDeviceId();
if (s == null) s = r.getString(R.string.radioInfo_unknown);
- mImei.setText(s);
+ mDeviceId.setText(s);
+
s = phone.getLine1Number();
if (s == null) s = r.getString(R.string.radioInfo_unknown);
number.setText(s);
@@ -1030,7 +1035,7 @@ public class RadioInfo extends Activity {
private MenuItem.OnMenuItemClickListener mViewSDNCallback = new MenuItem.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
Intent intent = new Intent(
- Intent.ACTION_VIEW, Uri.parse("content://sim/sdn"));
+ Intent.ACTION_VIEW, Uri.parse("content://icc/sdn"));
// XXX We need to specify the component here because if we don't
// the activity manager will try to resolve the type by calling
// the content provider, which causes it to be loaded in a process
@@ -1085,7 +1090,7 @@ public class RadioInfo extends Activity {
private MenuItem.OnMenuItemClickListener mGetPdpList = new MenuItem.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
- phone.getPdpContextList(null);
+ phone.getDataCallList(null);
return true;
}
};
@@ -1122,8 +1127,7 @@ public class RadioInfo extends Activity {
OnClickListener mDnsCheckButtonHandler = new OnClickListener() {
public void onClick(View v) {
- GSMPhone gsmPhone = (GSMPhone) phone;
- gsmPhone.disableDnsCheck(!gsmPhone.isDnsCheckDisabled());
+ phone.disableDnsCheck(!phone.isDnsCheckDisabled());
updateDnsCheckState();
}
};
@@ -1170,7 +1174,7 @@ public class RadioInfo extends Activity {
mPreferredNetworkHandler = new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView parent, View v, int pos, long id) {
Message msg = mHandler.obtainMessage(EVENT_SET_PREFERRED_TYPE_DONE);
- if (pos>=0 && pos<=2) {
+ if (pos>=0 && pos<=7) { //IS THIS NEEDED to extend to the entire range of values
phone.setPreferredNetworkType(pos, msg);
}
}
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 6858fd3..166fa44 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -18,11 +18,11 @@ package com.android.settings;
import android.app.Activity;
-import android.app.AlertDialog;
+import android.content.ContentQueryMap;
import android.content.Context;
-import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.database.Cursor;
import android.location.LocationManager;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
@@ -34,13 +34,15 @@ import android.provider.Settings;
import android.util.Config;
import android.util.Log;
+import java.util.Observable;
+import java.util.Observer;
+
import com.android.internal.widget.LockPatternUtils;
/**
* Gesture lock pattern settings.
*/
-public class SecuritySettings extends PreferenceActivity
- implements DialogInterface.OnClickListener, DialogInterface.OnDismissListener {
+public class SecuritySettings extends PreferenceActivity {
// Lock Settings
@@ -64,10 +66,16 @@ public class SecuritySettings extends PreferenceActivity
private CheckBoxPreference mNetwork;
private CheckBoxPreference mGps;
- private LocationManager mLocationManager;
-
- // To track whether Agree was clicked in the Network location warning dialog
- private boolean mOkClicked;
+
+ // These provide support for receiving notification when Location Manager settings change.
+ // This is necessary because the Network Location Provider can change settings
+ // if the user does not confirm enabling the provider.
+ private ContentQueryMap mContentQueryMap;
+ private final class SettingsObserver implements Observer {
+ public void update(Observable o, Object arg) {
+ updateToggles();
+ }
+ }
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -77,14 +85,18 @@ public class SecuritySettings extends PreferenceActivity
mLockPatternUtils = new LockPatternUtils(getContentResolver());
createPreferenceHierarchy();
-
- // Get the available location providers
- mLocationManager = (LocationManager)
- getSystemService(Context.LOCATION_SERVICE);
mNetwork = (CheckBoxPreference) getPreferenceScreen().findPreference(LOCATION_NETWORK);
mGps = (CheckBoxPreference) getPreferenceScreen().findPreference(LOCATION_GPS);
updateToggles();
+
+ // listen for Location Manager settings changes
+ Cursor settingsCursor = getContentResolver().query(Settings.Secure.CONTENT_URI, null,
+ "(" + Settings.System.NAME + "=?)",
+ new String[]{Settings.Secure.LOCATION_PROVIDERS_ALLOWED},
+ null);
+ mContentQueryMap = new ContentQueryMap(settingsCursor, Settings.System.NAME, true, null);
+ mContentQueryMap.addObserver(new SettingsObserver());
}
private PreferenceScreen createPreferenceHierarchy() {
@@ -128,7 +140,7 @@ public class SecuritySettings extends PreferenceActivity
simLockPreferences.setTitle(R.string.sim_lock_settings_category);
// Intent to launch SIM lock settings
intent = new Intent();
- intent.setClassName("com.android.settings", "com.android.settings.SimLockSettings");
+ intent.setClassName("com.android.settings", "com.android.settings.IccLockSettings");
simLockPreferences.setIntent(intent);
PreferenceCategory simLockCat = new PreferenceCategory(this);
@@ -189,87 +201,24 @@ public class SecuritySettings extends PreferenceActivity
Settings.System.putInt(getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD,
mShowPassword.isChecked() ? 1 : 0);
} else if (preference == mNetwork) {
- //normally called on the toggle click
- if (mNetwork.isChecked()) {
- // Show a warning to the user that location data will be shared
- mOkClicked = false;
- new AlertDialog.Builder(this).setMessage(
- getResources().getString(R.string.location_warning_message))
- .setTitle(R.string.location_warning_title)
- .setIcon(android.R.drawable.ic_dialog_alert)
- .setPositiveButton(R.string.agree, this)
- .setNegativeButton(R.string.disagree, this)
- .show()
- .setOnDismissListener(this);
- } else {
- updateProviders();
- }
+ Settings.Secure.setLocationProviderEnabled(getContentResolver(),
+ LocationManager.NETWORK_PROVIDER, mNetwork.isChecked());
} else if (preference == mGps) {
- updateProviders();
+ Settings.Secure.setLocationProviderEnabled(getContentResolver(),
+ LocationManager.GPS_PROVIDER, mGps.isChecked());
}
return false;
}
- public void onClick(DialogInterface dialog, int which) {
- if (which == DialogInterface.BUTTON_POSITIVE) {
- updateProviders();
- mOkClicked = true;
- } else {
- // Reset the toggle
- mNetwork.setChecked(false);
- }
- }
-
- public void onDismiss(DialogInterface dialog) {
- // Assuming that onClick gets called first
- if (!mOkClicked) {
- mNetwork.setChecked(false);
- }
- }
-
/*
* Creates toggles for each available location provider
*/
private void updateToggles() {
- String providers = getAllowedProviders();
- mNetwork.setChecked(providers.contains(LocationManager.NETWORK_PROVIDER));
- mGps.setChecked(providers.contains(LocationManager.GPS_PROVIDER));
- }
-
- private void updateProviders() {
- String preferredProviders = "";
- if (mNetwork.isChecked()) {
- preferredProviders += LocationManager.NETWORK_PROVIDER;
- }
- if (mGps.isChecked()) {
- preferredProviders += "," + LocationManager.GPS_PROVIDER;
- }
- setProviders(preferredProviders);
- }
-
- private void setProviders(String providers) {
- // Update the secure setting LOCATION_PROVIDERS_ALLOWED
- Settings.Secure.putString(getContentResolver(),
- Settings.Secure.LOCATION_PROVIDERS_ALLOWED, providers);
- if (Config.LOGV) {
- Log.v("Location Accuracy", "Setting LOCATION_PROVIDERS_ALLOWED = " + providers);
- }
- // Inform the location manager about the changes
- mLocationManager.updateProviders();
- }
-
- /**
- * @return string containing a list of providers that have been enabled for use
- */
- private String getAllowedProviders() {
- String allowedProviders =
- Settings.Secure.getString(getContentResolver(),
- Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
- if (allowedProviders == null) {
- allowedProviders = "";
- }
- return allowedProviders;
+ mNetwork.setChecked(Settings.Secure.isLocationProviderEnabled(
+ getContentResolver(), LocationManager.NETWORK_PROVIDER));
+ mGps.setChecked(Settings.Secure.isLocationProviderEnabled(
+ getContentResolver(), LocationManager.GPS_PROVIDER));
}
private boolean isToggled(Preference pref) {
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 0c4545e..4f888ff 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -26,6 +26,7 @@ public class Settings extends PreferenceActivity {
private static final String KEY_PARENT = "parent";
private static final String KEY_CALL_SETTINGS = "call_settings";
private static final String KEY_SYNC_SETTINGS = "sync_settings";
+ private static final String KEY_SEARCH_SETTINGS = "search_settings";
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -35,6 +36,7 @@ public class Settings extends PreferenceActivity {
PreferenceGroup parent = (PreferenceGroup) findPreference(KEY_PARENT);
Utils.updatePreferenceToSpecificActivityOrRemove(this, parent, KEY_SYNC_SETTINGS, 0);
+ Utils.updatePreferenceToSpecificActivityOrRemove(this, parent, KEY_SEARCH_SETTINGS, 0);
}
@Override
diff --git a/src/com/android/settings/TextToSpeechSettings.java b/src/com/android/settings/TextToSpeechSettings.java
new file mode 100644
index 0000000..02fc06d
--- /dev/null
+++ b/src/com/android/settings/TextToSpeechSettings.java
@@ -0,0 +1,122 @@
+/*
+ * 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;
+
+import static android.provider.Settings.Secure.TTS_USE_DEFAULTS;
+import static android.provider.Settings.Secure.TTS_DEFAULT_RATE;
+import static android.provider.Settings.Secure.TTS_DEFAULT_PITCH;
+
+import android.content.ContentResolver;
+import android.os.Bundle;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.CheckBoxPreference;
+import android.provider.Settings;
+import android.util.Log;
+
+public class TextToSpeechSettings extends PreferenceActivity implements
+ Preference.OnPreferenceChangeListener {
+
+ private static final String TAG = "TextToSpeechSettings";
+
+ /** If there is no setting in the provider, use this. */
+ private static final int FALLBACK_TTS_DEFAULT_RATE = 100; // 1x
+ private static final int FALLBACK_TTS_DEFAULT_PITCH = 100;// 1x
+ private static final int FALLBACK_TTS_USE_DEFAULTS = 1;
+
+ private static final String KEY_TTS_USE_DEFAULT =
+ "toggle_use_default_tts_settings";
+ private static final String KEY_TTS_DEFAULT_RATE = "tts_default_rate";
+ private static final String KEY_TTS_DEFAULT_PITCH = "tts_default_pitch";
+
+ private CheckBoxPreference mUseDefaultPref = null;
+ private ListPreference mDefaultRatePref = null;
+ private ListPreference mDefaultPitchPref = null;
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ addPreferencesFromResource(R.xml.tts_settings);
+
+ initDefaultSettings();
+ }
+
+
+ private void initDefaultSettings() {
+ ContentResolver resolver = getContentResolver();
+
+ // "Use Defaults"
+ mUseDefaultPref =
+ (CheckBoxPreference) findPreference(KEY_TTS_USE_DEFAULT);
+ mUseDefaultPref.setChecked(Settings.System.getInt(resolver,
+ TTS_USE_DEFAULTS,
+ FALLBACK_TTS_USE_DEFAULTS) == 1 ? true : false);
+ mUseDefaultPref.setOnPreferenceChangeListener(this);
+
+ // Default rate
+ mDefaultRatePref =
+ (ListPreference) findPreference(KEY_TTS_DEFAULT_RATE);
+ mDefaultRatePref.setValue(String.valueOf(Settings.System.getInt(
+ resolver, TTS_DEFAULT_RATE, FALLBACK_TTS_DEFAULT_RATE)));
+ mDefaultRatePref.setOnPreferenceChangeListener(this);
+
+ // Default pitch
+ mDefaultPitchPref =
+ (ListPreference) findPreference(KEY_TTS_DEFAULT_PITCH);
+ mDefaultPitchPref.setValue(String.valueOf(Settings.System.getInt(
+ resolver, TTS_DEFAULT_PITCH, FALLBACK_TTS_DEFAULT_PITCH)));
+ mDefaultPitchPref.setOnPreferenceChangeListener(this);
+
+ }
+
+
+ public boolean onPreferenceChange(Preference preference, Object objValue) {
+ if (KEY_TTS_USE_DEFAULT.equals(preference.getKey())) {
+ // "Use Defaults"
+ int value = (Boolean)objValue ? 1 : 0;
+ Settings.System.putInt(getContentResolver(), TTS_USE_DEFAULTS,
+ value);
+ Log.i(TAG, "TTS use default settings is "+objValue.toString());
+ } else if (KEY_TTS_DEFAULT_RATE.equals(preference.getKey())) {
+ // Default rate
+ int value = Integer.parseInt((String) objValue);
+ try {
+ Settings.System.putInt(getContentResolver(),
+ TTS_DEFAULT_RATE, value);
+ Log.i(TAG, "TTS default rate is "+value);
+ } catch (NumberFormatException e) {
+ Log.e(TAG, "could not persist default TTS rate setting", e);
+ }
+ } else if (KEY_TTS_DEFAULT_PITCH.equals(preference.getKey())) {
+ // Default pitch
+ int value = Integer.parseInt((String) objValue);
+ try {
+ Settings.System.putInt(getContentResolver(),
+ TTS_DEFAULT_PITCH, value);
+ Log.i(TAG, "TTS default pitch is "+value);
+ } catch (NumberFormatException e) {
+ Log.e(TAG, "could not persist default TTS pitch setting", e);
+ }
+ }
+
+ return true;
+ }
+
+}
diff --git a/src/com/android/settings/battery_history/BatteryHistory.java b/src/com/android/settings/battery_history/BatteryHistory.java
index ad6479a..06f38ae 100644
--- a/src/com/android/settings/battery_history/BatteryHistory.java
+++ b/src/com/android/settings/battery_history/BatteryHistory.java
@@ -607,8 +607,8 @@ public class BatteryHistory extends Activity implements OnClickListener, OnItemS
Timer timer = se.getSensorTime();
if (timer != null) {
// Convert from microseconds to milliseconds with rounding
- long totalTime = (timer.getTotalTime(uSecNow, mWhich) + 500) / 1000;
- int count = timer.getCount(mWhich);
+ long totalTime = (timer.getTotalTimeLocked(uSecNow, mWhich) + 500) / 1000;
+ int count = timer.getCountLocked(mWhich);
if (handle == BatteryStats.Uid.Sensor.GPS) {
timeGps += totalTime;
countGps += count;
@@ -655,8 +655,8 @@ public class BatteryHistory extends Activity implements OnClickListener, OnItemS
Timer timer = wl.getWakeTime(BatteryStats.WAKE_TYPE_PARTIAL);
if (timer != null) {
// Convert from microseconds to milliseconds with rounding
- time += (timer.getTotalTime(uSecNow, mWhich) + 500) / 1000;
- count += timer.getCount(mWhich);
+ time += (timer.getTotalTimeLocked(uSecNow, mWhich) + 500) / 1000;
+ count += timer.getCountLocked(mWhich);
}
}
}
diff --git a/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java b/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java
index d458c5f..58fb569 100644
--- a/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java
+++ b/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java
@@ -30,7 +30,6 @@ import android.os.Handler;
import android.os.SystemProperties;
import android.preference.Preference;
import android.preference.CheckBoxPreference;
-import android.util.Log;
/**
* BluetoothDiscoverableEnabler is a helper to manage the "Discoverable"
@@ -39,7 +38,6 @@ import android.util.Log;
*/
public class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChangeListener {
private static final String TAG = "BluetoothDiscoverableEnabler";
- private static final boolean V = LocalBluetoothManager.V;
private static final String SYSTEM_PROPERTY_DISCOVERABLE_TIMEOUT =
"debug.bt.discoverable_time";
@@ -109,10 +107,6 @@ public class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChan
}
public boolean onPreferenceChange(Preference preference, Object value) {
- if (V) {
- Log.v(TAG, "Preference changed to " + value);
- }
-
// Turn on/off BT discoverability
setEnabled((Boolean) value);
@@ -155,10 +149,6 @@ public class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChan
}
private void handleModeChanged(int mode) {
- if (V) {
- Log.v(TAG, "Got mode changed: " + mode);
- }
-
if (mode == BluetoothDevice.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
mCheckBoxPreference.setChecked(true);
updateCountdownSummary();
diff --git a/src/com/android/settings/bluetooth/BluetoothEnabler.java b/src/com/android/settings/bluetooth/BluetoothEnabler.java
index 82961b8..af2722f 100644
--- a/src/com/android/settings/bluetooth/BluetoothEnabler.java
+++ b/src/com/android/settings/bluetooth/BluetoothEnabler.java
@@ -19,6 +19,7 @@ package com.android.settings.bluetooth;
import com.android.settings.R;
import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothError;
import android.bluetooth.BluetoothIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -48,7 +49,9 @@ public class BluetoothEnabler implements Preference.OnPreferenceChangeListener {
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- handleStateChanged(mLocalManager.getBluetoothState());
+ int state = intent.getIntExtra(BluetoothIntent.BLUETOOTH_STATE,
+ BluetoothError.ERROR);
+ handleStateChanged(state);
}
};
diff --git a/src/com/android/settings/bluetooth/BluetoothEventRedirector.java b/src/com/android/settings/bluetooth/BluetoothEventRedirector.java
index 71b91d3..af64c98 100644
--- a/src/com/android/settings/bluetooth/BluetoothEventRedirector.java
+++ b/src/com/android/settings/bluetooth/BluetoothEventRedirector.java
@@ -18,8 +18,8 @@ package com.android.settings.bluetooth;
import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothHeadset;
import android.bluetooth.BluetoothError;
+import android.bluetooth.BluetoothHeadset;
import android.bluetooth.BluetoothIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -27,6 +27,8 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
+import com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile;
+
/**
* BluetoothEventRedirector receives broadcasts and callbacks from the Bluetooth
* API and dispatches the event on the UI thread to the right class in the
@@ -89,9 +91,8 @@ public class BluetoothEventRedirector {
Log.i(TAG, "Failed to connect BT headset");
}
- boolean transientState = !(newState == BluetoothHeadset.STATE_CONNECTED
- || newState == BluetoothHeadset.STATE_DISCONNECTED);
- mManager.getLocalDeviceManager().onProfileStateChanged(address,transientState);
+ mManager.getLocalDeviceManager().onProfileStateChanged(address,
+ Profile.HEADSET, newState);
} else if (action.equals(BluetoothA2dp.SINK_STATE_CHANGED_ACTION)) {
int newState = intent.getIntExtra(BluetoothA2dp.SINK_STATE, 0);
@@ -101,9 +102,8 @@ public class BluetoothEventRedirector {
Log.i(TAG, "Failed to connect BT A2DP");
}
- boolean transientState = !(newState == BluetoothA2dp.STATE_CONNECTED
- || newState == BluetoothA2dp.STATE_DISCONNECTED);
- mManager.getLocalDeviceManager().onProfileStateChanged(address, transientState);
+ mManager.getLocalDeviceManager().onProfileStateChanged(address,
+ Profile.A2DP, newState);
} else if (action.equals(BluetoothIntent.REMOTE_DEVICE_CLASS_UPDATED_ACTION)) {
mManager.getLocalDeviceManager().onBtClassChanged(address);
diff --git a/src/com/android/settings/bluetooth/LocalBluetoothDevice.java b/src/com/android/settings/bluetooth/LocalBluetoothDevice.java
index 86b1d69..5259d7b 100644
--- a/src/com/android/settings/bluetooth/LocalBluetoothDevice.java
+++ b/src/com/android/settings/bluetooth/LocalBluetoothDevice.java
@@ -16,9 +16,6 @@
package com.android.settings.bluetooth;
-import com.android.settings.R;
-import com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile;
-
import android.app.AlertDialog;
import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothDevice;
@@ -32,6 +29,9 @@ import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
+import com.android.settings.R;
+import com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile;
+
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
@@ -47,6 +47,8 @@ import java.util.List;
*/
public class LocalBluetoothDevice implements Comparable<LocalBluetoothDevice> {
private static final String TAG = "LocalBluetoothDevice";
+ private static final boolean D = LocalBluetoothManager.D;
+ private static final boolean V = LocalBluetoothManager.V;
private static final int CONTEXT_ITEM_CONNECT = Menu.FIRST + 1;
private static final int CONTEXT_ITEM_DISCONNECT = Menu.FIRST + 2;
@@ -124,18 +126,21 @@ public class LocalBluetoothDevice implements Comparable<LocalBluetoothDevice> {
private static LinkedList<BluetoothJob> workQueue = new LinkedList<BluetoothJob>();
private void queueCommand(BluetoothJob job) {
- Log.d(TAG, workQueue.toString());
+ if (D) {
+ Log.d(TAG, workQueue.toString());
+ }
synchronized (workQueue) {
boolean processNow = pruneQueue(job);
// Add job to queue
- Log.d(TAG, "Adding: " + job.toString());
+ 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) {
- Log.d(TAG, "workQueue.size() == 1 || TimeOut -> process command now");
// If the failed to process, just drop it from the queue.
// There will be no callback to remove this from the queue.
processCommands();
@@ -156,7 +161,9 @@ public class LocalBluetoothDevice implements Comparable<LocalBluetoothDevice> {
&& existingJob.command == BluetoothCommand.CONNECT
&& existingJob.device.mAddress.equals(job.device.mAddress)
&& existingJob.profile == job.profile) {
- Log.d(TAG, "Removed because of a pending disconnect. " + existingJob);
+ if (D) {
+ Log.d(TAG, "Removed because of a pending disconnect. " + existingJob);
+ }
it.remove();
continue;
}
@@ -165,7 +172,6 @@ public class LocalBluetoothDevice implements Comparable<LocalBluetoothDevice> {
// 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.
- Log.d(TAG, "Age:" + (now - existingJob.timeSent));
if (existingJob.timeSent != 0
&& (now - existingJob.timeSent) >= MAX_WAIT_TIME_FOR_FRAMEWORK) {
Log.w(TAG, "Timeout. Removing Job:" + existingJob.toString());
@@ -191,45 +197,59 @@ public class LocalBluetoothDevice implements Comparable<LocalBluetoothDevice> {
}
if (successful) {
- Log.d(TAG, "Command sent successfully:" + job.toString());
- } else {
- Log.d(TAG, "Framework rejected command immediately:" + job.toString());
+ if (D) {
+ Log.d(TAG, "Command sent successfully:" + job.toString());
+ }
+ } else if (V) {
+ Log.v(TAG, "Framework rejected command immediately:" + job.toString());
}
-
- } else {
+ } else if (D) {
Log.d(TAG, "Job already has a sent time. Skip. " + job.toString());
}
return successful;
}
- public void onProfileStateChanged() {
- Log.d(TAG, "onProfileStateChanged:" + workQueue.toString());
- BluetoothJob job = workQueue.peek();
- if (job == null) {
- Log.v(TAG, "Yikes, onProfileStateChanged called but job queue is empty. "
- + "(Okay for device initiated actions and BluetoothA2dpService initiated "
- + "Auto-connections)");
- return;
- } else if (job.device.mAddress != mAddress) {
- // This can happen in 2 cases: 1) BT device initiated pairing and
- // 2) disconnects of one headset that's triggered by connects of
- // another.
- Log.v(TAG, "onProfileStateChanged called. The addresses differ. this.mAddress="
- + mAddress + " workQueue.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;
+ public void onProfileStateChanged(Profile profile, int newProfileState) {
+ 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);
}
- } else {
- // Remove the first item and process the next one
- Log.d(TAG, "LocalBluetoothDevice.onProfileStateChanged() called. MAC addr matched");
- workQueue.poll();
}
- processCommands();
+ /* 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.device.mAddress != mAddress) {
+ // 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, "mAddresses:" + mAddress + " != 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();
+ }
}
/*
@@ -240,7 +260,9 @@ public class LocalBluetoothDevice implements Comparable<LocalBluetoothDevice> {
* notification when it finishes processing a command
*/
private void processCommands() {
- Log.d(TAG, "processCommands:" + workQueue.toString());
+ if (D) {
+ Log.d(TAG, "processCommands:" + workQueue.toString());
+ }
Iterator<BluetoothJob> it = workQueue.iterator();
while (it.hasNext()) {
BluetoothJob job = it.next();
diff --git a/src/com/android/settings/bluetooth/LocalBluetoothDeviceManager.java b/src/com/android/settings/bluetooth/LocalBluetoothDeviceManager.java
index 9527980..2c70fd2 100644
--- a/src/com/android/settings/bluetooth/LocalBluetoothDeviceManager.java
+++ b/src/com/android/settings/bluetooth/LocalBluetoothDeviceManager.java
@@ -21,6 +21,7 @@ import android.util.Log;
import com.android.settings.R;
import com.android.settings.bluetooth.LocalBluetoothManager.Callback;
+import com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile;
import java.util.ArrayList;
import java.util.List;
@@ -181,19 +182,30 @@ public class LocalBluetoothDeviceManager {
* BluetoothDevice.UNBOND_REASON_*
*/
public synchronized void onBondingError(String address, int reason) {
- mLocalManager.showError(address, R.string.bluetooth_error_title,
- (reason == BluetoothDevice.UNBOND_REASON_AUTH_FAILED) ?
- R.string.bluetooth_pairing_pin_error_message :
- R.string.bluetooth_pairing_error_message);
+ int errorMsg;
+
+ switch(reason) {
+ case BluetoothDevice.UNBOND_REASON_AUTH_FAILED:
+ errorMsg = R.string.bluetooth_pairing_pin_error_message;
+ break;
+ case BluetoothDevice.UNBOND_REASON_AUTH_REJECTED:
+ errorMsg = R.string.bluetooth_pairing_rejected_error_message;
+ break;
+ case BluetoothDevice.UNBOND_REASON_REMOTE_DEVICE_DOWN:
+ errorMsg = R.string.bluetooth_pairing_device_down_error_message;
+ break;
+ default:
+ errorMsg = R.string.bluetooth_pairing_error_message;
+ }
+ mLocalManager.showError(address, R.string.bluetooth_error_title, errorMsg);
}
- public synchronized void onProfileStateChanged(String address, boolean transientState) {
+ public synchronized void onProfileStateChanged(String address, Profile profile,
+ int newProfileState) {
LocalBluetoothDevice device = findDevice(address);
if (device == null) return;
-
- if (!transientState) {
- device.onProfileStateChanged();
- }
+
+ device.onProfileStateChanged(profile, newProfileState);
device.refresh();
}
diff --git a/src/com/android/settings/bluetooth/LocalBluetoothManager.java b/src/com/android/settings/bluetooth/LocalBluetoothManager.java
index 1a848b2..2e84338 100644
--- a/src/com/android/settings/bluetooth/LocalBluetoothManager.java
+++ b/src/com/android/settings/bluetooth/LocalBluetoothManager.java
@@ -30,6 +30,7 @@ import android.bluetooth.BluetoothIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.util.Config;
import android.util.Log;
import android.widget.Toast;
@@ -40,7 +41,8 @@ import android.widget.Toast;
*/
public class LocalBluetoothManager {
private static final String TAG = "LocalBluetoothManager";
- static final boolean V = true;
+ static final boolean V = Config.LOGV;
+ static final boolean D = Config.LOGD && false;
private static final String SHARED_PREFERENCES_NAME = "bluetooth_settings";
@@ -199,9 +201,17 @@ public class LocalBluetoothManager {
}
private void syncBluetoothState() {
- setBluetoothStateInt(mManager.isEnabled()
- ? BluetoothDevice.BLUETOOTH_STATE_ON
- : BluetoothDevice.BLUETOOTH_STATE_OFF);
+ int bluetoothState;
+
+ if (mManager != null) {
+ bluetoothState = mManager.isEnabled()
+ ? BluetoothDevice.BLUETOOTH_STATE_ON
+ : BluetoothDevice.BLUETOOTH_STATE_OFF;
+ } else {
+ bluetoothState = BluetoothError.ERROR;
+ }
+
+ setBluetoothStateInt(bluetoothState);
}
public void setBluetoothEnabled(boolean enabled) {
diff --git a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java
index 24563a7..b396732 100644
--- a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java
+++ b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java
@@ -16,17 +16,14 @@
package com.android.settings.bluetooth;
-import com.android.settings.R;
-
import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothError;
import android.bluetooth.BluetoothHeadset;
-import android.bluetooth.BluetoothClass;
-import android.content.Context;
-import android.content.SharedPreferences;
import android.os.Handler;
import android.text.TextUtils;
+import com.android.settings.R;
+
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -102,6 +99,8 @@ public abstract class LocalBluetoothProfileManager {
public abstract int getSummary(String address);
+ public abstract int convertState(int a2dpState);
+
public abstract boolean isPreferred(String address);
public abstract void setPreferred(String address, boolean preferred);
@@ -176,7 +175,8 @@ public abstract class LocalBluetoothProfileManager {
preferred ? BluetoothA2dp.PRIORITY_AUTO : BluetoothA2dp.PRIORITY_OFF);
}
- private static int convertState(int a2dpState) {
+ @Override
+ public int convertState(int a2dpState) {
switch (a2dpState) {
case BluetoothA2dp.STATE_CONNECTED:
return SettingsBtStatus.CONNECTION_STATUS_CONNECTED;
@@ -217,7 +217,9 @@ public abstract class LocalBluetoothProfileManager {
*/
String address = mService.getHeadsetAddress();
if (TextUtils.isEmpty(address)) return;
- mLocalManager.getLocalDeviceManager().onProfileStateChanged(address, true);
+ mLocalManager.getLocalDeviceManager()
+ .onProfileStateChanged(address, Profile.HEADSET,
+ BluetoothHeadset.STATE_CONNECTED);
}
});
}
@@ -273,7 +275,8 @@ public abstract class LocalBluetoothProfileManager {
preferred ? BluetoothHeadset.PRIORITY_AUTO : BluetoothHeadset.PRIORITY_OFF);
}
- private static int convertState(int headsetState) {
+ @Override
+ public int convertState(int headsetState) {
switch (headsetState) {
case BluetoothHeadset.STATE_CONNECTED:
return SettingsBtStatus.CONNECTION_STATUS_CONNECTED;
diff --git a/src/com/android/settings/deviceinfo/Status.java b/src/com/android/settings/deviceinfo/Status.java
index 9162d25..ece5346 100644
--- a/src/com/android/settings/deviceinfo/Status.java
+++ b/src/com/android/settings/deviceinfo/Status.java
@@ -50,7 +50,7 @@ import java.lang.ref.WeakReference;
* # Phone Number
* # Network
* # Roaming
- * # IMEI
+ * # Device Id (IMEI in GSM and MEID in CDMA)
* # Network type
* # Signal Strength
* # Battery Strength : TODO
@@ -181,7 +181,9 @@ public class Status extends PreferenceActivity {
mSignalStrength = findPreference("signal_strength");
mUptime = findPreference("up_time");
+ //NOTE "imei" is the "Device ID" since it represents the IMEI in GSM and the MEID in CDMA
setSummaryText("imei", mPhone.getDeviceId());
+
setSummaryText("imei_sv",
((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
.getDeviceSoftwareVersion());
@@ -301,6 +303,9 @@ public class Status extends PreferenceActivity {
}
void updateSignalStrength() {
+ // TODO PhoneStateIntentReceiver is deprecated and PhoneStateListener
+ // should probably used instead.
+
// not loaded in some versions of the code (e.g., zaku)
if (mSignalStrength != null) {
int state =
diff --git a/src/com/android/settings/fuelgauge/PowerGaugePreference.java b/src/com/android/settings/fuelgauge/PowerGaugePreference.java
new file mode 100644
index 0000000..0bfa12d
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/PowerGaugePreference.java
@@ -0,0 +1,119 @@
+/*
+ * 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.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;
+import android.widget.ImageView;
+
+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
+ * subsystem/app type.
+ *
+ */
+public class PowerGaugePreference extends Preference {
+
+ private Drawable mIcon;
+ private GaugeDrawable mGauge;
+ private double mValue;
+ private BatterySipper mInfo;
+
+ public PowerGaugePreference(Context context, Drawable icon, BatterySipper info) {
+ super(context);
+ setLayoutResource(R.layout.preference_powergauge);
+ mIcon = icon;
+ mGauge = new GaugeDrawable();
+ mGauge.bar = context.getResources().getDrawable(R.drawable.app_gauge);
+ mInfo = info;
+ }
+
+ /**
+ * Sets the width of the gauge in percentage (0 - 100)
+ * @param percent
+ */
+ void setGaugeValue(double percent) {
+ mValue = percent;
+ mGauge.percent = mValue;
+ }
+
+ BatterySipper getInfo() {
+ return mInfo;
+ }
+
+ @Override
+ protected void onBindView(View view) {
+ super.onBindView(view);
+
+ ImageView appIcon = (ImageView) view.findViewById(R.id.appIcon);
+ if (mIcon == null) {
+ mIcon = getContext().getResources().getDrawable(android.R.drawable.sym_def_app_icon);
+ }
+ appIcon.setImageDrawable(mIcon);
+
+ ImageView appGauge = (ImageView) view.findViewById(R.id.appGauge);
+ appGauge.setImageDrawable(mGauge);
+ }
+
+ static class GaugeDrawable extends Drawable {
+ Drawable bar;
+ double percent;
+ int lastWidth = -1;
+
+ @Override
+ public void draw(Canvas canvas) {
+ if (lastWidth == -1) {
+ lastWidth = getBarWidth();
+ bar.setBounds(0, 0, lastWidth, bar.getIntrinsicHeight());
+ }
+ bar.draw(canvas);
+ }
+
+ @Override
+ public int getOpacity() {
+ return PixelFormat.TRANSLUCENT;
+ }
+
+ @Override
+ public void setAlpha(int alpha) {
+ // Ignore
+ }
+
+ @Override
+ public void setColorFilter(ColorFilter cf) {
+ // Ignore
+ }
+
+ private int getBarWidth() {
+ int width = (int) ((this.getBounds().width() * percent) / 100);
+ int intrinsicWidth = bar.getIntrinsicWidth();
+ return Math.max(width, intrinsicWidth);
+ }
+
+ @Override
+ public int getIntrinsicHeight() {
+ return bar.getIntrinsicHeight();
+ }
+ }
+}
diff --git a/src/com/android/settings/fuelgauge/PowerUsageDetail.java b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
new file mode 100644
index 0000000..eeb8663
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
@@ -0,0 +1,156 @@
+/*
+ * 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.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import com.android.settings.R;
+
+public class PowerUsageDetail extends Activity {
+
+ public static final int USAGE_SINCE_UNPLUGGED = 1;
+ public static final int USAGE_SINCE_RESET = 2;
+
+ public static final String EXTRA_TITLE = "title";
+ public static final String EXTRA_PERCENT = "percent";
+ public static final String EXTRA_USAGE_SINCE = "since";
+ public static final String EXTRA_USAGE_DURATION = "duration";
+ public static final String EXTRA_DETAIL_TYPES = "types";
+ public static final String EXTRA_DETAIL_VALUES = "values";
+
+ 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;
+
+ private static final boolean DEBUG = true;
+ private String mTitle;
+ private double mPercentage;
+ private int mUsageSince;
+ private int[] mTypes;
+ private double[] mValues;
+ private TextView mTitleView;
+ private ViewGroup mDetailsParent;
+ private long mStartTime;
+
+ private static final String TAG = "PowerUsageDetail";
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ setContentView(R.layout.power_usage_details);
+ createDetails();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ mStartTime = android.os.Process.getElapsedCpuTime();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ }
+
+ private void createDetails() {
+ final Intent intent = getIntent();
+ mTitle = intent.getStringExtra(EXTRA_TITLE);
+ mPercentage = intent.getDoubleExtra(EXTRA_PERCENT, -1);
+ mUsageSince = intent.getIntExtra(EXTRA_USAGE_SINCE, USAGE_SINCE_UNPLUGGED);
+
+ mTypes = intent.getIntArrayExtra(EXTRA_DETAIL_TYPES);
+ mValues = intent.getDoubleArrayExtra(EXTRA_DETAIL_VALUES);
+
+ mTitleView = (TextView) findViewById(R.id.name);
+ mTitleView.setText(mTitle);
+ // TODO: I18N
+ ((TextView)findViewById(R.id.battery_percentage))
+ .setText(String.format("%3.2f%% of battery usage since last unplugged", mPercentage));
+
+ mDetailsParent = (ViewGroup) findViewById(R.id.details);
+ LayoutInflater inflater = getLayoutInflater();
+ if (mTypes != null && mValues != null) {
+ for (int i = 0; i < mTypes.length; i++) {
+ // Only add an item if the time is greater than zero
+ if (mValues[i] <= 0) continue;
+ final String label = getString(mTypes[i]);
+ String value = null;
+ switch (mTypes[i]) {
+ case R.string.usage_type_data_recv:
+ case R.string.usage_type_data_send:
+ value = formatBytes(mValues[i]);
+ break;
+ default:
+ value = formatTime(mValues[i]);
+ }
+ ViewGroup item = (ViewGroup) inflater.inflate(R.layout.power_usage_detail_item_text,
+ null);
+ mDetailsParent.addView(item);
+ TextView labelView = (TextView) item.findViewById(R.id.label);
+ TextView valueView = (TextView) item.findViewById(R.id.value);
+ labelView.setText(label);
+ valueView.setText(value);
+ }
+ }
+ }
+
+ private String formatTime(double millis) {
+ StringBuilder sb = new StringBuilder();
+ 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));
+ }
+ return sb.toString();
+ }
+
+ private String formatBytes(double bytes) {
+ // TODO: I18N
+ if (bytes > 1000 * 1000) {
+ return String.format("%.2f MB", ((int) (bytes / 1000)) / 1000f);
+ } else if (bytes > 1024) {
+ return String.format("%.2f KB", ((int) (bytes / 10)) / 100f);
+ } else {
+ return String.format("%d bytes", (int) bytes);
+ }
+ }
+}
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
new file mode 100644
index 0000000..296a9c7
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -0,0 +1,494 @@
+/*
+ * 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.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;
+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.os.BatteryStats.Uid.Sensor;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceGroup;
+import android.preference.PreferenceScreen;
+import android.util.Log;
+import android.util.SparseArray;
+import android.view.Menu;
+import android.view.MenuItem;
+
+import com.android.internal.app.IBatteryStats;
+import com.android.internal.os.BatteryStatsImpl;
+import com.android.internal.os.PowerProfile;
+import com.android.settings.R;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Displays a list of apps and subsystems that consume power, ordered by how much power was
+ * consumed since the last time it was unplugged.
+ */
+public class PowerUsageSummary extends PreferenceActivity {
+
+ private static final boolean DEBUG = true;
+
+ private static final String TAG = "PowerUsageSummary";
+
+ private static final int MENU_STATS_TYPE = Menu.FIRST;
+ private static final int MENU_STATS_REFRESH = Menu.FIRST + 1;
+
+ enum DrainType {
+ IDLE,
+ CELL,
+ PHONE,
+ WIFI,
+ BLUETOOTH,
+ SCREEN,
+ APP
+ }
+
+ IBatteryStats mBatteryInfo;
+ BatteryStatsImpl mStats;
+ private List<BatterySipper> mUsageList = new ArrayList<BatterySipper>();
+
+ private PreferenceGroup mAppListGroup;
+
+ private int mStatsType = BatteryStats.STATS_UNPLUGGED;
+
+ private static final int MIN_POWER_THRESHOLD = 5;
+ private static final int MAX_ITEMS_TO_LIST = 10;
+
+ private double mMaxPower = 1;
+ private double mTotalPower;
+
+ private boolean mScaleByMax = true;
+
+ private PowerProfile mPowerProfile;
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ addPreferencesFromResource(R.xml.power_usage_summary);
+ mBatteryInfo = IBatteryStats.Stub.asInterface(
+ ServiceManager.getService("batteryinfo"));
+ mAppListGroup = getPreferenceScreen();
+ mPowerProfile = new PowerProfile(this, "power_profile_default");
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ updateAppsList();
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+ PowerGaugePreference pgp = (PowerGaugePreference) preference;
+ BatterySipper sipper = pgp.getInfo();
+ Intent intent = new Intent(this, PowerUsageDetail.class);
+ intent.putExtra(PowerUsageDetail.EXTRA_TITLE, sipper.mLabel);
+ intent.putExtra(PowerUsageDetail.EXTRA_PERCENT, sipper.getSortValue() * 100 / mTotalPower);
+
+ switch (sipper.mDrainType) {
+ case APP:
+ {
+ Uid uid = sipper.mUid;
+ int[] types = new int[] {
+ R.string.usage_type_cpu,
+ R.string.usage_type_cpu_foreground,
+ R.string.usage_type_gps,
+ R.string.usage_type_data_send,
+ R.string.usage_type_data_recv,
+ R.string.usage_type_audio,
+ R.string.usage_type_video,
+ };
+ double[] values = new double[] {
+ sipper.mCpuTime,
+ sipper.mCpuFgTime,
+ sipper.mGpsTime,
+ uid != null? uid.getTcpBytesSent(mStatsType) : 0,
+ uid != null? uid.getTcpBytesReceived(mStatsType) : 0,
+ 0,
+ 0
+ };
+ intent.putExtra(PowerUsageDetail.EXTRA_DETAIL_TYPES, types);
+ intent.putExtra(PowerUsageDetail.EXTRA_DETAIL_VALUES, values);
+
+ }
+ break;
+ }
+ startActivity(intent);
+
+ return super.onPreferenceTreeClick(preferenceScreen, preference);
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ /*
+ menu.add(0, MENU_STATS_TYPE, 0, R.string.menu_stats_total)
+ .setIcon(com.android.internal.R.drawable.ic_menu_info_details)
+ .setAlphabeticShortcut('t');
+ */
+ menu.add(0, MENU_STATS_REFRESH, 0, R.string.menu_stats_refresh)
+ .setIcon(com.android.internal.R.drawable.ic_menu_refresh)
+ .setAlphabeticShortcut('r');
+ return true;
+ }
+
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ /*
+ menu.findItem(MENU_STATS_TYPE).setTitle(mStatsType == BatteryStats.STATS_TOTAL
+ ? R.string.menu_stats_unplugged
+ : R.string.menu_stats_total);
+ */
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case MENU_STATS_TYPE:
+ if (mStatsType == BatteryStats.STATS_TOTAL) {
+ mStatsType = BatteryStats.STATS_UNPLUGGED;
+ } else {
+ mStatsType = BatteryStats.STATS_TOTAL;
+ }
+ updateAppsList();
+ return true;
+ case MENU_STATS_REFRESH:
+ mStats = null;
+ updateAppsList();
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ private void updateAppsList() {
+ if (mStats == null) {
+ load();
+ }
+ mMaxPower = 0;
+ mTotalPower = 0;
+
+ mAppListGroup.removeAll();
+ mUsageList.clear();
+ processAppUsage();
+ processMiscUsage();
+
+ mAppListGroup.setOrderingAsAdded(false);
+
+ Collections.sort(mUsageList);
+ for (BatterySipper g : mUsageList) {
+ if (g.getSortValue() < MIN_POWER_THRESHOLD) continue;
+ double percent = ((g.getSortValue() / mTotalPower) * 100);
+ PowerGaugePreference pref = new PowerGaugePreference(this, g.getIcon(), g);
+ double scaleByMax = (g.getSortValue() * 100) / mMaxPower;
+ pref.setSummary(g.getLabel() + " ( " + String.format("%3.2f", percent) + "% )");
+ pref.setOrder(Integer.MAX_VALUE - (int) g.getSortValue()); // Invert the order
+ pref.setGaugeValue(mScaleByMax ? scaleByMax : percent);
+ mAppListGroup.addPreference(pref);
+ if (mAppListGroup.getPreferenceCount() > MAX_ITEMS_TO_LIST) break;
+ }
+ }
+
+ private void processAppUsage() {
+ SensorManager sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
+ final int which = mStatsType;
+ final double powerCpuNormal = mPowerProfile.getAveragePower(PowerProfile.POWER_CPU_NORMAL);
+ long uSecTime = mStats.computeBatteryRealtime(SystemClock.elapsedRealtime(), which) * 1000;
+ SparseArray<? extends Uid> uidStats = mStats.getUidStats();
+ final int NU = uidStats.size();
+ if (DEBUG) Log.i(TAG, "uidStats size = " + NU);
+ for (int iu = 0; iu < NU; iu++) {
+ Uid u = uidStats.valueAt(iu);
+ double power = 0;
+ //mUsageList.add(new AppUsage(u.getUid(), new double[] {power}));
+ Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
+ long cpuTime = 0;
+ long cpuFgTime = 0;
+ long gpsTime = 0;
+ if (processStats.size() > 0) {
+ for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
+ : processStats.entrySet()) {
+
+ Uid.Proc ps = ent.getValue();
+ long userTime = ps.getUserTime(which);
+ long systemTime = ps.getSystemTime(which);
+ long foregroundTime = ps.getForegroundTime(which);
+ cpuFgTime += foregroundTime * 10; // convert to millis
+ if (DEBUG) Log.i(TAG, "CPU Fg time for " + u.getUid() + " = " + foregroundTime);
+ cpuTime = (userTime + systemTime) * 10; // convert to millis
+ power += cpuTime * powerCpuNormal;
+
+ }
+ }
+ if (cpuFgTime > cpuTime) {
+ if (DEBUG && cpuFgTime > cpuTime + 10000) {
+ Log.i(TAG, "WARNING! Cputime is more than 10 seconds behind Foreground time");
+ }
+ cpuTime = cpuFgTime; // Statistics may not have been gathered yet.
+ }
+ power /= 1000;
+
+ Map<Integer, ? extends BatteryStats.Uid.Sensor> sensorStats = u.getSensorStats();
+ for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> sensorEntry
+ : sensorStats.entrySet()) {
+ Uid.Sensor sensor = sensorEntry.getValue();
+ int sensorType = sensor.getHandle();
+ BatteryStats.Timer timer = sensor.getSensorTime();
+ long sensorTime = timer.getTotalTimeLocked(uSecTime, which) / 1000;
+ double multiplier = 0;
+ switch (sensorType) {
+ case Uid.Sensor.GPS:
+ multiplier = mPowerProfile.getAveragePower(PowerProfile.POWER_GPS_ON);
+ gpsTime = sensorTime;
+ break;
+ default:
+ android.hardware.Sensor sensorData =
+ sensorManager.getDefaultSensor(sensorType);
+ if (sensorData != null) {
+ multiplier = sensorData.getPower();
+ if (DEBUG) {
+ Log.i(TAG, "Got sensor " + sensorData.getName() + " with power = "
+ + multiplier);
+ }
+ }
+ }
+ power += (multiplier * sensorTime) / 1000;
+ }
+ if (power != 0) {
+ BatterySipper app = new BatterySipper(null, DrainType.APP, 0, u,
+ new double[] {power});
+ app.mCpuTime = cpuTime;
+ app.mGpsTime = gpsTime;
+ app.mCpuFgTime = cpuFgTime;
+ mUsageList.add(app);
+ }
+ if (power > mMaxPower) mMaxPower = power;
+ mTotalPower += power;
+ if (DEBUG) Log.i(TAG, "Added power = " + power);
+ }
+ }
+
+ private double getPhoneOnPower(long uSecNow) {
+ return mPowerProfile.getAveragePower(PowerProfile.POWER_RADIO_ACTIVE)
+ * mStats.getPhoneOnTime(uSecNow, mStatsType) / 1000 / 1000;
+ }
+
+ private double getScreenOnPower(long uSecNow) {
+ double power = 0;
+ power += mStats.getScreenOnTime(uSecNow, mStatsType)
+ * mPowerProfile.getAveragePower(PowerProfile.POWER_SCREEN_ON) / 1000; // millis
+ final double screenFullPower =
+ mPowerProfile.getAveragePower(PowerProfile.POWER_SCREEN_FULL);
+ for (int i = 0; i < BatteryStats.NUM_SCREEN_BRIGHTNESS_BINS; i++) {
+ double screenBinPower = screenFullPower * (i + 0.5f)
+ / BatteryStats.NUM_SCREEN_BRIGHTNESS_BINS;
+ long brightnessTime = mStats.getScreenBrightnessTime(i, uSecNow, mStatsType) / 1000;
+ power += screenBinPower * brightnessTime;
+ if (DEBUG) {
+ Log.i(TAG, "Screen bin power = " + (int) screenBinPower + ", time = "
+ + brightnessTime);
+ }
+ }
+ return power / 1000;
+ }
+
+ private double getRadioPower(long uSecNow, int which) {
+ double power = 0;
+ final int BINS = BatteryStats.NUM_SIGNAL_STRENGTH_BINS;
+ for (int i = 0; i < BINS; i++) {
+ power += mStats.getPhoneSignalStrengthTime(i, uSecNow, which) / 1000 / 1000 *
+ mPowerProfile.getAveragePower(PowerProfile.POWER_RADIO_ON)
+ * ((BINS - i) / (double) BINS);
+ }
+ return power;
+ }
+
+ private void processMiscUsage() {
+ final int which = mStatsType;
+ long uSecTime = SystemClock.elapsedRealtime() * 1000;
+ final long uSecNow = mStats.computeBatteryRealtime(uSecTime, which);
+ final long timeSinceUnplugged = uSecNow;
+ if (DEBUG) {
+ Log.i(TAG, "Uptime since last unplugged = " + (timeSinceUnplugged / 1000));
+ }
+
+ double phoneOnPower = getPhoneOnPower(uSecNow);
+ addEntry(getString(R.string.power_phone), DrainType.PHONE,
+ android.R.drawable.ic_menu_call, phoneOnPower);
+
+ double screenOnPower = getScreenOnPower(uSecNow);
+ addEntry(getString(R.string.power_screen), DrainType.SCREEN,
+ android.R.drawable.ic_menu_view, screenOnPower);
+
+ double wifiPower = (mStats.getWifiOnTime(uSecNow, which) * 0 /* TODO */
+ * mPowerProfile.getAveragePower(PowerProfile.POWER_WIFI_ON)
+ + mStats.getWifiRunningTime(uSecNow, which)
+ * mPowerProfile.getAveragePower(PowerProfile.POWER_WIFI_ON)) / 1000 / 1000;
+ addEntry(getString(R.string.power_wifi), DrainType.WIFI,
+ R.drawable.ic_wifi_signal_4, wifiPower);
+
+ double idlePower = ((timeSinceUnplugged - mStats.getScreenOnTime(uSecNow, mStatsType))
+ * mPowerProfile.getAveragePower(PowerProfile.POWER_CPU_IDLE)) / 1000 / 1000;
+ addEntry(getString(R.string.power_idle), DrainType.IDLE,
+ android.R.drawable.ic_lock_power_off, idlePower);
+
+ double radioPower = getRadioPower(uSecNow, which);
+ addEntry(getString(R.string.power_cell), DrainType.CELL,
+ android.R.drawable.ic_menu_sort_by_size, radioPower);
+ }
+
+ private void addEntry(String label, DrainType drainType, int iconId, double power) {
+ if (power > mMaxPower) mMaxPower = power;
+ mTotalPower += power;
+ BatterySipper bs = new BatterySipper(label, drainType, iconId, null, new double[] {power});
+ mUsageList.add(bs);
+ }
+
+ private void load() {
+ try {
+ byte[] data = mBatteryInfo.getStatistics();
+ Parcel parcel = Parcel.obtain();
+ parcel.unmarshall(data, 0, data.length);
+ parcel.setDataPosition(0);
+ mStats = com.android.internal.os.BatteryStatsImpl.CREATOR
+ .createFromParcel(parcel);
+ } catch (RemoteException e) {
+ Log.e(TAG, "RemoteException:", e);
+ }
+ }
+
+ class BatterySipper implements Comparable<BatterySipper> {
+ String mLabel;
+ Drawable mIcon;
+ Uid mUid;
+ double mValue;
+ double[] mValues;
+ DrainType mDrainType;
+ long mCpuTime;
+ long mGpsTime;
+ long mCpuFgTime;
+
+ BatterySipper(String label, DrainType drainType, int iconId, Uid uid, double[] values) {
+ mValues = values;
+ mLabel = label;
+ mDrainType = drainType;
+ if (iconId > 0) {
+ mIcon = getResources().getDrawable(iconId);
+ }
+ if (mValues != null) mValue = mValues[0];
+ //if (uid > 0 && (mLabel == null || mIcon == null) // TODO:
+ if ((label == null || iconId == 0) && uid!= null) {
+ getNameForUid(uid.getUid());
+ }
+ mUid = uid;
+ }
+
+ double getSortValue() {
+ return mValue;
+ }
+
+ double[] getValues() {
+ return mValues;
+ }
+
+ Drawable getIcon() {
+ return mIcon;
+ }
+
+ public int compareTo(BatterySipper other) {
+ // Return the flipped value because we want the items in descending order
+ return (int) (other.getSortValue() - getSortValue());
+ }
+
+ String getLabel() {
+ return mLabel;
+ }
+
+ /**
+ * Sets mLabel and mIcon
+ * @param uid Uid of the application
+ */
+ void getNameForUid(int uid) {
+ // TODO: Do this on a separate thread
+ PackageManager pm = getPackageManager();
+ String[] packages = pm.getPackagesForUid(uid);
+ if (packages == null) {
+ mLabel = Integer.toString(uid);
+ return;
+ }
+
+ String[] packageNames = new String[packages.length];
+ System.arraycopy(packages, 0, packageNames, 0, packages.length);
+
+ // Convert package names to user-facing labels where possible
+ for (int i = 0; i < packageNames.length; i++) {
+ //packageNames[i] = PowerUsageSummary.getLabel(packageNames[i], pm);
+ try {
+ ApplicationInfo ai = pm.getApplicationInfo(packageNames[i], 0);
+ CharSequence label = ai.loadLabel(pm);
+ if (label != null) {
+ packageNames[i] = label.toString();
+ }
+ if (mIcon == null) {
+ mIcon = ai.loadIcon(pm);
+ }
+ } catch (NameNotFoundException e) {
+ }
+ }
+
+ if (packageNames.length == 1) {
+ mLabel = packageNames[0];
+ } else {
+ // Look for an official name for this UID.
+ for (String name : packages) {
+ try {
+ PackageInfo pi = pm.getPackageInfo(name, 0);
+ if (pi.sharedUserLabel != 0) {
+ CharSequence nm = pm.getText(name,
+ pi.sharedUserLabel, pi.applicationInfo);
+ if (nm != null) {
+ mLabel = nm.toString();
+ break;
+ }
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ }
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/src/com/android/settings/widget/SettingsAppWidgetProvider.java b/src/com/android/settings/widget/SettingsAppWidgetProvider.java
new file mode 100644
index 0000000..002816f
--- /dev/null
+++ b/src/com/android/settings/widget/SettingsAppWidgetProvider.java
@@ -0,0 +1,404 @@
+/*
+ * 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.widget;
+
+import android.app.PendingIntent;
+import android.appwidget.AppWidgetManager;
+import android.appwidget.AppWidgetProvider;
+import android.bluetooth.BluetoothDevice;
+import android.content.ComponentName;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.IContentService;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.location.LocationManager;
+import android.net.ConnectivityManager;
+import android.net.Uri;
+import android.net.wifi.WifiManager;
+import android.os.IHardwareService;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.provider.Settings;
+import android.util.Log;
+import android.widget.RemoteViews;
+import com.android.settings.R;
+import com.android.settings.bluetooth.LocalBluetoothManager;
+
+/**
+ * Provides control of power-related settings from a widget.
+ */
+public class SettingsAppWidgetProvider extends AppWidgetProvider {
+ static final String TAG = "SettingsAppWidgetProvider";
+
+ static final ComponentName THIS_APPWIDGET =
+ new ComponentName("com.android.settings",
+ "com.android.settings.widget.SettingsAppWidgetProvider");
+
+ private static LocalBluetoothManager mLocalBluetoothManager = null;
+
+ private static final int BUTTON_WIFI = 0;
+ private static final int BUTTON_BRIGHTNESS = 1;
+ private static final int BUTTON_SYNC = 2;
+ private static final int BUTTON_GPS = 3;
+ private static final int BUTTON_BLUETOOTH = 4;
+
+ private static final int STATE_DISABLED = 0;
+ private static final int STATE_ENABLED = 1;
+ private static final int STATE_INTERMEDIATE = 2;
+
+ /**
+ * Minimum and maximum brightnesses. Don't go to 0 since that makes the display unusable
+ */
+ private static final int MINIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_DIM + 10;
+ private static final int MAXIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_ON;
+ private static final int DEFAULT_BACKLIGHT = (int) (android.os.Power.BRIGHTNESS_ON * 0.4f);
+
+ @Override
+ public void onUpdate(Context context, AppWidgetManager appWidgetManager,
+ int[] appWidgetIds) {
+ // Update each requested appWidgetId
+ RemoteViews view = buildUpdate(context, -1);
+
+ for (int i = 0; i < appWidgetIds.length; i++) {
+ appWidgetManager.updateAppWidget(appWidgetIds[i], view);
+ }
+ }
+
+ @Override
+ public void onEnabled(Context context) {
+ PackageManager pm = context.getPackageManager();
+ pm.setComponentEnabledSetting(
+ new ComponentName("com.android.settings", ".widget.SettingsAppWidgetProvider"),
+ PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
+ PackageManager.DONT_KILL_APP);
+ }
+
+ @Override
+ public void onDisabled(Context context) {
+ Class clazz = com.android.settings.widget.SettingsAppWidgetProvider.class;
+ PackageManager pm = context.getPackageManager();
+ pm.setComponentEnabledSetting(
+ new ComponentName("com.android.settings", ".widget.SettingsAppWidgetProvider"),
+ PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+ PackageManager.DONT_KILL_APP);
+ }
+
+ /**
+ * Load image for given widget and build {@link RemoteViews} for it.
+ */
+ static RemoteViews buildUpdate(Context context, int appWidgetId) {
+ RemoteViews views = new RemoteViews(context.getPackageName(),
+ R.layout.widget);
+ views.setOnClickPendingIntent(R.id.btn_wifi, getLaunchPendingIntent(context, appWidgetId,
+ BUTTON_WIFI));
+ views.setOnClickPendingIntent(R.id.btn_brightness,
+ getLaunchPendingIntent(context,
+ appWidgetId, BUTTON_BRIGHTNESS));
+ views.setOnClickPendingIntent(R.id.btn_sync,
+ getLaunchPendingIntent(context,
+ appWidgetId, BUTTON_SYNC));
+ views.setOnClickPendingIntent(R.id.btn_gps,
+ getLaunchPendingIntent(context, appWidgetId, BUTTON_GPS));
+ views.setOnClickPendingIntent(R.id.btn_bluetooth,
+ getLaunchPendingIntent(context,
+ appWidgetId, BUTTON_BLUETOOTH));
+
+ updateButtons(views, context);
+ return views;
+ }
+
+ /**
+ * Updates the widget when something changes, or when a button is pushed.
+ *
+ * @param context
+ */
+ public static void updateWidget(Context context) {
+ RemoteViews views = buildUpdate(context, -1);
+ // Update specific list of appWidgetIds if given, otherwise default to all
+ final AppWidgetManager gm = AppWidgetManager.getInstance(context);
+ gm.updateAppWidget(THIS_APPWIDGET, views);
+ }
+
+ /**
+ * Updates the buttons based on the underlying states of wifi, etc.
+ *
+ * @param views The RemoteViews to update.
+ * @param context
+ */
+ private static void updateButtons(RemoteViews views, Context context) {
+ switch (getWifiState(context)) {
+ case STATE_DISABLED:
+ views.setImageViewResource(R.id.btn_wifi, R.drawable.widget_btn_wifi_off);
+ break;
+ case STATE_ENABLED:
+ views.setImageViewResource(R.id.btn_wifi, R.drawable.widget_btn_wifi);
+ break;
+ case STATE_INTERMEDIATE:
+ views.setImageViewResource(R.id.btn_wifi, R.drawable.widget_btn_wifi_gray);
+ break;
+ }
+ if (getBrightness(context)) {
+ views.setImageViewResource(R.id.btn_brightness, R.drawable.widget_btn_brightness);
+ } else {
+ views.setImageViewResource(R.id.btn_brightness, R.drawable.widget_btn_brightness_off);
+ }
+ if (getBackgroundDataState(context)) {
+ views.setImageViewResource(R.id.btn_sync, R.drawable.widget_btn_sync);
+ } else {
+ views.setImageViewResource(R.id.btn_sync, R.drawable.widget_btn_sync_off);
+ }
+ if (getGpsState(context)) {
+ views.setImageViewResource(R.id.btn_gps, R.drawable.widget_btn_gps);
+ } else {
+ views.setImageViewResource(R.id.btn_gps, R.drawable.widget_btn_gps_off);
+ }
+ switch (getBluetoothState(context)) {
+ case STATE_DISABLED:
+ views.setImageViewResource(R.id.btn_bluetooth, R.drawable.widget_btn_bluetooth_off);
+ break;
+ case STATE_ENABLED:
+ views.setImageViewResource(R.id.btn_bluetooth, R.drawable.widget_btn_bluetooth);
+ break;
+ case STATE_INTERMEDIATE:
+ views.setImageViewResource(R.id.btn_bluetooth, R.drawable.widget_btn_bluetooth_gray);
+ break;
+ }
+ }
+
+ /**
+ * Creates PendingIntent to notify the widget of a button click.
+ *
+ * @param context
+ * @param appWidgetId
+ * @return
+ */
+ private static PendingIntent getLaunchPendingIntent(Context context, int appWidgetId, int buttonId) {
+ Intent launchIntent = new Intent();
+ launchIntent.setClass(context, SettingsAppWidgetProvider.class);
+ launchIntent.addCategory(Intent.CATEGORY_ALTERNATIVE);
+ launchIntent.setData(Uri.parse("custom:" + buttonId));
+ PendingIntent pi = PendingIntent.getBroadcast(context, 0 /* no requestCode */,
+ launchIntent, 0 /* no flags */);
+ return pi;
+ }
+
+ /**
+ * Receives and processes a button pressed intent or state change.
+ *
+ * @param context
+ * @param intent Indicates the pressed button.
+ */
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ super.onReceive(context, intent);
+ if (intent.hasCategory(Intent.CATEGORY_ALTERNATIVE)) {
+ Uri data = intent.getData();
+ int buttonId = Integer.parseInt(data.getSchemeSpecificPart());
+ if (buttonId == BUTTON_WIFI) {
+ toggleWifi(context);
+ } else if (buttonId == BUTTON_BRIGHTNESS) {
+ toggleBrightness(context);
+ } else if (buttonId == BUTTON_SYNC) {
+ toggleBackgroundData(context);
+ } else if (buttonId == BUTTON_GPS) {
+ toggleGps(context);
+ } else if (buttonId == BUTTON_BLUETOOTH) {
+ toggleBluetooth(context);
+ }
+ }
+ // State changes fall through
+ updateWidget(context);
+ }
+
+ /**
+ * Gets the state of Wi-Fi
+ *
+ * @param context
+ * @return STATE_ENABLED, STATE_DISABLED, or STATE_INTERMEDIATE
+ */
+ private static int getWifiState(Context context) {
+ WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+ int wifiState = wifiManager.getWifiState();
+ if (wifiState == WifiManager.WIFI_STATE_DISABLED) {
+ return STATE_DISABLED;
+ } else if (wifiState == WifiManager.WIFI_STATE_ENABLED) {
+ return STATE_ENABLED;
+ } else {
+ return STATE_INTERMEDIATE;
+ }
+ }
+
+ /**
+ * Toggles the state of Wi-Fi
+ *
+ * @param context
+ */
+ private void toggleWifi(Context context) {
+ WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+ int wifiState = getWifiState(context);
+ if (wifiState == STATE_ENABLED) {
+ wifiManager.setWifiEnabled(false);
+ } else if (wifiState == STATE_DISABLED) {
+ wifiManager.setWifiEnabled(true);
+ mLocalBluetoothManager.setBluetoothEnabled(true);
+ }
+ }
+
+ /**
+ * Gets the state of background data.
+ *
+ * @param context
+ * @return true if enabled
+ */
+ private static boolean getBackgroundDataState(Context context) {
+ ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+ return connManager.getBackgroundDataSetting();
+ }
+
+ /**
+ * Toggle background data and sync tickles.
+ *
+ * @param context
+ */
+ private void toggleBackgroundData(Context context) {
+ ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+ boolean sync = getBackgroundDataState(context);
+ connManager.setBackgroundDataSetting(!sync);
+
+ IContentService contentService = ContentResolver.getContentService();
+ try {
+ contentService.setListenForNetworkTickles(!sync);
+ } catch (RemoteException e) {
+ Log.d(TAG, "toggleBackgroundData: " + e);
+ }
+ }
+
+ /**
+ * 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
+ * @return true if more than moderately bright.
+ */
+ private static boolean getBrightness(Context context) {
+ try {
+ IHardwareService hardware = IHardwareService.Stub.asInterface(
+ ServiceManager.getService("hardware"));
+ if (hardware != null) {
+ int brightness = Settings.System.getInt(context.getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS);
+ return brightness > 100;
+ }
+ } catch (Exception e) {
+ Log.d(TAG, "getBrightness: " + e);
+ }
+ return false;
+ }
+
+ /**
+ * Increases or decreases the brightness.
+ *
+ * @param context
+ */
+ private void toggleBrightness(Context context) {
+ try {
+ IHardwareService hardware = IHardwareService.Stub.asInterface(
+ ServiceManager.getService("hardware"));
+ if (hardware != null) {
+ ContentResolver cr = context.getContentResolver();
+ int brightness = Settings.System.getInt(cr,
+ Settings.System.SCREEN_BRIGHTNESS);
+ // Rotate MINIMUM -> DEFAULT -> MAXIMUM
+ // Technically, not a toggle...
+ if (brightness < DEFAULT_BACKLIGHT) {
+ brightness = DEFAULT_BACKLIGHT;
+ } else if (brightness < MAXIMUM_BACKLIGHT) {
+ brightness = MAXIMUM_BACKLIGHT;
+ } else {
+ brightness = MINIMUM_BACKLIGHT;
+ }
+ hardware.setBacklights(brightness);
+ Settings.System.putInt(cr, Settings.System.SCREEN_BRIGHTNESS, brightness);
+ brightness = Settings.System.getInt(cr,
+ Settings.System.SCREEN_BRIGHTNESS);
+ }
+ } catch (RemoteException e) {
+ Log.d(TAG, "toggleBrightness: " + e);
+ } catch (Settings.SettingNotFoundException e) {
+ Log.d(TAG, "toggleBrightness: " + e);
+ }
+ }
+
+ /**
+ * Gets state of bluetooth
+ *
+ * @param context
+ * @return STATE_ENABLED, STATE_DISABLED, or STATE_INTERMEDIATE
+ */
+ private static int getBluetoothState(Context context) {
+ if (mLocalBluetoothManager == null) {
+ mLocalBluetoothManager = LocalBluetoothManager.getInstance(context);
+ if (mLocalBluetoothManager == null) {
+ return STATE_INTERMEDIATE; // On emulator?
+ }
+ }
+ int state = mLocalBluetoothManager.getBluetoothState();
+ if (state == BluetoothDevice.BLUETOOTH_STATE_OFF) {
+ return STATE_DISABLED;
+ } else if (state == BluetoothDevice.BLUETOOTH_STATE_ON) {
+ return STATE_ENABLED;
+ } else {
+ return STATE_INTERMEDIATE;
+ }
+ }
+
+ /**
+ * Toggles the state of bluetooth
+ *
+ * @param context
+ */
+ private void toggleBluetooth(Context context) {
+ int state = getBluetoothState(context);
+ if (state == STATE_ENABLED) {
+ mLocalBluetoothManager.setBluetoothEnabled(false);
+ } else if (state == STATE_DISABLED) {
+ mLocalBluetoothManager.setBluetoothEnabled(true);
+ }
+ }
+}
diff --git a/src/com/android/settings/wifi/AccessPointDialog.java b/src/com/android/settings/wifi/AccessPointDialog.java
index 919f7fc..dc2b389 100644
--- a/src/com/android/settings/wifi/AccessPointDialog.java
+++ b/src/com/android/settings/wifi/AccessPointDialog.java
@@ -21,6 +21,7 @@ import com.android.settings.R;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.res.Resources;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
@@ -71,6 +72,8 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
private static final int SECURITY_WEP = 2;
private static final int SECURITY_WPA_PERSONAL = 3;
private static final int SECURITY_WPA2_PERSONAL = 4;
+ private static final int SECURITY_WPA_EAP = 5;
+ private static final int SECURITY_IEEE8021X = 6;
private static final int[] WEP_TYPE_VALUES = {
AccessPointState.WEP_PASSWORD_AUTO, AccessPointState.WEP_PASSWORD_ASCII,
@@ -92,15 +95,39 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
// General views
private View mView;
+ private View mEnterpriseView;
private TextView mPasswordText;
private EditText mPasswordEdit;
private CheckBox mShowPasswordCheckBox;
+
+ // Enterprise fields
+ private TextView mEapText;
+ private Spinner mEapSpinner;
+ private TextView mPhase2Text;
+ private Spinner mPhase2Spinner;
+ private TextView mIdentityText;
+ private EditText mIdentityEdit;
+ private TextView mAnonymousIdentityText;
+ private EditText mAnonymousIdentityEdit;
+ private TextView mClientCertText;
+ private Spinner mClientCertSpinner;
+ private TextView mCaCertText;
+ private Spinner mCaCertSpinner;
+ private TextView mPrivateKeyText;
+ private Spinner mPrivateKeySpinner;
+ private TextView mPrivateKeyPasswdText;
+ private EditText mPrivateKeyPasswdEdit;
+ private EditText[] mEnterpriseTextFields;
+ private Spinner[] mEnterpriseSpinnerFields;
+
// Info-specific views
private ViewGroup mTable;
// Configure-specific views
private EditText mSsidEdit;
+ private TextView mSsidText;
+ private TextView mSecurityText;
private Spinner mSecuritySpinner;
private Spinner mWepTypeSpinner;
@@ -208,9 +235,17 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
positiveButtonResId = R.string.wifi_save_config;
mSaveButtonPos = POSITIVE_BUTTON;
-
+
+ setEnterpriseFieldsVisible(false);
+
} else if (mMode == MODE_INFO) {
- setLayout(R.layout.wifi_ap_info);
+ if (isEnterprise() && !mState.configured) {
+ setLayout(R.layout.wifi_ap_configure);
+ defaultPasswordVisibility = false;
+ setEnterpriseFieldsVisible(true);
+ } else {
+ setLayout(R.layout.wifi_ap_info);
+ }
if (mState.isConnectable()) {
if (mCustomTitle == null) {
@@ -251,41 +286,131 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
setButtons(positiveButtonResId, negativeButtonResId, neutralButtonResId);
}
+ private boolean isEnterprise() {
+
+ if(AccessPointState.WPA_EAP.equals(mState.security) ||
+ AccessPointState.IEEE8021X.equals(mState.security)) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
/** Called when we need to set our member variables to point to the views. */
private void onReferenceViews(View view) {
mPasswordText = (TextView) view.findViewById(R.id.password_text);
mPasswordEdit = (EditText) view.findViewById(R.id.password_edit);
-
+ mSsidText = (TextView) view.findViewById(R.id.ssid_text);
+ mSsidEdit = (EditText) view.findViewById(R.id.ssid_edit);
+ mSecurityText = (TextView) view.findViewById(R.id.security_text);
+ mSecuritySpinner = (Spinner) view.findViewById(R.id.security_spinner);
+ mWepTypeSpinner = (Spinner) view.findViewById(R.id.wep_type_spinner);
+ mEnterpriseView = mView.findViewById(R.id.enterprise_wrapper);
+
mShowPasswordCheckBox = (CheckBox) view.findViewById(R.id.show_password_checkbox);
if (mShowPasswordCheckBox != null) {
mShowPasswordCheckBox.setOnClickListener(this);
}
-
if (mMode == MODE_CONFIGURE) {
- mSsidEdit = (EditText) view.findViewById(R.id.ssid_edit);
- mSecuritySpinner = (Spinner) view.findViewById(R.id.security_spinner);
mSecuritySpinner.setOnItemSelectedListener(this);
- setSecuritySpinnerAdapter();
- mWepTypeSpinner = (Spinner) view.findViewById(R.id.wep_type_spinner);
-
+ mSecuritySpinner.setPromptId(R.string.security);
+ setSpinnerAdapter(mSecuritySpinner, mAutoSecurityAllowed ?
+ R.array.wifi_security_entries
+ : R.array.wifi_security_without_auto_entries);
} else if (mMode == MODE_INFO) {
mTable = (ViewGroup) view.findViewById(R.id.table);
}
-
+ /* for enterprise one */
+ if (mMode == MODE_CONFIGURE || (isEnterprise() && !mState.configured)) {
+ setEnterpriseFields(view);
+ mEapSpinner.setSelection(getSelectionIndex(
+ R.array.wifi_eap_entries, mState.getEap()));
+ Keystore ks = Keystore.getInstance();
+ mClientCertSpinner.setSelection(getSelectionIndex(
+ ks.getAllCertificateKeys(), mState.getEnterpriseField(
+ AccessPointState.CLIENT_CERT)));
+ mCaCertSpinner.setSelection(getSelectionIndex(
+ ks.getAllCertificateKeys(), mState.getEnterpriseField(
+ AccessPointState.CA_CERT)));
+ mPrivateKeySpinner.setSelection(getSelectionIndex(
+ ks.getAllUserkeyKeys(), mState.getEnterpriseField(
+ AccessPointState.PRIVATE_KEY)));
+ }
}
-
- private void setSecuritySpinnerAdapter() {
- Context context = getContext();
- int arrayResId = mAutoSecurityAllowed ? R.array.wifi_security_entries
- : R.array.wifi_security_without_auto_entries;
- ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(context,
- android.R.layout.simple_spinner_item,
- context.getResources().getStringArray(arrayResId));
- adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- mSecuritySpinner.setAdapter(adapter);
+ private void setEnterpriseFields(View view) {
+ mIdentityText = (TextView) view.findViewById(R.id.identity_text);
+ mIdentityEdit = (EditText) view.findViewById(R.id.identity_edit);
+ mAnonymousIdentityText =
+ (TextView) view.findViewById(R.id.anonymous_identity_text);
+ mAnonymousIdentityEdit =
+ (EditText) view.findViewById(R.id.anonymous_identity_edit);
+ mClientCertText =
+ (TextView) view.findViewById(R.id.client_certificate_text);
+ mCaCertText = (TextView) view.findViewById(R.id.ca_certificate_text);
+ mPrivateKeyText = (TextView) view.findViewById(R.id.private_key_text);
+ mPrivateKeyPasswdText =
+ (TextView) view.findViewById(R.id.private_key_passwd_text);
+ mPrivateKeyPasswdEdit =
+ (EditText) view.findViewById(R.id.private_key_passwd_edit);
+ mEapText = (TextView) view.findViewById(R.id.eap_text);
+ mEapSpinner = (Spinner) view.findViewById(R.id.eap_spinner);
+ mEapSpinner.setOnItemSelectedListener(this);
+ mEapSpinner.setPromptId(R.string.please_select_eap);
+ setSpinnerAdapter(mEapSpinner, R.array.wifi_eap_entries);
+
+ mPhase2Text = (TextView) view.findViewById(R.id.phase2_text);
+ mPhase2Spinner = (Spinner) view.findViewById(R.id.phase2_spinner);
+ mPhase2Spinner.setOnItemSelectedListener(this);
+ mPhase2Spinner.setPromptId(R.string.please_select_phase2);
+ setSpinnerAdapter(mPhase2Spinner, R.array.wifi_phase2_entries);
+
+ Keystore ks = Keystore.getInstance();
+
+ mClientCertSpinner =
+ (Spinner) view.findViewById(R.id.client_certificate_spinner);
+ mClientCertSpinner.setOnItemSelectedListener(this);
+ mClientCertSpinner.setPromptId(
+ R.string.please_select_client_certificate);
+ setSpinnerAdapter(mClientCertSpinner, ks.getAllCertificateKeys());
+
+ mCaCertSpinner =
+ (Spinner) view.findViewById(R.id.ca_certificate_spinner);
+ mCaCertSpinner.setOnItemSelectedListener(this);
+ mCaCertSpinner.setPromptId(R.string.please_select_ca_certificate);
+ setSpinnerAdapter(mCaCertSpinner, ks.getAllCertificateKeys());
+
+ mPrivateKeySpinner =
+ (Spinner) view.findViewById(R.id.private_key_spinner);
+ mPrivateKeySpinner.setOnItemSelectedListener(this);
+ mPrivateKeySpinner.setPromptId(R.string.please_select_private_key);
+ setSpinnerAdapter(mPrivateKeySpinner, ks.getAllUserkeyKeys());
+
+ mEnterpriseTextFields = new EditText[] {
+ mIdentityEdit, mAnonymousIdentityEdit, mPrivateKeyPasswdEdit
+ };
+
+ mEnterpriseSpinnerFields = new Spinner[] {
+ mClientCertSpinner, mCaCertSpinner, mPrivateKeySpinner
+ };
+
+ }
+
+ private void setSpinnerAdapter(Spinner spinner, String[] items) {
+ if (items != null) {
+ ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(
+ getContext(), android.R.layout.simple_spinner_item, items);
+ adapter.setDropDownViewResource(
+ android.R.layout.simple_spinner_dropdown_item);
+ spinner.setAdapter(adapter);
+ }
}
-
+
+ private void setSpinnerAdapter(Spinner spinner, int arrayResId) {
+ setSpinnerAdapter(spinner,
+ getContext().getResources().getStringArray(arrayResId));
+ }
+
/** Called when the widgets are in-place waiting to be filled with data */
private void onFill() {
@@ -381,39 +506,51 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
if (!replaceStateWithWifiLayerInstance()) {
Log.w(TAG, "Assuming connecting to a new network.");
}
-
- /*
- * If the network is secured and they haven't entered a password, popup
- * an error. Allow empty passwords if the state already has a password
- * set (since in that scenario, an empty password means keep the old
- * password).
- */
- String password = getEnteredPassword();
- boolean passwordIsEmpty = TextUtils.isEmpty(password);
-
- /*
- * When 'retry password', they can not enter a blank password. In any
- * other mode, we let them enter a blank password if the state already
- * has a password.
- */
- if (passwordIsEmpty && (!mState.hasPassword() || mMode == MODE_RETRY_PASSWORD)
- && (mState.security != null) && !mState.security.equals(AccessPointState.OPEN)) {
- new AlertDialog.Builder(getContext())
- .setTitle(R.string.error_title)
- .setIcon(android.R.drawable.ic_dialog_alert)
- .setMessage(R.string.wifi_password_incorrect_error)
- .setPositiveButton(android.R.string.ok, null)
- .show();
- return;
- }
-
- if (!passwordIsEmpty) {
- mState.setPassword(password);
+
+ if (isEnterprise()) {
+ if(!mState.configured) {
+ updateEnterpriseFields(
+ AccessPointState.WPA_EAP.equals(mState.security) ?
+ SECURITY_WPA_EAP : SECURITY_IEEE8021X);
+ }
+ } else {
+ updatePasswordField();
}
-
- mWifiLayer.connectToNetwork(mState);
+ mWifiLayer.connectToNetwork(mState);
}
-
+
+ /*
+ * If the network is secured and they haven't entered a password, popup an
+ * error. Allow empty passwords if the state already has a password set
+ * (since in that scenario, an empty password means keep the old password).
+ */
+ private void updatePasswordField() {
+
+ String password = getEnteredPassword();
+ boolean passwordIsEmpty = TextUtils.isEmpty(password);
+ /*
+ * When 'retry password', they can not enter a blank password. In any
+ * other mode, we let them enter a blank password if the state already
+ * has a password.
+ */
+ if (passwordIsEmpty && (!mState.hasPassword() ||
+ mMode == MODE_RETRY_PASSWORD) &&
+ (mState.security != null) &&
+ !mState.security.equals(AccessPointState.OPEN)) {
+ new AlertDialog.Builder(getContext())
+ .setTitle(R.string.error_title)
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setMessage(R.string.wifi_password_incorrect_error)
+ .setPositiveButton(android.R.string.ok, null)
+ .show();
+ return;
+ }
+
+ if (!passwordIsEmpty) {
+ mState.setPassword(password);
+ }
+ }
+
private void handleSave() {
replaceStateWithWifiLayerInstance();
@@ -471,6 +608,61 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
}
+ private int getSelectionIndex(String[] array, String selection) {
+ if(selection != null) {
+ for (int i = 0 ; i < array.length ; i++) {
+ if (selection.contains(array[i])) return i;
+ }
+ }
+ return 0;
+ }
+
+ private int getSelectionIndex(int arrayResId, String selection) {
+ return getSelectionIndex(
+ getContext().getResources().getStringArray(arrayResId), selection);
+ }
+
+ private void updateEnterpriseFields(int securityType) {
+ int i;
+ Keystore ks = Keystore.getInstance();
+ for (i = AccessPointState.IDENTITY ;
+ i < AccessPointState.MAX_ENTRPRISE_FIELD ; i++) {
+ String value;
+ if (i <= AccessPointState.PRIVATE_KEY_PASSWD) {
+ value = mEnterpriseTextFields[i].getText().toString();
+ } else {
+ Spinner spinner = mEnterpriseSpinnerFields[i -
+ AccessPointState.CLIENT_CERT];
+
+ if (i != AccessPointState.PRIVATE_KEY) {
+ value = ks.getCertificate(ks.getAllCertificateKeys()
+ [spinner.getSelectedItemPosition()]);
+ } else {
+ value = ks.getUserkey(ks.getAllUserkeyKeys()
+ [spinner.getSelectedItemPosition()]);
+ }
+ }
+ if (!TextUtils.isEmpty(value)) {
+ mState.setEnterpriseField(i, value);
+ }
+ }
+
+ switch (securityType) {
+ case SECURITY_WPA_EAP: {
+ mState.setSecurity(AccessPointState.WPA_EAP);
+ mState.setEap(mEapSpinner.getSelectedItemPosition());
+ break;
+ }
+ case SECURITY_IEEE8021X: {
+ mState.setSecurity(AccessPointState.IEEE8021X);
+ mState.setEap(mEapSpinner.getSelectedItemPosition());
+ break;
+ }
+ default:
+ mState.setSecurity(AccessPointState.OPEN);
+ }
+ }
+
/**
* Replaces our {@link #mState} with the equal WifiLayer instance. This is useful after
* we unparceled the state previously and before we are calling methods on {@link #mWifiLayer}.
@@ -516,7 +708,22 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
mPasswordEdit.setVisibility(visibility);
mShowPasswordCheckBox.setVisibility(visibility);
}
-
+
+ private void setEnterpriseFieldsVisible(boolean visible) {
+ int visibility = visible ? View.VISIBLE : View.GONE;
+ mEnterpriseView.setVisibility(visibility);
+ if (visible) {
+ setWepVisible(false);
+ setGenericPasswordVisible(false);
+ }
+ if (mMode != MODE_CONFIGURE) {
+ mSsidText.setVisibility(View.GONE);
+ mSsidEdit.setVisibility(View.GONE);
+ mSecurityText.setVisibility(View.GONE);
+ mSecuritySpinner.setVisibility(View.GONE);
+ }
+ }
+
public void onItemSelected(AdapterView parent, View view, int position, long id) {
if (parent == mSecuritySpinner) {
handleSecurityChange(getSecurityTypeFromSpinner());
@@ -527,7 +734,7 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
}
private void handleSecurityChange(int security) {
-
+ setEnterpriseFieldsVisible(false);
switch (security) {
case SECURITY_NONE: {
@@ -559,6 +766,11 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
updatePasswordCaption(AccessPointState.WPA);
break;
}
+ case SECURITY_WPA_EAP:
+ case SECURITY_IEEE8021X: {
+ setEnterpriseFieldsVisible(true);
+ break;
+ }
}
}
diff --git a/src/com/android/settings/wifi/AccessPointState.java b/src/com/android/settings/wifi/AccessPointState.java
index 2569802..d050767 100644
--- a/src/com/android/settings/wifi/AccessPointState.java
+++ b/src/com/android/settings/wifi/AccessPointState.java
@@ -43,6 +43,12 @@ public final class AccessPointState implements Comparable<AccessPointState>, Par
public static final String WEP = "WEP";
public static final String OPEN = "Open";
+ /* For EAP Enterprise fields */
+ public static final String WPA_EAP = "WPA-EAP";
+ public static final String IEEE8021X = "IEEE8021X";
+
+ public static final String[] EAP_METHOD = { "PEAP", "TLS", "TTLS" };
+
/** String present in capabilities if the scan result is ad-hoc */
private static final String ADHOC_CAPABILITY = "[IBSS]";
/** String present in capabilities if the scan result is enterprise secured */
@@ -93,7 +99,19 @@ public final class AccessPointState implements Comparable<AccessPointState>, Par
public static final int WEP_PASSWORD_ASCII = 1;
public static final int WEP_PASSWORD_HEX = 2;
private int mWepPasswordType;
-
+
+ /* Enterprise Fields */
+ public static final int IDENTITY = 0;
+ public static final int ANONYMOUS_IDENTITY = 1;
+ public static final int PRIVATE_KEY_PASSWD = 2;
+ public static final int CLIENT_CERT = 3;
+ public static final int CA_CERT = 4;
+ public static final int PRIVATE_KEY = 5;
+ public static final int MAX_ENTRPRISE_FIELD = 6;
+ private String mEnterpriseFields[] = new String[MAX_ENTRPRISE_FIELD];
+ private String mEap;
+ private String mPhase2;
+
private Context mContext;
/**
@@ -275,7 +293,9 @@ public final class AccessPointState implements Comparable<AccessPointState>, Par
else if (security.equals(WEP)) return mContext.getString(R.string.wifi_security_wep);
else if (security.equals(WPA)) return mContext.getString(R.string.wifi_security_wpa);
else if (security.equals(WPA2)) return mContext.getString(R.string.wifi_security_wpa2);
-
+ else if (security.equals(WPA_EAP)) return mContext.getString(R.string.wifi_security_wpa_eap);
+ else if (security.equals(IEEE8021X)) return mContext.getString(R.string.wifi_security_ieee8021x);
+
return mContext.getString(R.string.wifi_security_unknown);
}
@@ -300,7 +320,7 @@ public final class AccessPointState implements Comparable<AccessPointState>, Par
*/
public static String getScanResultSecurity(ScanResult scanResult) {
final String cap = scanResult.capabilities;
- final String[] securityModes = { WEP, WPA, WPA2 };
+ final String[] securityModes = { WEP, WPA, WPA2, WPA_EAP, IEEE8021X };
for (int i = securityModes.length - 1; i >= 0; i--) {
if (cap.contains(securityModes[i])) {
return securityModes[i];
@@ -347,7 +367,30 @@ public final class AccessPointState implements Comparable<AccessPointState>, Par
mPassword = password;
mWepPasswordType = wepPasswordType;
}
-
+
+ /* For Enterprise Fields */
+ public void setEnterpriseField(int field, String value) {
+ if (value != null && field >= 0 && field < MAX_ENTRPRISE_FIELD) {
+ this.mEnterpriseFields[field] = value;
+ requestRefresh();
+ }
+ }
+
+ public void setEap(int method) {
+ mEap = EAP_METHOD[method];
+ requestRefresh();
+ }
+
+ public String getEap() {
+ return mEap;
+ }
+ public String getEnterpriseField(int field) {
+ if(field >=0 && field < MAX_ENTRPRISE_FIELD) {
+ return mEnterpriseFields[field];
+ }
+ return null;
+ }
+
public boolean hasPassword() {
return !TextUtils.isEmpty(mPassword) || mConfigHadPassword;
}
@@ -382,6 +425,10 @@ public final class AccessPointState implements Comparable<AccessPointState>, Par
} else {
return OPEN;
}
+ } else if (wifiConfig.allowedKeyManagement.get(KeyMgmt.WPA_EAP)) {
+ return WPA_EAP;
+ } else if (wifiConfig.allowedKeyManagement.get(KeyMgmt.IEEE8021X)) {
+ return IEEE8021X;
} else if (wifiConfig.allowedProtocols.get(Protocol.RSN)) {
return WPA2;
} else if (wifiConfig.allowedProtocols.get(Protocol.WPA)) {
@@ -442,7 +489,43 @@ public final class AccessPointState implements Comparable<AccessPointState>, Par
config.priority = priority;
config.hiddenSSID = hiddenSsid;
config.SSID = convertToQuotedString(ssid);
-
+ config.eap = mEap;
+ if (!TextUtils.isEmpty(mEnterpriseFields[IDENTITY])) {
+ config.identity =
+ convertToQuotedString(mEnterpriseFields[IDENTITY]);
+ } else {
+ config.identity = null;
+ }
+ if (!TextUtils.isEmpty(mEnterpriseFields[ANONYMOUS_IDENTITY])) {
+ config.anonymousIdentity = convertToQuotedString(
+ mEnterpriseFields[ANONYMOUS_IDENTITY]);
+ } else {
+ config.anonymousIdentity = null;
+ }
+ if (!TextUtils.isEmpty(mEnterpriseFields[CLIENT_CERT])) {
+ config.clientCert = convertToQuotedString(
+ mEnterpriseFields[CLIENT_CERT]);
+ } else {
+ config.clientCert = null;
+ }
+ if (!TextUtils.isEmpty(mEnterpriseFields[CA_CERT])) {
+ config.caCert = convertToQuotedString(
+ mEnterpriseFields[CA_CERT]);
+ } else {
+ config.caCert = null;
+ }
+ if (!TextUtils.isEmpty(mEnterpriseFields[PRIVATE_KEY])) {
+ config.privateKey = convertToQuotedString(
+ mEnterpriseFields[PRIVATE_KEY]);
+ } else {
+ config.privateKey = null;
+ }
+ if (!TextUtils.isEmpty(mEnterpriseFields[PRIVATE_KEY_PASSWD])) {
+ config.privateKeyPasswd = convertToQuotedString(
+ mEnterpriseFields[PRIVATE_KEY_PASSWD]);
+ } else {
+ config.privateKeyPasswd = null;
+ }
setupSecurity(config);
}
@@ -509,6 +592,14 @@ public final class AccessPointState implements Comparable<AccessPointState>, Par
} else if (security.equals(OPEN)) {
config.allowedKeyManagement.set(KeyMgmt.NONE);
+ } else if (security.equals(WPA_EAP)) {
+ config.allowedGroupCiphers.set(GroupCipher.TKIP);
+ config.allowedGroupCiphers.set(GroupCipher.CCMP);
+ config.allowedKeyManagement.set(KeyMgmt.WPA_EAP);
+ } else if (security.equals(IEEE8021X)) {
+ config.allowedGroupCiphers.set(GroupCipher.TKIP);
+ config.allowedGroupCiphers.set(GroupCipher.CCMP);
+ config.allowedKeyManagement.set(KeyMgmt.IEEE8021X);
}
}
@@ -716,6 +807,10 @@ public final class AccessPointState implements Comparable<AccessPointState>, Par
return mContext.getString(R.string.wifi_security_verbose_wpa2);
} else if (OPEN.equals(security)) {
return mContext.getString(R.string.wifi_security_verbose_open);
+ } else if (WPA_EAP.equals(security)) {
+ return mContext.getString(R.string.wifi_security_verbose_wpa_eap);
+ } else if (IEEE8021X.equals(security)) {
+ return mContext.getString(R.string.wifi_security_verbose_ieee8021x);
} else {
return null;
}
diff --git a/src/com/android/settings/wifi/Keystore.java b/src/com/android/settings/wifi/Keystore.java
new file mode 100644
index 0000000..68af868
--- /dev/null
+++ b/src/com/android/settings/wifi/Keystore.java
@@ -0,0 +1,81 @@
+package com.android.settings.wifi;
+
+import android.util.Log;
+
+import java.io.File;
+
+/**
+ */
+public abstract class Keystore {
+ public static final String TAG = "Keystore";
+
+ private static final String PACKAGE_PREFIX =
+ Keystore.class.getPackage().getName() + ".";
+
+ public static final String ACTION_KEYSTORE_CERTIFICATES =
+ PACKAGE_PREFIX + "CERTIFICATES";
+ public static final String ACTION_KEYSTORE_USERKEYS =
+ PACKAGE_PREFIX + "USERKEYS";
+
+ /**
+ */
+ public static Keystore getInstance() {
+ return new FileKeystore();
+ }
+
+ /**
+ */
+ public abstract String getUserkey(String key);
+
+ /**
+ */
+ public abstract String getCertificate(String key);
+
+ /**
+ */
+ public abstract String[] getAllCertificateKeys();
+
+ /**
+ */
+ public abstract String[] getAllUserkeyKeys();
+
+ private static class FileKeystore extends Keystore {
+ private static final String PATH = "/data/misc/keystore/";
+ private static final String USERKEY_PATH = PATH + "userkeys/";
+ private static final String CERT_PATH = PATH + "certs/";
+
+ @Override
+ public String getUserkey(String key) {
+ String path = USERKEY_PATH + key;
+ return (new File(path).exists() ? path : null);
+ }
+
+ @Override
+ public String getCertificate(String key) {
+ String path = CERT_PATH + key;
+ return (new File(path).exists() ? path : null);
+ }
+
+ @Override
+ public String[] getAllCertificateKeys() {
+ File dir = new File(CERT_PATH);
+ if (dir.exists()) {
+ return dir.list();
+ } else {
+ Log.v(TAG, "-------- cert directory does not exist!");
+ return null;
+ }
+ }
+
+ @Override
+ public String[] getAllUserkeyKeys() {
+ File dir = new File(USERKEY_PATH);
+ if (dir.exists()) {
+ return dir.list();
+ } else {
+ Log.v(TAG, "-------- userkey directory does not exist!");
+ return null;
+ }
+ }
+ }
+}
diff --git a/src/com/android/settings/wifi/WifiLayer.java b/src/com/android/settings/wifi/WifiLayer.java
index b0857d2..751a5a3 100644
--- a/src/com/android/settings/wifi/WifiLayer.java
+++ b/src/com/android/settings/wifi/WifiLayer.java
@@ -1133,7 +1133,6 @@ public class WifiLayer {
* Hidden networks show up with empty SSID.
*/
if (AccessPointState.isAdhoc(scanResult)
- || AccessPointState.isEnterprise(scanResult)
|| TextUtils.isEmpty(scanResult.SSID)) {
continue;
}