diff options
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 Binary files differnew file mode 100644 index 0000000..4d4db24 --- /dev/null +++ b/res/drawable/app_gauge.9.png diff --git a/res/drawable/icon.png b/res/drawable/icon.png Binary files differnew file mode 100755 index 0000000..16db056 --- /dev/null +++ b/res/drawable/icon.png diff --git a/res/drawable/widget_bg.9.png b/res/drawable/widget_bg.9.png Binary files differnew file mode 100644 index 0000000..a2007ad --- /dev/null +++ b/res/drawable/widget_bg.9.png 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 Binary files differnew file mode 100644 index 0000000..5de9d78 --- /dev/null +++ b/res/drawable/widget_btn_bluetooth.png diff --git a/res/drawable/widget_btn_bluetooth_gray.png b/res/drawable/widget_btn_bluetooth_gray.png Binary files differnew file mode 100644 index 0000000..843dcce --- /dev/null +++ b/res/drawable/widget_btn_bluetooth_gray.png diff --git a/res/drawable/widget_btn_bluetooth_off.png b/res/drawable/widget_btn_bluetooth_off.png Binary files differnew file mode 100644 index 0000000..b831a46 --- /dev/null +++ b/res/drawable/widget_btn_bluetooth_off.png diff --git a/res/drawable/widget_btn_brightness.png b/res/drawable/widget_btn_brightness.png Binary files differnew file mode 100644 index 0000000..a162899 --- /dev/null +++ b/res/drawable/widget_btn_brightness.png diff --git a/res/drawable/widget_btn_brightness_off.png b/res/drawable/widget_btn_brightness_off.png Binary files differnew file mode 100644 index 0000000..0f42f2d --- /dev/null +++ b/res/drawable/widget_btn_brightness_off.png diff --git a/res/drawable/widget_btn_default.9.png b/res/drawable/widget_btn_default.9.png Binary files differnew file mode 100644 index 0000000..febf222 --- /dev/null +++ b/res/drawable/widget_btn_default.9.png diff --git a/res/drawable/widget_btn_gps.png b/res/drawable/widget_btn_gps.png Binary files differnew file mode 100644 index 0000000..3394cb4 --- /dev/null +++ b/res/drawable/widget_btn_gps.png diff --git a/res/drawable/widget_btn_gps_off.png b/res/drawable/widget_btn_gps_off.png Binary files differnew file mode 100644 index 0000000..7f481d8 --- /dev/null +++ b/res/drawable/widget_btn_gps_off.png diff --git a/res/drawable/widget_btn_pressed.9.png b/res/drawable/widget_btn_pressed.9.png Binary files differnew file mode 100644 index 0000000..70a200b --- /dev/null +++ b/res/drawable/widget_btn_pressed.9.png diff --git a/res/drawable/widget_btn_selected.9.png b/res/drawable/widget_btn_selected.9.png Binary files differnew file mode 100644 index 0000000..6f2989f --- /dev/null +++ b/res/drawable/widget_btn_selected.9.png diff --git a/res/drawable/widget_btn_sync.png b/res/drawable/widget_btn_sync.png Binary files differnew file mode 100644 index 0000000..9682879 --- /dev/null +++ b/res/drawable/widget_btn_sync.png diff --git a/res/drawable/widget_btn_sync_off.png b/res/drawable/widget_btn_sync_off.png Binary files differnew file mode 100644 index 0000000..0f48a1d --- /dev/null +++ b/res/drawable/widget_btn_sync_off.png diff --git a/res/drawable/widget_btn_wifi.png b/res/drawable/widget_btn_wifi.png Binary files differnew file mode 100644 index 0000000..ff7d2ef --- /dev/null +++ b/res/drawable/widget_btn_wifi.png diff --git a/res/drawable/widget_btn_wifi_gray.png b/res/drawable/widget_btn_wifi_gray.png Binary files differnew file mode 100644 index 0000000..8a3cc49 --- /dev/null +++ b/res/drawable/widget_btn_wifi_gray.png diff --git a/res/drawable/widget_btn_wifi_off.png b/res/drawable/widget_btn_wifi_off.png Binary files differnew file mode 100644 index 0000000..8f15b4f --- /dev/null +++ b/res/drawable/widget_btn_wifi_off.png 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">"<No establecido>"</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, & 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 & 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; } |