summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2009-03-03 19:32:34 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2009-03-03 19:32:34 -0800
commitafc4ab2ffbb8327ddce9907961295a32cbf49d0f (patch)
tree64baf0ce0e3c9fb39cc086994dbe9805b74e5bca
parent4e14e5ccbf1ef27220419849133d482a546d5c04 (diff)
downloadpackages_apps_Settings-afc4ab2ffbb8327ddce9907961295a32cbf49d0f.zip
packages_apps_Settings-afc4ab2ffbb8327ddce9907961295a32cbf49d0f.tar.gz
packages_apps_Settings-afc4ab2ffbb8327ddce9907961295a32cbf49d0f.tar.bz2
auto import from //depot/cupcake/@135843
-rw-r--r--Android.mk14
-rw-r--r--AndroidManifest.xml508
-rw-r--r--MODULE_LICENSE_APACHE20
-rw-r--r--NOTICE190
-rw-r--r--res/drawable/app_settings.pngbin0 -> 2116 bytes
-rwxr-xr-xres/drawable/border_item_thumbnail.pngbin0 -> 230 bytes
-rwxr-xr-xres/drawable/dotted_line_480px.pngbin0 -> 129 bytes
-rwxr-xr-xres/drawable/ic_bt_cellphone.pngbin0 -> 810 bytes
-rwxr-xr-xres/drawable/ic_bt_headphones_a2dp.pngbin0 -> 742 bytes
-rw-r--r--res/drawable/ic_bt_headset_hfp.pngbin0 -> 737 bytes
-rwxr-xr-xres/drawable/ic_bt_laptop.pngbin0 -> 3226 bytes
-rw-r--r--res/drawable/ic_btn_next.pngbin0 -> 779 bytes
-rwxr-xr-xres/drawable/ic_launcher_settings.pngbin0 -> 3285 bytes
-rw-r--r--res/drawable/ic_menu_3d_globe.pngbin0 -> 3025 bytes
-rwxr-xr-xres/drawable/ic_menu_add.pngbin0 -> 2017 bytes
-rwxr-xr-xres/drawable/ic_menu_filter_settings.pngbin0 -> 1073 bytes
-rw-r--r--res/drawable/ic_menu_scan_network.pngbin0 -> 5446 bytes
-rwxr-xr-xres/drawable/ic_network_signal_0.pngbin0 -> 581 bytes
-rwxr-xr-xres/drawable/ic_network_signal_1.pngbin0 -> 586 bytes
-rwxr-xr-xres/drawable/ic_network_signal_2.pngbin0 -> 565 bytes
-rwxr-xr-xres/drawable/ic_network_signal_3.pngbin0 -> 583 bytes
-rwxr-xr-xres/drawable/ic_network_signal_4.pngbin0 -> 559 bytes
-rwxr-xr-xres/drawable/ic_popup_brightness.pngbin0 -> 2862 bytes
-rwxr-xr-xres/drawable/ic_wifi_lock_signal_1.pngbin0 -> 1554 bytes
-rwxr-xr-xres/drawable/ic_wifi_lock_signal_2.pngbin0 -> 1558 bytes
-rwxr-xr-xres/drawable/ic_wifi_lock_signal_3.pngbin0 -> 1558 bytes
-rw-r--r--res/drawable/ic_wifi_lock_signal_4.pngbin0 -> 1580 bytes
-rwxr-xr-xres/drawable/ic_wifi_signal_1.pngbin0 -> 1337 bytes
-rwxr-xr-xres/drawable/ic_wifi_signal_2.pngbin0 -> 1358 bytes
-rwxr-xr-xres/drawable/ic_wifi_signal_3.pngbin0 -> 1371 bytes
-rw-r--r--res/drawable/ic_wifi_signal_4.pngbin0 -> 1382 bytes
-rw-r--r--res/drawable/lock_anim.xml37
-rw-r--r--res/drawable/lock_anim_0.pngbin0 -> 13458 bytes
-rw-r--r--res/drawable/lock_anim_1.pngbin0 -> 13853 bytes
-rw-r--r--res/drawable/lock_anim_10.pngbin0 -> 17020 bytes
-rw-r--r--res/drawable/lock_anim_11.pngbin0 -> 16975 bytes
-rw-r--r--res/drawable/lock_anim_12.pngbin0 -> 17342 bytes
-rw-r--r--res/drawable/lock_anim_13.pngbin0 -> 17414 bytes
-rw-r--r--res/drawable/lock_anim_14.pngbin0 -> 17121 bytes
-rw-r--r--res/drawable/lock_anim_2.pngbin0 -> 14191 bytes
-rw-r--r--res/drawable/lock_anim_3.pngbin0 -> 14394 bytes
-rw-r--r--res/drawable/lock_anim_4.pngbin0 -> 15410 bytes
-rw-r--r--res/drawable/lock_anim_5.pngbin0 -> 15863 bytes
-rw-r--r--res/drawable/lock_anim_6.pngbin0 -> 15985 bytes
-rw-r--r--res/drawable/lock_anim_7.pngbin0 -> 15510 bytes
-rw-r--r--res/drawable/lock_anim_8.pngbin0 -> 15411 bytes
-rw-r--r--res/drawable/lock_anim_9.pngbin0 -> 16656 bytes
-rw-r--r--res/drawable/signal.xml24
-rw-r--r--res/drawable/wifi_signal.xml22
-rw-r--r--res/drawable/wifi_signal_lock.xml23
-rw-r--r--res/drawable/wifi_signal_open.xml23
-rw-r--r--res/layout-land/choose_lock_pattern.xml86
-rw-r--r--res/layout-land/confirm_lock_pattern.xml66
-rw-r--r--res/layout/band_mode.xml30
-rw-r--r--res/layout/battery_history.xml144
-rw-r--r--res/layout/battery_info.xml89
-rw-r--r--res/layout/bluetooth.xml51
-rw-r--r--res/layout/bluetooth_device_info.xml62
-rw-r--r--res/layout/bluetooth_pin_entry.xml51
-rw-r--r--res/layout/bookmark_picker_item.xml38
-rw-r--r--res/layout/choose_lock_pattern.xml81
-rw-r--r--res/layout/choose_lock_pattern_example.xml93
-rw-r--r--res/layout/choose_lock_pattern_tutorial.xml85
-rwxr-xr-xres/layout/compute_sizes.xml36
-rw-r--r--res/layout/confirm_lock_pattern.xml51
-rw-r--r--res/layout/date_time_settings_setupwizard.xml55
-rw-r--r--res/layout/dialog_edittext.xml29
-rw-r--r--res/layout/display.xml49
-rw-r--r--res/layout/installed_app_details.xml311
-rw-r--r--res/layout/intent_sender.xml111
-rw-r--r--res/layout/list_content_with_empty_view.xml35
-rw-r--r--res/layout/locale_picker.xml28
-rw-r--r--res/layout/locale_picker_in_setupwizard.xml44
-rw-r--r--res/layout/locale_picker_item.xml38
-rwxr-xr-xres/layout/manage_applications_item.xml59
-rw-r--r--res/layout/master_clear_final.xml38
-rw-r--r--res/layout/master_clear_primary.xml39
-rw-r--r--res/layout/media_format_final.xml38
-rw-r--r--res/layout/media_format_primary.xml39
-rw-r--r--res/layout/preference_bluetooth.xml56
-rw-r--r--res/layout/preference_dialog_ringervolume.xml71
-rw-r--r--res/layout/preference_progress_category.xml57
-rw-r--r--res/layout/preference_widget_shortcut.xml25
-rw-r--r--res/layout/preference_widget_wifi_signal.xml23
-rw-r--r--res/layout/proxy.xml78
-rw-r--r--res/layout/radio_info.xml265
-rw-r--r--res/layout/sdcard_settings_screen.xml132
-rwxr-xr-xres/layout/usage_stats.xml45
-rwxr-xr-xres/layout/usage_stats_item.xml50
-rw-r--r--res/layout/wifi_ap_configure.xml91
-rw-r--r--res/layout/wifi_ap_info.xml61
-rw-r--r--res/layout/wifi_ap_info_row.xml32
-rw-r--r--res/layout/wifi_ap_retry_password.xml57
-rw-r--r--res/values-cs-nokeys/strings.xml19
-rw-r--r--res/values-cs/arrays.xml72
-rw-r--r--res/values-cs/strings.xml672
-rw-r--r--res/values-de-nokeys/strings.xml19
-rw-r--r--res/values-de/arrays.xml72
-rw-r--r--res/values-de/strings.xml672
-rw-r--r--res/values-es-nokeys/strings.xml19
-rw-r--r--res/values-es/arrays.xml72
-rw-r--r--res/values-es/strings.xml671
-rw-r--r--res/values-fr-nokeys/strings.xml19
-rw-r--r--res/values-fr/arrays.xml72
-rw-r--r--res/values-fr/strings.xml671
-rw-r--r--res/values-it-nokeys/strings.xml19
-rw-r--r--res/values-it/arrays.xml72
-rw-r--r--res/values-it/strings.xml671
-rw-r--r--res/values-ja-nokeys/strings.xml19
-rw-r--r--res/values-ja/arrays.xml72
-rw-r--r--res/values-ja/strings.xml672
-rw-r--r--res/values-ko-nokeys/strings.xml19
-rw-r--r--res/values-ko/arrays.xml72
-rw-r--r--res/values-ko/strings.xml672
-rw-r--r--res/values-nb-nokeys/strings.xml19
-rw-r--r--res/values-nb/arrays.xml68
-rw-r--r--res/values-nb/strings.xml670
-rw-r--r--res/values-nl-nokeys/strings.xml19
-rw-r--r--res/values-nl/arrays.xml72
-rw-r--r--res/values-nl/strings.xml672
-rw-r--r--res/values-no-nokeys/strings.xml19
-rw-r--r--res/values-nokeys/strings.xml22
-rw-r--r--res/values-pl-nokeys/strings.xml19
-rw-r--r--res/values-pl/arrays.xml72
-rw-r--r--res/values-pl/strings.xml672
-rw-r--r--res/values-ru-nokeys/strings.xml19
-rw-r--r--res/values-ru/arrays.xml72
-rw-r--r--res/values-ru/strings.xml672
-rw-r--r--res/values-zh-rCN-nokeys/strings.xml19
-rw-r--r--res/values-zh-rCN/arrays.xml72
-rw-r--r--res/values-zh-rCN/strings.xml672
-rw-r--r--res/values-zh-rTW-nokeys/strings.xml19
-rw-r--r--res/values-zh-rTW/arrays.xml72
-rw-r--r--res/values-zh-rTW/strings.xml672
-rw-r--r--res/values/arrays.xml170
-rw-r--r--res/values/attrs.xml21
-rw-r--r--res/values/colors.xml20
-rw-r--r--res/values/strings.xml1503
-rw-r--r--res/values/styles.xml81
-rw-r--r--res/xml/apn_editor.xml98
-rw-r--r--res/xml/apn_settings.xml20
-rw-r--r--res/xml/application_settings.xml55
-rw-r--r--res/xml/bluetooth_device_advanced.xml36
-rw-r--r--res/xml/bluetooth_settings.xml54
-rw-r--r--res/xml/date_time_prefs.xml44
-rw-r--r--res/xml/development_prefs.xml35
-rw-r--r--res/xml/device_info_memory.xml50
-rw-r--r--res/xml/device_info_settings.xml109
-rw-r--r--res/xml/device_info_status.xml101
-rw-r--r--res/xml/input_methods_prefs.xml22
-rw-r--r--res/xml/language_settings.xml62
-rw-r--r--res/xml/quick_launch_settings.xml23
-rw-r--r--res/xml/security_settings.xml36
-rw-r--r--res/xml/settings.xml129
-rw-r--r--res/xml/sim_lock_settings.xml33
-rw-r--r--res/xml/sound_and_display_settings.xml124
-rw-r--r--res/xml/testing_settings.xml58
-rw-r--r--res/xml/timezones.xml84
-rw-r--r--res/xml/wifi_advanced_settings.xml91
-rw-r--r--res/xml/wifi_settings.xml45
-rw-r--r--res/xml/wireless_settings.xml73
-rw-r--r--src/com/android/settings/ActivityPicker.java58
-rw-r--r--src/com/android/settings/AirplaneModeEnabler.java118
-rw-r--r--src/com/android/settings/ApnEditor.java403
-rw-r--r--src/com/android/settings/ApnSettings.java229
-rw-r--r--src/com/android/settings/ApplicationSettings.java98
-rw-r--r--src/com/android/settings/BandMode.java217
-rw-r--r--src/com/android/settings/BatteryInfo.java208
-rw-r--r--src/com/android/settings/BrightnessPreference.java103
-rw-r--r--src/com/android/settings/ChooseLockPattern.java497
-rw-r--r--src/com/android/settings/ChooseLockPatternExample.java104
-rw-r--r--src/com/android/settings/ChooseLockPatternTutorial.java75
-rw-r--r--src/com/android/settings/ConfirmLockPattern.java260
-rw-r--r--src/com/android/settings/DateTimeSettings.java366
-rw-r--r--src/com/android/settings/DateTimeSettingsSetupWizard.java41
-rw-r--r--src/com/android/settings/DebugIntentSender.java88
-rw-r--r--src/com/android/settings/DefaultRingtonePreference.java62
-rw-r--r--src/com/android/settings/DevelopmentSettings.java88
-rw-r--r--src/com/android/settings/DeviceInfoSettings.java153
-rw-r--r--src/com/android/settings/Display.java138
-rw-r--r--src/com/android/settings/EditPinPreference.java84
-rw-r--r--src/com/android/settings/GadgetPickActivity.java131
-rw-r--r--src/com/android/settings/InputMethodsSettings.java191
-rw-r--r--src/com/android/settings/InstalledAppDetails.java478
-rw-r--r--src/com/android/settings/LanguageSettings.java247
-rw-r--r--src/com/android/settings/LauncherGadgetBinder.java225
-rw-r--r--src/com/android/settings/LocalePicker.java153
-rw-r--r--src/com/android/settings/LocalePickerInSetupWizard.java43
-rw-r--r--src/com/android/settings/ManageApplications.java1307
-rw-r--r--src/com/android/settings/MasterClear.java205
-rw-r--r--src/com/android/settings/MediaFormat.java193
-rw-r--r--src/com/android/settings/ProgressCategory.java55
-rw-r--r--src/com/android/settings/ProxySelector.java260
-rw-r--r--src/com/android/settings/RadioInfo.java1184
-rw-r--r--src/com/android/settings/RingerVolumePreference.java129
-rw-r--r--src/com/android/settings/SdCardIntentReceiver.java70
-rw-r--r--src/com/android/settings/SdCardSettings.java232
-rw-r--r--src/com/android/settings/SecuritySettings.java304
-rw-r--r--src/com/android/settings/Settings.java46
-rw-r--r--src/com/android/settings/SettingsLicenseActivity.java123
-rw-r--r--src/com/android/settings/SimLockSettings.java321
-rw-r--r--src/com/android/settings/SoundAndDisplaySettings.java245
-rw-r--r--src/com/android/settings/TestingSettings.java31
-rw-r--r--src/com/android/settings/TestingSettingsBroadcastReceiver.java28
-rwxr-xr-xsrc/com/android/settings/UsageStats.java249
-rw-r--r--src/com/android/settings/UserDictionarySettings.java271
-rw-r--r--src/com/android/settings/Utils.java91
-rw-r--r--src/com/android/settings/WirelessSettings.java80
-rw-r--r--src/com/android/settings/ZoneList.java273
-rw-r--r--src/com/android/settings/ZonePicker.java70
-rw-r--r--src/com/android/settings/battery_history/BatteryHistory.java861
-rw-r--r--src/com/android/settings/battery_history/GraphableButton.java55
-rw-r--r--src/com/android/settings/bluetooth/BluetoothDevicePreference.java122
-rw-r--r--src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java198
-rw-r--r--src/com/android/settings/bluetooth/BluetoothEnabler.java149
-rw-r--r--src/com/android/settings/bluetooth/BluetoothEventRedirector.java147
-rw-r--r--src/com/android/settings/bluetooth/BluetoothNamePreference.java79
-rw-r--r--src/com/android/settings/bluetooth/BluetoothPinDialog.java202
-rw-r--r--src/com/android/settings/bluetooth/BluetoothPinRequest.java96
-rw-r--r--src/com/android/settings/bluetooth/BluetoothSettings.java260
-rw-r--r--src/com/android/settings/bluetooth/ConnectSpecificProfilesActivity.java298
-rw-r--r--src/com/android/settings/bluetooth/LocalBluetoothDevice.java576
-rw-r--r--src/com/android/settings/bluetooth/LocalBluetoothDeviceManager.java229
-rw-r--r--src/com/android/settings/bluetooth/LocalBluetoothManager.java279
-rw-r--r--src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java280
-rw-r--r--src/com/android/settings/bluetooth/SettingsBtStatus.java81
-rw-r--r--src/com/android/settings/deviceinfo/Memory.java218
-rw-r--r--src/com/android/settings/deviceinfo/Status.java392
-rw-r--r--src/com/android/settings/quicklaunch/BookmarkPicker.java331
-rw-r--r--src/com/android/settings/quicklaunch/QuickLaunchSettings.java347
-rw-r--r--src/com/android/settings/quicklaunch/ShortcutPreference.java151
-rw-r--r--src/com/android/settings/wifi/AccessPointDialog.java600
-rw-r--r--src/com/android/settings/wifi/AccessPointPreference.java108
-rw-r--r--src/com/android/settings/wifi/AccessPointState.java879
-rw-r--r--src/com/android/settings/wifi/AdvancedSettings.java274
-rw-r--r--src/com/android/settings/wifi/WifiEnabler.java188
-rw-r--r--src/com/android/settings/wifi/WifiLayer.java1302
-rw-r--r--src/com/android/settings/wifi/WifiSettings.java438
-rw-r--r--src/com/android/settings/wifi/WifiStatus.java152
-rw-r--r--tests/Android.mk17
-rw-r--r--tests/AndroidManifest.xml29
-rw-r--r--tests/src/com/android/settings/SettingsLaunchPerformance.java53
242 files changed, 36904 insertions, 0 deletions
diff --git a/Android.mk b/Android.mk
new file mode 100644
index 0000000..0955671
--- /dev/null
+++ b/Android.mk
@@ -0,0 +1,14 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := user development
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := Settings
+LOCAL_CERTIFICATE := platform
+
+include $(BUILD_PACKAGE)
+
+# Use the folloing include to make our test apk.
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
new file mode 100644
index 0000000..cab768d
--- /dev/null
+++ b/AndroidManifest.xml
@@ -0,0 +1,508 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.settings"
+ android:sharedUserId="android.uid.system">
+
+ <uses-permission android:name="com.google.android.providers.gmail.permission.WRITE_GMAIL" />
+ <uses-permission android:name="com.google.android.providers.gmail.permission.READ_GMAIL" />
+ <uses-permission android:name="android.permission.WRITE_SETTINGS" />
+ <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
+ <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
+ <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
+ <uses-permission android:name="android.permission.VIBRATE" />
+ <uses-permission android:name="android.permission.BLUETOOTH" />
+ <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
+ <uses-permission android:name="android.permission.HARDWARE_TEST" />
+ <uses-permission android:name="android.permission.CALL_PHONE" />
+ <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
+ <uses-permission android:name="android.permission.MASTER_CLEAR" />
+ <uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH" />
+ <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />
+ <uses-permission android:name="android.permission.READ_CONTACTS" />
+ <uses-permission android:name="android.permission.WRITE_CONTACTS" />
+ <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+ <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
+ <uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />
+ <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+ <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
+ <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
+ <uses-permission android:name="android.permission.WRITE_APN_SETTINGS"/>
+ <uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES"/>
+ <uses-permission android:name="android.permission.READ_USER_DICTIONARY"/>
+ <uses-permission android:name="android.permission.WRITE_USER_DICTIONARY"/>
+ <uses-permission android:name="android.permission.RESTART_PACKAGES"/>
+ <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>
+ <uses-permission android:name="android.permission.BATTERY_STATS"/>
+ <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
+ <uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />
+
+ <application android:label="@string/settings_label" android:icon="@drawable/ic_launcher_settings">
+
+ <!-- Settings -->
+
+ <activity android:name="Settings" android:label="@string/settings_label"
+ android:clearTaskOnLaunch="true"
+ android:launchMode="singleTop">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <action android:name="android.settings.SETTINGS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+
+ <!-- Wireless Controls -->
+
+ <activity android:name="WirelessSettings"
+ android:label="@string/radio_controls_title"
+ >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <action android:name="android.settings.WIRELESS_SETTINGS" />
+ <action android:name="android.settings.AIRPLANE_MODE_SETTINGS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+
+ <!-- Top-level settings -->
+
+ <activity android:name=".wifi.WifiSettings" android:label="@string/wifi_settings"
+ >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <action android:name="android.settings.WIFI_SETTINGS" />
+ <action android:name="android.net.wifi.PICK_WIFI_NETWORK" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name=".wifi.AdvancedSettings" android:label="@string/wifi_ip_settings_titlebar"
+ >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <action android:name="android.settings.WIFI_IP_SETTINGS" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="ApnSettings" android:label="@string/apn_settings"
+ android:configChanges="orientation|keyboardHidden"
+ android:launchMode="singleInstance"
+ >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <action android:name="android.settings.APN_SETTINGS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name=".bluetooth.BluetoothSettings"
+ android:label="@string/bluetooth_settings_title"
+ >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <action android:name="android.settings.BLUETOOTH_SETTINGS" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="DateTimeSettings" android:label="@string/date_and_time"
+ >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <action android:name="android.settings.DATE_SETTINGS" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="DateTimeSettingsSetupWizard" android:label="@string/date_and_time">
+ android:screenOrientation="portrait"
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="LocalePicker" android:label="@string/language_picker_title">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <action android:name="android.settings.LOCALE_SETTINGS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="LocalePickerInSetupWizard" android:label="@string/language_picker_title">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="LanguageSettings" android:label="@string/language_picker_title"
+ >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="InputMethodsSettings" android:icon="@drawable/app_settings"
+ android:label="@string/input_methods_settings_title"
+ >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <action android:name="android.settings.INPUT_METHOD_SETTINGS" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="UserDictionarySettings" android:icon="@drawable/app_settings"
+ android:label="@string/user_dict_settings_titlebar">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <action android:name="android.settings.USER_DICTIONARY_SETTINGS" />
+ <action android:name="com.android.settings.USER_DICTIONARY_INSERT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="SoundAndDisplaySettings" android:label="@string/sound_and_display_settings"
+ >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <action android:name="com.android.settings.SOUND_SETTINGS" />
+ <action android:name="com.android.settings.DISPLAY_SETTINGS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="DeviceInfoSettings" android:label="@string/device_info_settings"
+ >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="SettingsLicenseActivity"
+ android:label="@string/settings_license_activity_title"
+ android:theme="@*android:style/Theme.Dialog.Alert">
+ <intent-filter>
+ <action android:name="android.settings.LICENSE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="ApplicationSettings" android:label="@string/applications_settings_header"
+ >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <action android:name="android.settings.APPLICATION_SETTINGS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="ManageApplications"
+ android:label="@string/manageapplications_settings_title"
+ android:configChanges="orientation|keyboardHidden">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <action android:name="android.intent.action.MANAGE_PACKAGE_STORAGE" />
+ <action android:name="android.settings.MANAGE_APPLICATIONS_SETTINGS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.MONKEY" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="InstalledAppDetails" android:label="@string/application_info_label">
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="SecuritySettings" android:label="@string/security_settings_title">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <action android:name="android.settings.SECURITY_SETTINGS" />
+ <action android:name="android.settings.LOCATION_SOURCE_SETTINGS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="SimLockSettings" android:label="@string/sim_lock_settings"
+ android:process="com.android.phone">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+
+
+
+ <!-- Second and third-level settings -->
+
+ <activity android:name="ConfirmLockPattern"/>
+
+ <activity android:name="ChooseLockPattern" android:label="@string/lockpattern_change_lock_pattern_label">
+ <intent-filter>
+ <action android:name="android.intent.action.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="ChooseLockPatternTutorial"
+ android:label="@string/lockpattern_change_lock_pattern_label"
+ >
+ <intent-filter>
+ <action android:name="android.intent.action.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="ChooseLockPatternExample"
+ android:label="@string/lockpattern_change_lock_pattern_label">
+ <intent-filter>
+ <action android:name="android.intent.action.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="ZoneList" android:label="@string/choose_timezone" />
+
+ <activity android:name=".deviceinfo.Status" android:label="@string/device_status_activity_title"
+ android:process="com.android.phone">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name=".deviceinfo.Memory" android:label="@string/storage_settings_title">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <action android:name="android.settings.INTERNAL_STORAGE_SETTINGS" />
+ <action android:name="android.settings.MEMORY_CARD_SETTINGS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="ApnEditor" android:label="@string/apn_edit">
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <action android:name="android.intent.action.EDIT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="vnd.android.cursor.item/telephony-carrier" />
+ </intent-filter>
+
+ <intent-filter>
+ <action android:name="android.intent.action.INSERT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="vnd.android.cursor.dir/telephony-carrier" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="MasterClear" android:label="@string/master_clear_title">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="MediaFormat" android:label="@string/media_format_title">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name=".quicklaunch.QuickLaunchSettings"
+ android:label="@string/quick_launch_title">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <action android:name="com.android.settings.QUICK_LAUNCH_SETTINGS" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name=".quicklaunch.BookmarkPicker" android:label="@string/quick_launch_title">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="DevelopmentSettings" android:icon="@drawable/app_settings"
+ android:label="@string/development_settings_title">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <action android:name="com.android.settings.APPLICATION_DEVELOPMENT_SETTINGS" />
+ </intent-filter>
+ </activity>
+
+
+
+
+ <!-- Bluetooth stuff -->
+
+ <activity android:name=".bluetooth.ConnectSpecificProfilesActivity"
+ android:label="@string/bluetooth_connect_specific_profiles_title" />
+
+ <activity android:name=".bluetooth.BluetoothPinDialog"
+ android:label="@string/bluetooth_pin_entry"
+ android:theme="@*android:style/Theme.Dialog.Alert">
+ <intent-filter>
+ <action android:name="android.bluetooth.intent.action.PAIRING_REQUEST" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+ <receiver android:name=".bluetooth.BluetoothPinRequest">
+ <intent-filter>
+ <action android:name="android.bluetooth.intent.action.PAIRING_REQUEST" />
+ <action android:name="android.bluetooth.intent.action.PAIRING_CANCEL" />
+ </intent-filter>
+ </receiver>
+
+ <activity android:name="ActivityPicker" android:label="@string/activity_picker_label">
+ <intent-filter>
+ <action android:name="android.intent.action.PICK_ACTIVITY" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+
+
+
+
+ <!-- Development settings -->
+
+ <activity android:name="DebugIntentSender" android:label="@string/debug_intent_sender_label">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEVELOPMENT_PREFERENCE" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="DeviceInfo" android:label="@string/device_info_label">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEVELOPMENT_PREFERENCE" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <!-- DeviceInfo adds the user's requested build to stats upload. -->
+ <receiver android:name=".DeviceInfo$StatsReportReceiver">
+ <intent-filter>
+ <action android:name="android.intent.action.STATISTICS_REPORT" />
+ </intent-filter>
+ </receiver>
+
+ <activity android:name="BatteryInfo" android:label="@string/battery_info_label">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEVELOPMENT_PREFERENCE" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name=".battery_history.BatteryHistory" android:label="@string/battery_history_label">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEVELOPMENT_PREFERENCE" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="Display" android:label="@string/display_label"
+ android:configChanges="fontScale">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEVELOPMENT_PREFERENCE" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="RadioInfo" android:label="@string/phone_info_label"
+ android:process="com.android.phone">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEVELOPMENT_PREFERENCE" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="SdCardSettings" android:label="@string/sd_card_settings_label">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEVELOPMENT_PREFERENCE" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="ProxySelector" android:label="@string/proxy_settings_label"
+ android:theme="@android:style/Theme.Dialog">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEVELOPMENT_PREFERENCE" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <!-- TODO: Is this needed? -->
+ <activity android:name="BandMode"
+ android:theme="@android:style/Theme.Dialog"
+ android:process="com.android.phone">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.VOICE_LAUNCH" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="TestingSettings" android:label="@string/testing">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+ <receiver android:name="TestingSettingsBroadcastReceiver">
+ <intent-filter>
+ <action android:name="android.provider.Telephony.SECRET_CODE" />
+ <data android:scheme="android_secret_code" android:host="4636" />
+ </intent-filter>
+ </receiver>
+
+ <!-- Standard picker for gadgets -->
+ <activity android:name="GadgetPickActivity" android:label="@string/widget_picker_title">
+ <intent-filter>
+ <action android:name="android.gadget.action.GADGET_PICK" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+ <!-- Helper to bind any unbound gadgets in Launcher, used as
+ part of initialization and upgrade process -->
+ <activity android:name="LauncherGadgetBinder"
+ android:permission="com.android.launcher.permission.WRITE_SETTINGS"
+ android:theme="@android:style/Theme.NoDisplay" android:exported="true" />
+
+ <activity android:name="UsageStats" android:label="@string/usage_stats_label">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEVELOPMENT_PREFERENCE" />
+ </intent-filter>
+ </activity>
+
+ </application>
+
+</manifest>
+
diff --git a/MODULE_LICENSE_APACHE2 b/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/MODULE_LICENSE_APACHE2
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000..c5b1efa
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,190 @@
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
diff --git a/res/drawable/app_settings.png b/res/drawable/app_settings.png
new file mode 100644
index 0000000..ed23bbf
--- /dev/null
+++ b/res/drawable/app_settings.png
Binary files differ
diff --git a/res/drawable/border_item_thumbnail.png b/res/drawable/border_item_thumbnail.png
new file mode 100755
index 0000000..6454138
--- /dev/null
+++ b/res/drawable/border_item_thumbnail.png
Binary files differ
diff --git a/res/drawable/dotted_line_480px.png b/res/drawable/dotted_line_480px.png
new file mode 100755
index 0000000..a52ca43
--- /dev/null
+++ b/res/drawable/dotted_line_480px.png
Binary files differ
diff --git a/res/drawable/ic_bt_cellphone.png b/res/drawable/ic_bt_cellphone.png
new file mode 100755
index 0000000..4bf7ba5
--- /dev/null
+++ b/res/drawable/ic_bt_cellphone.png
Binary files differ
diff --git a/res/drawable/ic_bt_headphones_a2dp.png b/res/drawable/ic_bt_headphones_a2dp.png
new file mode 100755
index 0000000..b9bfec6
--- /dev/null
+++ b/res/drawable/ic_bt_headphones_a2dp.png
Binary files differ
diff --git a/res/drawable/ic_bt_headset_hfp.png b/res/drawable/ic_bt_headset_hfp.png
new file mode 100644
index 0000000..cd91841
--- /dev/null
+++ b/res/drawable/ic_bt_headset_hfp.png
Binary files differ
diff --git a/res/drawable/ic_bt_laptop.png b/res/drawable/ic_bt_laptop.png
new file mode 100755
index 0000000..49a71c9
--- /dev/null
+++ b/res/drawable/ic_bt_laptop.png
Binary files differ
diff --git a/res/drawable/ic_btn_next.png b/res/drawable/ic_btn_next.png
new file mode 100644
index 0000000..c6cf436
--- /dev/null
+++ b/res/drawable/ic_btn_next.png
Binary files differ
diff --git a/res/drawable/ic_launcher_settings.png b/res/drawable/ic_launcher_settings.png
new file mode 100755
index 0000000..16db056
--- /dev/null
+++ b/res/drawable/ic_launcher_settings.png
Binary files differ
diff --git a/res/drawable/ic_menu_3d_globe.png b/res/drawable/ic_menu_3d_globe.png
new file mode 100644
index 0000000..638e7fd
--- /dev/null
+++ b/res/drawable/ic_menu_3d_globe.png
Binary files differ
diff --git a/res/drawable/ic_menu_add.png b/res/drawable/ic_menu_add.png
new file mode 100755
index 0000000..6752bfd
--- /dev/null
+++ b/res/drawable/ic_menu_add.png
Binary files differ
diff --git a/res/drawable/ic_menu_filter_settings.png b/res/drawable/ic_menu_filter_settings.png
new file mode 100755
index 0000000..7be883a
--- /dev/null
+++ b/res/drawable/ic_menu_filter_settings.png
Binary files differ
diff --git a/res/drawable/ic_menu_scan_network.png b/res/drawable/ic_menu_scan_network.png
new file mode 100644
index 0000000..eed82a2
--- /dev/null
+++ b/res/drawable/ic_menu_scan_network.png
Binary files differ
diff --git a/res/drawable/ic_network_signal_0.png b/res/drawable/ic_network_signal_0.png
new file mode 100755
index 0000000..150e345
--- /dev/null
+++ b/res/drawable/ic_network_signal_0.png
Binary files differ
diff --git a/res/drawable/ic_network_signal_1.png b/res/drawable/ic_network_signal_1.png
new file mode 100755
index 0000000..bc99c0f
--- /dev/null
+++ b/res/drawable/ic_network_signal_1.png
Binary files differ
diff --git a/res/drawable/ic_network_signal_2.png b/res/drawable/ic_network_signal_2.png
new file mode 100755
index 0000000..9d5d611
--- /dev/null
+++ b/res/drawable/ic_network_signal_2.png
Binary files differ
diff --git a/res/drawable/ic_network_signal_3.png b/res/drawable/ic_network_signal_3.png
new file mode 100755
index 0000000..259ba2d
--- /dev/null
+++ b/res/drawable/ic_network_signal_3.png
Binary files differ
diff --git a/res/drawable/ic_network_signal_4.png b/res/drawable/ic_network_signal_4.png
new file mode 100755
index 0000000..605b144
--- /dev/null
+++ b/res/drawable/ic_network_signal_4.png
Binary files differ
diff --git a/res/drawable/ic_popup_brightness.png b/res/drawable/ic_popup_brightness.png
new file mode 100755
index 0000000..e9172a6
--- /dev/null
+++ b/res/drawable/ic_popup_brightness.png
Binary files differ
diff --git a/res/drawable/ic_wifi_lock_signal_1.png b/res/drawable/ic_wifi_lock_signal_1.png
new file mode 100755
index 0000000..af78e05
--- /dev/null
+++ b/res/drawable/ic_wifi_lock_signal_1.png
Binary files differ
diff --git a/res/drawable/ic_wifi_lock_signal_2.png b/res/drawable/ic_wifi_lock_signal_2.png
new file mode 100755
index 0000000..b5b373e
--- /dev/null
+++ b/res/drawable/ic_wifi_lock_signal_2.png
Binary files differ
diff --git a/res/drawable/ic_wifi_lock_signal_3.png b/res/drawable/ic_wifi_lock_signal_3.png
new file mode 100755
index 0000000..49ac417
--- /dev/null
+++ b/res/drawable/ic_wifi_lock_signal_3.png
Binary files differ
diff --git a/res/drawable/ic_wifi_lock_signal_4.png b/res/drawable/ic_wifi_lock_signal_4.png
new file mode 100644
index 0000000..cd86ca0
--- /dev/null
+++ b/res/drawable/ic_wifi_lock_signal_4.png
Binary files differ
diff --git a/res/drawable/ic_wifi_signal_1.png b/res/drawable/ic_wifi_signal_1.png
new file mode 100755
index 0000000..7a524e3
--- /dev/null
+++ b/res/drawable/ic_wifi_signal_1.png
Binary files differ
diff --git a/res/drawable/ic_wifi_signal_2.png b/res/drawable/ic_wifi_signal_2.png
new file mode 100755
index 0000000..efe4b5f
--- /dev/null
+++ b/res/drawable/ic_wifi_signal_2.png
Binary files differ
diff --git a/res/drawable/ic_wifi_signal_3.png b/res/drawable/ic_wifi_signal_3.png
new file mode 100755
index 0000000..a720bb0
--- /dev/null
+++ b/res/drawable/ic_wifi_signal_3.png
Binary files differ
diff --git a/res/drawable/ic_wifi_signal_4.png b/res/drawable/ic_wifi_signal_4.png
new file mode 100644
index 0000000..d45028e
--- /dev/null
+++ b/res/drawable/ic_wifi_signal_4.png
Binary files differ
diff --git a/res/drawable/lock_anim.xml b/res/drawable/lock_anim.xml
new file mode 100644
index 0000000..8ec31a6
--- /dev/null
+++ b/res/drawable/lock_anim.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<animation-list
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:oneshot="false">
+ <item android:drawable="@drawable/lock_anim_0" android:duration="200" />
+ <item android:drawable="@drawable/lock_anim_1" android:duration="200" />
+ <item android:drawable="@drawable/lock_anim_2" android:duration="200" />
+ <item android:drawable="@drawable/lock_anim_3" android:duration="200" />
+ <item android:drawable="@drawable/lock_anim_4" android:duration="200" />
+ <item android:drawable="@drawable/lock_anim_5" android:duration="200" />
+ <item android:drawable="@drawable/lock_anim_6" android:duration="200" />
+ <item android:drawable="@drawable/lock_anim_7" android:duration="200" />
+ <item android:drawable="@drawable/lock_anim_8" android:duration="200" />
+ <item android:drawable="@drawable/lock_anim_9" android:duration="200" />
+ <item android:drawable="@drawable/lock_anim_10" android:duration="200" />
+ <item android:drawable="@drawable/lock_anim_11" android:duration="200" />
+ <item android:drawable="@drawable/lock_anim_12" android:duration="200" />
+ <item android:drawable="@drawable/lock_anim_13" android:duration="200" />
+ <item android:drawable="@drawable/lock_anim_14" android:duration="200" />
+</animation-list>
diff --git a/res/drawable/lock_anim_0.png b/res/drawable/lock_anim_0.png
new file mode 100644
index 0000000..afdda8b
--- /dev/null
+++ b/res/drawable/lock_anim_0.png
Binary files differ
diff --git a/res/drawable/lock_anim_1.png b/res/drawable/lock_anim_1.png
new file mode 100644
index 0000000..6cae8e5
--- /dev/null
+++ b/res/drawable/lock_anim_1.png
Binary files differ
diff --git a/res/drawable/lock_anim_10.png b/res/drawable/lock_anim_10.png
new file mode 100644
index 0000000..5de840e
--- /dev/null
+++ b/res/drawable/lock_anim_10.png
Binary files differ
diff --git a/res/drawable/lock_anim_11.png b/res/drawable/lock_anim_11.png
new file mode 100644
index 0000000..35db815
--- /dev/null
+++ b/res/drawable/lock_anim_11.png
Binary files differ
diff --git a/res/drawable/lock_anim_12.png b/res/drawable/lock_anim_12.png
new file mode 100644
index 0000000..8778d98
--- /dev/null
+++ b/res/drawable/lock_anim_12.png
Binary files differ
diff --git a/res/drawable/lock_anim_13.png b/res/drawable/lock_anim_13.png
new file mode 100644
index 0000000..d0b8cf0
--- /dev/null
+++ b/res/drawable/lock_anim_13.png
Binary files differ
diff --git a/res/drawable/lock_anim_14.png b/res/drawable/lock_anim_14.png
new file mode 100644
index 0000000..ea1aa31
--- /dev/null
+++ b/res/drawable/lock_anim_14.png
Binary files differ
diff --git a/res/drawable/lock_anim_2.png b/res/drawable/lock_anim_2.png
new file mode 100644
index 0000000..0542b1d
--- /dev/null
+++ b/res/drawable/lock_anim_2.png
Binary files differ
diff --git a/res/drawable/lock_anim_3.png b/res/drawable/lock_anim_3.png
new file mode 100644
index 0000000..7e2ba9a
--- /dev/null
+++ b/res/drawable/lock_anim_3.png
Binary files differ
diff --git a/res/drawable/lock_anim_4.png b/res/drawable/lock_anim_4.png
new file mode 100644
index 0000000..a3ca629
--- /dev/null
+++ b/res/drawable/lock_anim_4.png
Binary files differ
diff --git a/res/drawable/lock_anim_5.png b/res/drawable/lock_anim_5.png
new file mode 100644
index 0000000..17e3839
--- /dev/null
+++ b/res/drawable/lock_anim_5.png
Binary files differ
diff --git a/res/drawable/lock_anim_6.png b/res/drawable/lock_anim_6.png
new file mode 100644
index 0000000..90205a6
--- /dev/null
+++ b/res/drawable/lock_anim_6.png
Binary files differ
diff --git a/res/drawable/lock_anim_7.png b/res/drawable/lock_anim_7.png
new file mode 100644
index 0000000..1d94a47
--- /dev/null
+++ b/res/drawable/lock_anim_7.png
Binary files differ
diff --git a/res/drawable/lock_anim_8.png b/res/drawable/lock_anim_8.png
new file mode 100644
index 0000000..af7cd28
--- /dev/null
+++ b/res/drawable/lock_anim_8.png
Binary files differ
diff --git a/res/drawable/lock_anim_9.png b/res/drawable/lock_anim_9.png
new file mode 100644
index 0000000..d401624
--- /dev/null
+++ b/res/drawable/lock_anim_9.png
Binary files differ
diff --git a/res/drawable/signal.xml b/res/drawable/signal.xml
new file mode 100644
index 0000000..f315600
--- /dev/null
+++ b/res/drawable/signal.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<level-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:maxLevel="0" android:drawable="@drawable/ic_network_signal_0" />
+ <item android:maxLevel="1" android:drawable="@drawable/ic_network_signal_1" />
+ <item android:maxLevel="2" android:drawable="@drawable/ic_network_signal_2" />
+ <item android:maxLevel="3" android:drawable="@drawable/ic_network_signal_3" />
+ <item android:maxLevel="4" android:drawable="@drawable/ic_network_signal_4" />
+</level-list>
+
diff --git a/res/drawable/wifi_signal.xml b/res/drawable/wifi_signal.xml
new file mode 100644
index 0000000..86c1ab0
--- /dev/null
+++ b/res/drawable/wifi_signal.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res/com.android.settings">
+ <item settings:state_encrypted="true" android:drawable="@drawable/wifi_signal_lock" />
+ <item settings:state_encrypted="false" android:drawable="@drawable/wifi_signal_open" />
+</selector>
+
diff --git a/res/drawable/wifi_signal_lock.xml b/res/drawable/wifi_signal_lock.xml
new file mode 100644
index 0000000..2ad6d91
--- /dev/null
+++ b/res/drawable/wifi_signal_lock.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<level-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:maxLevel="0" android:drawable="@drawable/ic_wifi_lock_signal_1" />
+ <item android:maxLevel="1" android:drawable="@drawable/ic_wifi_lock_signal_2" />
+ <item android:maxLevel="2" android:drawable="@drawable/ic_wifi_lock_signal_3" />
+ <item android:maxLevel="3" android:drawable="@drawable/ic_wifi_lock_signal_4" />
+</level-list>
+
diff --git a/res/drawable/wifi_signal_open.xml b/res/drawable/wifi_signal_open.xml
new file mode 100644
index 0000000..b506dd3
--- /dev/null
+++ b/res/drawable/wifi_signal_open.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<level-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:maxLevel="0" android:drawable="@drawable/ic_wifi_signal_1" />
+ <item android:maxLevel="1" android:drawable="@drawable/ic_wifi_signal_2" />
+ <item android:maxLevel="2" android:drawable="@drawable/ic_wifi_signal_3" />
+ <item android:maxLevel="3" android:drawable="@drawable/ic_wifi_signal_4" />
+</level-list>
+
diff --git a/res/layout-land/choose_lock_pattern.xml b/res/layout-land/choose_lock_pattern.xml
new file mode 100644
index 0000000..1502301
--- /dev/null
+++ b/res/layout-land/choose_lock_pattern.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/topLayout"
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:background="@color/black">
+
+ <!-- left side: instructions and messages -->
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="0dip"
+ android:layout_height="fill_parent"
+ android:layout_weight="1.0"
+ >
+
+ <!-- header message -->
+ <TextView android:id="@+id/headerText"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:textSize="18sp"/>
+
+ <!-- footer can show a message, or confirm / restart buttons -->
+ <RelativeLayout
+ android:layout_width="fill_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1.0">
+
+ <!-- left button: skip, or re-try -->
+ <Button android:id="@+id/footerLeftButton"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentBottom="true"
+ android:text="@string/lockpattern_restart_button_text"/>
+
+ <!-- right button: confirm or ok -->
+ <Button android:id="@+id/footerRightButton"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentBottom="true"
+ android:drawableRight="@drawable/ic_btn_next"
+ android:drawablePadding="3dip"
+ android:text="@string/lockpattern_confirm_button_text"/>
+
+ <!-- message above buttons -->
+ <TextView android:id="@+id/footerText"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_above="@+id/footerRightButton"
+ android:layout_centerHorizontal="true"
+ android:layout_marginBottom="4dip"
+ android:textSize="14sp"/>
+ </RelativeLayout>
+ </LinearLayout>
+
+ <View
+ android:background="@*android:drawable/code_lock_left"
+ android:layout_width="2dip"
+ android:layout_height="fill_parent" />
+ <!-- right side: lock pattern -->
+ <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+
+</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
+
diff --git a/res/layout-land/confirm_lock_pattern.xml b/res/layout-land/confirm_lock_pattern.xml
new file mode 100644
index 0000000..6decb14
--- /dev/null
+++ b/res/layout-land/confirm_lock_pattern.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/topLayout"
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:background="@color/black">
+
+ <!-- left side: instructions and messages -->
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="0dip"
+ android:layout_height="fill_parent"
+ android:layout_weight="1.0"
+ >
+
+ <!-- header message -->
+ <TextView android:id="@+id/headerText"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:textSize="18sp"/>
+
+ <!-- fill space between header and button below -->
+ <View
+ android:layout_weight="1.0"
+ android:layout_width="fill_parent"
+ android:layout_height="0dip"
+ />
+
+ <!-- footer message -->
+ <TextView android:id="@+id/footerText"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:textSize="14sp"/>
+ </LinearLayout>
+
+ <View
+ android:background="@*android:drawable/code_lock_left"
+ android:layout_width="2dip"
+ android:layout_height="fill_parent" />
+ <!-- right side: lock pattern -->
+ <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+
+</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
+
diff --git a/res/layout/band_mode.xml b/res/layout/band_mode.xml
new file mode 100644
index 0000000..e920af0
--- /dev/null
+++ b/res/layout/band_mode.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:padding="4dip"
+ android:gravity="center_horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <ListView android:id="@+id/band"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:textSize="7sp">
+ </ListView>
+
+</LinearLayout>
diff --git a/res/layout/battery_history.xml b/res/layout/battery_history.xml
new file mode 100644
index 0000000..5421c40
--- /dev/null
+++ b/res/layout/battery_history.xml
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/topLayout"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" />
+
+ <LinearLayout
+ android:id="@+id/graphLayout"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent" >
+
+ <Spinner
+ android:id="@+id/typeSpinner"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:entries="@array/battery_history_type_spinner" />
+
+ <Spinner
+ android:id="@+id/whichSpinner"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:entries="@array/battery_history_which_spinner" />
+
+ <ScrollView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" >
+
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" >
+
+ <TextView
+ android:id="@+id/messageText"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal"
+ android:textSize="17dp"
+ android:visibility="gone" />
+
+ <com.android.settings.battery_history.GraphableButton
+ android:id="@+id/button0"
+ android:layout_width="fill_parent"
+ android:layout_height="0dp"
+ android:layout_marginLeft="4dp"
+ android:layout_marginRight="4dp"
+ android:layout_marginBottom="4dp"
+ android:layout_weight="1" />
+
+ <com.android.settings.battery_history.GraphableButton
+ android:id="@+id/button1"
+ android:layout_width="fill_parent"
+ android:layout_height="0dp"
+ android:layout_marginLeft="4dp"
+ android:layout_marginRight="4dp"
+ android:layout_marginBottom="4dp"
+ android:layout_weight="1" />
+
+ <com.android.settings.battery_history.GraphableButton
+ android:id="@+id/button2"
+ android:layout_width="fill_parent"
+ android:layout_height="0dp"
+ android:layout_marginLeft="4dp"
+ android:layout_marginRight="4dp"
+ android:layout_marginBottom="4dp"
+ android:layout_weight="1" />
+
+ <com.android.settings.battery_history.GraphableButton
+ android:id="@+id/button3"
+ android:layout_width="fill_parent"
+ android:layout_height="0dp"
+ android:layout_marginLeft="4dp"
+ android:layout_marginRight="4dp"
+ android:layout_marginBottom="4dp"
+ android:layout_weight="1" />
+
+ <com.android.settings.battery_history.GraphableButton
+ android:id="@+id/button4"
+ android:layout_width="fill_parent"
+ android:layout_height="0dp"
+ android:layout_marginLeft="4dp"
+ android:layout_marginRight="4dp"
+ android:layout_marginBottom="4dp"
+ android:layout_weight="1" />
+
+ <com.android.settings.battery_history.GraphableButton
+ android:id="@+id/button5"
+ android:layout_width="fill_parent"
+ android:layout_height="0dp"
+ android:layout_marginLeft="4dp"
+ android:layout_marginRight="4dp"
+ android:layout_marginBottom="4dp"
+ android:layout_weight="1" />
+
+ <com.android.settings.battery_history.GraphableButton
+ android:id="@+id/button6"
+ android:layout_width="fill_parent"
+ android:layout_height="0dp"
+ android:layout_marginLeft="4dp"
+ android:layout_marginRight="4dp"
+ android:layout_marginBottom="4dp"
+ android:layout_weight="1" />
+
+ <com.android.settings.battery_history.GraphableButton
+ android:id="@+id/button7"
+ android:layout_width="fill_parent"
+ android:layout_height="0dp"
+ android:layout_marginLeft="4dp"
+ android:layout_marginRight="4dp"
+ android:layout_marginBottom="4dp"
+ android:layout_weight="1" />
+
+ </LinearLayout>
+ </ScrollView>
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/textLayout"
+ android:visibility="gone"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent" >
+
+ <ScrollView
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent" >
+ <TextView
+ android:id="@+id/detailsText"
+ android:layout_width="fill_parent"
+ android:textSize="17dp"
+ android:layout_height="1000dp"/>
+ </ScrollView>
+
+ </LinearLayout>
+
+</LinearLayout>
diff --git a/res/layout/battery_info.xml b/res/layout/battery_info.xml
new file mode 100644
index 0000000..3889827
--- /dev/null
+++ b/res/layout/battery_info.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* //device/apps/Settings/assets/res/any/layout/battery_info.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/info_layout">
+
+ <!-- Battery Status -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/battery_info_status_label" style="@style/info_label" />
+ <TextView android:id="@+id/status" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Battery Level -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/battery_info_level_label" style="@style/info_label" />
+ <TextView android:id="@+id/level" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Battery Scale -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/battery_info_scale_label" style="@style/info_label" />
+ <TextView android:id="@+id/scale" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Battery Health -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/battery_info_health_label" style="@style/info_label" />
+ <TextView android:id="@+id/health" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Battery Voltage -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/battery_info_voltage_label" style="@style/info_label" />
+ <TextView android:id="@+id/voltage" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Battery Temperature -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/battery_info_temperature_label" style="@style/info_label" />
+ <TextView android:id="@+id/temperature" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Battery Technology -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/battery_info_technology_label" style="@style/info_label" />
+ <TextView android:id="@+id/technology" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Uptime -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/battery_info_uptime" style="@style/info_label" />
+ <TextView android:id="@+id/uptime" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Awaketime Battery -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/battery_info_awake_battery" style="@style/info_label" />
+ <TextView android:id="@+id/awakeBattery" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Awaketime Plugged In -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/battery_info_awake_plugged" style="@style/info_label" />
+ <TextView android:id="@+id/awakePlugged" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Screen On Time -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/battery_info_screen_on" style="@style/info_label" />
+ <TextView android:id="@+id/screenOn" style="@style/info_value" />
+ </LinearLayout>
+</LinearLayout>
+
diff --git a/res/layout/bluetooth.xml b/res/layout/bluetooth.xml
new file mode 100644
index 0000000..530cbbe
--- /dev/null
+++ b/res/layout/bluetooth.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* //device/apps/Settings/assets/res/layout/bluetooth.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:paddingLeft="2dip"
+ android:paddingRight="2dip">
+
+ <Button android:id="@+id/enable"
+ android:textStyle="bold"
+ android:text="@string/bluetooth_enable_text"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"/>
+
+ <Button android:id="@+id/scan"
+ android:textStyle="bold"
+ android:text="@string/bluetooth_scan_text"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"/>
+
+ <Button android:id="@+id/settings"
+ android:textStyle="bold"
+ android:text="@string/bluetooth_settings_text"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"/>
+
+ <ListView android:id="@android:id/list"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:drawSelectorOnTop="false">
+ </ListView>
+
+</LinearLayout>
diff --git a/res/layout/bluetooth_device_info.xml b/res/layout/bluetooth_device_info.xml
new file mode 100644
index 0000000..e589103
--- /dev/null
+++ b/res/layout/bluetooth_device_info.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/scroll_content"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/bluetooth_device_info_alias" />
+
+ <TextView android:id="@+id/deviceAlias"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/bluetooth_device_info_no_alias" />
+
+ <Button android:id="@+id/connectButton"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/bluetooth_device_info_connectButton_text" />
+
+ <Button android:id="@+id/deleteButton"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/bluetooth_device_info_delete" />
+
+ <Button android:id="@+id/querySDP"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/bluetooth_device_info_sdp" />
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/bluetooth_device_info" />
+
+ <TextView android:id="@+id/deviceInfo"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/bluetooth_device_info_deviceInfo_text" />
+ </LinearLayout>
+</ScrollView>
+
diff --git a/res/layout/bluetooth_pin_entry.xml b/res/layout/bluetooth_pin_entry.xml
new file mode 100644
index 0000000..bcb6f16
--- /dev/null
+++ b/res/layout/bluetooth_pin_entry.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<ScrollView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_height="fill_parent"
+ android:layout_width="fill_parent">
+
+ <LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_height="fill_parent"
+ android:layout_width="fill_parent"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/message"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:gravity="center_horizontal"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <EditText
+ android:id="@+id/text"
+ android:layout_height="wrap_content"
+ android:layout_width="fill_parent"
+ android:layout_marginTop="20dip"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:singleLine="true" />
+
+ </LinearLayout>
+
+</ScrollView> \ No newline at end of file
diff --git a/res/layout/bookmark_picker_item.xml b/res/layout/bookmark_picker_item.xml
new file mode 100644
index 0000000..fd764ea
--- /dev/null
+++ b/res/layout/bookmark_picker_item.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<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:paddingLeft="2dip"
+ android:gravity="center_vertical">
+
+ <ImageView android:id="@+id/icon"
+ android:layout_width="@android:dimen/app_icon_size"
+ android:layout_height="@android:dimen/app_icon_size"
+ android:scaleType="fitCenter" />
+
+ <TextView android:id="@+id/title"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:paddingLeft="6dip" />
+
+</LinearLayout>
+
diff --git a/res/layout/choose_lock_pattern.xml b/res/layout/choose_lock_pattern.xml
new file mode 100644
index 0000000..110b9ad
--- /dev/null
+++ b/res/layout/choose_lock_pattern.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/topLayout"
+ android:orientation="vertical"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:background="@color/black">
+
+ <TextView android:id="@+id/headerText"
+ android:layout_width="fill_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1"
+ android:gravity="center"
+ android:textSize="18sp"/>
+
+ <View
+ android:background="@*android:drawable/code_lock_top"
+ android:layout_width="fill_parent"
+ android:layout_height="2dip" />
+ <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+ <View
+ android:background="@*android:drawable/code_lock_bottom"
+ android:layout_width="fill_parent"
+ android:layout_height="8dip" />
+
+ <!-- message just above the button bar -->
+ <TextView android:id="@+id/footerText"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:textSize="14sp"/>
+
+ <!-- confirm / restart buttons -->
+ <LinearLayout style="@android:style/ButtonBar"
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+
+ <!-- left button: skip, or retry -->
+ <Button android:id="@+id/footerLeftButton"
+ android:layout_height="wrap_content"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:text="@string/lockpattern_restart_button_text"/>
+
+ <!-- Placeholder to get blank space between the two buttons -->
+ <View
+ android:visibility="invisible"
+ android:layout_height="0dip"
+ android:layout_width="1dip"
+ android:layout_weight="1" />
+
+ <!-- right button: confirm or ok -->
+ <Button android:id="@+id/footerRightButton"
+ android:layout_height="wrap_content"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:drawableRight="@drawable/ic_btn_next"
+ android:drawablePadding="3dip"
+ android:text="@string/lockpattern_confirm_button_text"/>
+
+ </LinearLayout>
+
+</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
diff --git a/res/layout/choose_lock_pattern_example.xml b/res/layout/choose_lock_pattern_example.xml
new file mode 100644
index 0000000..b2d32e6
--- /dev/null
+++ b/res/layout/choose_lock_pattern_example.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_height="fill_parent"
+ android:layout_width="fill_parent">
+
+ <ScrollView
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:layout_weight="1">
+
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_height="fill_parent"
+ android:layout_width="fill_parent"
+ android:padding="5dip">
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/lock_example_title"
+ android:gravity="center_horizontal"
+ style="?android:attr/textAppearanceLarge"
+ />
+
+ <ImageView android:id="@+id/lock_anim"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="11dip"
+ android:layout_gravity="center_horizontal"
+ android:focusable="false"
+ android:clickable="false"
+ />
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="5dip"
+ android:text="@string/lock_example_message"
+ android:layout_gravity="left"
+ style="?android:attr/textAppearanceMedium"
+ />
+
+ </LinearLayout>
+
+ </ScrollView>
+
+ <LinearLayout style="@android:style/ButtonBar"
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+
+ <Button android:id="@+id/skip_button"
+ android:layout_height="wrap_content"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:text="@string/skip_button_label"
+ />
+
+ <View
+ android:visibility="invisible"
+ android:layout_height="0dip"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ />
+
+ <Button android:id="@+id/next_button"
+ android:layout_height="wrap_content"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:drawableRight="@drawable/ic_btn_next"
+ android:drawablePadding="3dip"
+ android:text="@string/next_button_label"
+ />
+
+ </LinearLayout>
+
+</LinearLayout>
diff --git a/res/layout/choose_lock_pattern_tutorial.xml b/res/layout/choose_lock_pattern_tutorial.xml
new file mode 100644
index 0000000..47af50b
--- /dev/null
+++ b/res/layout/choose_lock_pattern_tutorial.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_height="fill_parent"
+ android:layout_width="fill_parent">
+
+ <ScrollView
+ android:layout_width="fill_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1">
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:padding="5dip">
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal"
+ android:text="@string/lock_title"
+ android:paddingBottom="10dip"
+ android:layout_marginTop="3dip"
+ style="?android:attr/textAppearanceLarge"
+ />
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_marginTop="10dip"
+ android:text="@string/lock_intro_message"
+ />
+
+ </LinearLayout>
+
+ </ScrollView>
+
+ <LinearLayout style="@android:style/ButtonBar"
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+
+ <Button android:id="@+id/skip_button"
+ android:layout_height="wrap_content"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:text="@string/skip_button_label"
+ />
+
+ <View
+ android:visibility="invisible"
+ android:layout_height="0dip"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ />
+
+ <Button android:id="@+id/next_button"
+ android:layout_height="wrap_content"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:drawableRight="@drawable/ic_btn_next"
+ android:drawablePadding="3dip"
+ android:text="@string/next_button_label"
+ />
+
+ </LinearLayout>
+
+</LinearLayout >
diff --git a/res/layout/compute_sizes.xml b/res/layout/compute_sizes.xml
new file mode 100755
index 0000000..1c8e966
--- /dev/null
+++ b/res/layout/compute_sizes.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+ <ListView
+ android:id="@android:id/list"
+ android:drawSelectorOnTop="false"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" />
+ <TextView android:id="@+id/empty_view"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingLeft="20dip"
+ android:paddingTop="5dip"
+ android:text="@string/empty_list_msg"
+ android:gravity="center"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+</LinearLayout>
+
+
diff --git a/res/layout/confirm_lock_pattern.xml b/res/layout/confirm_lock_pattern.xml
new file mode 100644
index 0000000..52cf24a
--- /dev/null
+++ b/res/layout/confirm_lock_pattern.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/topLayout"
+ android:orientation="vertical"
+ android:layout_width="wrap_content"
+ android:layout_height="fill_parent"
+ android:background="@color/black">
+
+ <TextView android:id="@+id/headerText"
+ android:layout_width="fill_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1.0"
+ android:gravity="center"
+ android:textSize="18sp"/>
+
+ <View
+ android:background="@*android:drawable/code_lock_top"
+ android:layout_width="fill_parent"
+ android:layout_height="2dip" />
+ <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+ <View
+ android:background="@*android:drawable/code_lock_bottom"
+ android:layout_width="fill_parent"
+ android:layout_height="8dip" />
+
+ <TextView android:id="@+id/footerText"
+ android:layout_width="fill_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1.0"
+ android:gravity="center"
+ android:textSize="14sp"/>
+
+
+</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
diff --git a/res/layout/date_time_settings_setupwizard.xml b/res/layout/date_time_settings_setupwizard.xml
new file mode 100644
index 0000000..fc6f5e2
--- /dev/null
+++ b/res/layout/date_time_settings_setupwizard.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_height="fill_parent"
+ android:layout_width="fill_parent"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_height="0dip"
+ android:layout_width="fill_parent"
+ android:layout_weight="1"
+ android:gravity="left">
+
+ <ListView android:id="@android:id/list"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:drawSelectorOnTop="false"
+ android:paddingTop="2dip"
+ />
+
+ </LinearLayout>
+
+ <RelativeLayout
+ android:layout_height="wrap_content"
+ android:layout_width="fill_parent"
+ android:background="@android:drawable/bottom_bar">
+
+ <Button android:id="@+id/next_button"
+ android:layout_width="150dip"
+ android:layout_height="wrap_content"
+ android:layout_margin="5dip"
+ android:layout_alignParentRight="true"
+ android:drawableRight="@drawable/ic_btn_next"
+ android:drawablePadding="10dip"
+ android:text="@string/next_label"
+ />
+
+ </RelativeLayout>
+
+</LinearLayout>
diff --git a/res/layout/dialog_edittext.xml b/res/layout/dialog_edittext.xml
new file mode 100644
index 0000000..9ef1205
--- /dev/null
+++ b/res/layout/dialog_edittext.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2006 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingLeft="8dip"
+ android:paddingRight="8dip">
+
+ <EditText
+ android:id="@+id/edittext"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ />
+
+</LinearLayout> \ No newline at end of file
diff --git a/res/layout/display.xml b/res/layout/display.xml
new file mode 100644
index 0000000..0049025
--- /dev/null
+++ b/res/layout/display.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* //device/apps/Settings/res/layout/display.xml
+**
+** Copyright 2007, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/info_layout">
+ <LinearLayout style="@style/entry_layout"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/display_font_size_label" />
+
+ <Spinner android:id="@+id/fontSize"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+ </Spinner>
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/display_preview_label" />
+
+ <TextView android:id="@+id/preview"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" />
+
+ <Button android:id="@+id/save"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+ </LinearLayout>
+
+</LinearLayout>
diff --git a/res/layout/installed_app_details.xml b/res/layout/installed_app_details.xml
new file mode 100644
index 0000000..4c06f99
--- /dev/null
+++ b/res/layout/installed_app_details.xml
@@ -0,0 +1,311 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<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">
+ <include
+ layout="@layout/manage_applications_item"
+ android:id="@+id/app_snippet"/>
+
+ <TextView
+ style="?android:attr/listSeparatorTextViewStyle"
+ android:text="@string/storage_label" />
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingLeft="6dip"
+ android:orientation="vertical">
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:baselineAligned="true"
+ android:paddingTop="-1dip">
+ <TextView
+ android:id="@+id/total_size_prefix"
+ android:text="@string/total_size_label"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:maxLines="1"
+ android:paddingTop="6dip"
+ android:paddingLeft="6dip"/>
+
+ <ImageView
+ android:id="@+id/info_size_dots"
+ android:src="@drawable/dotted_line_480px"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:layout_height="1px"
+ android:layout_gravity="bottom"
+ android:layout_marginLeft="1dip"
+ android:layout_marginRight="1dip"
+ android:layout_marginBottom="4dip"
+ android:scaleType="center" />
+ <TextView
+ android:id="@+id/total_size_text"
+ android:paddingTop="6dip"
+ android:paddingRight="6dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:maxLines="1" />
+
+ </LinearLayout>
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:baselineAligned="true"
+ android:paddingTop="-1dip">
+ <TextView
+ android:id="@+id/application_size_prefix"
+ android:text="@string/application_size_label"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:maxLines="1"
+ android:paddingTop="6dip"
+ android:paddingLeft="6dip"/>
+ <ImageView
+ android:id="@+id/info_size_dots"
+ android:src="@drawable/dotted_line_480px"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:layout_height="1px"
+ android:layout_gravity="bottom"
+ android:layout_marginLeft="1dip"
+ android:layout_marginRight="1dip"
+ android:layout_marginBottom="4dip"
+ android:scaleType="center" />
+ <TextView
+ android:id="@+id/application_size_text"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:paddingTop="6dip"
+ android:paddingRight="6dip"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:maxLines="1" />
+
+ </LinearLayout>
+ <LinearLayout
+ android:id="@+id/info_size"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:baselineAligned="true"
+ android:paddingTop="-1dip">
+ <TextView
+ android:id="@+id/data_size_prefix"
+ android:text="@string/data_size_label"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:maxLines="1"
+ android:paddingTop="6dip"
+ android:paddingLeft="6dip"/>
+ <ImageView
+ android:id="@+id/info_size_dots"
+ android:src="@drawable/dotted_line_480px"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:layout_height="1px"
+ android:layout_gravity="bottom"
+ android:layout_marginLeft="1dip"
+ android:layout_marginRight="1dip"
+ android:layout_marginBottom="4dip"
+ android:scaleType="center" />
+ <TextView
+ android:id="@+id/data_size_text"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:paddingTop="6dip"
+ android:paddingRight="6dip"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:maxLines="1" />
+
+ </LinearLayout>
+ <!-- Manage space, Clear data/Uninstall buttons -->
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:gravity="bottom"
+ android:orientation="horizontal">
+ <Button
+ android:id="@+id/manage_space_button"
+ android:text="@string/manage_space_text"
+ android:visibility="invisible"
+ android:layout_width="150dip"
+ android:paddingLeft="6dip"
+ android:layout_gravity="left"
+ android:layout_weight="0.4"
+ android:layout_height="wrap_content"/>
+ <!-- Spacer -->
+ <View
+ android:id="@+id/buttons_spacer_left"
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:layout_weight="0.2"
+ android:visibility="gone" />
+
+ <Button
+ android:id="@+id/uninstall_button"
+ android:layout_width="150dip"
+ android:paddingRight="6dip"
+ android:layout_gravity="right"
+ android:layout_weight="0.4"
+ android:layout_height="wrap_content"/>
+ </LinearLayout>
+ </LinearLayout>
+
+ <!-- Clear cache section -->
+ <RelativeLayout
+ android:id="@+id/cache_panel"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" >
+ <TextView
+ android:id="@+id/cache_header"
+ style="?android:attr/listSeparatorTextViewStyle"
+ android:text="@string/cache_header_label" />
+ <LinearLayout
+ android:id="@+id/cache_size"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:baselineAligned="true"
+ android:layout_below="@id/cache_header"
+ android:paddingTop="-1dip">
+ <TextView
+ android:text="@string/cache_size_label"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:maxLines="1"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:paddingTop="6dip"
+ android:gravity="center_vertical"
+ android:paddingLeft="6dip"/>
+ <ImageView
+ android:src="@drawable/dotted_line_480px"
+ android:layout_width="0dip"
+ android:layout_weight="1"
+ android:layout_height="1px"
+ android:layout_gravity="bottom"
+ android:layout_marginLeft="1dip"
+ android:layout_marginRight="1dip"
+ android:layout_marginBottom="4dip"
+ android:scaleType="center" />
+ <TextView
+ android:id="@+id/cache_size_text"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:paddingTop="6dip"
+ android:paddingRight="6dip"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:maxLines="1" />
+ </LinearLayout>
+
+ <Button android:id="@+id/clear_cache_button"
+ android:layout_alignParentRight="true"
+ android:layout_below="@id/cache_size"
+ android:layout_centerHorizontal="true"
+ android:layout_width="150dip"
+ android:text="@string/clear_cache_btn_text"
+ android:layout_height="wrap_content" />
+ </RelativeLayout>
+
+ <!-- Prefered activities section -->
+ <TextView
+ style="?android:attr/listSeparatorTextViewStyle"
+ android:text="@string/auto_launch_label" />
+
+ <RelativeLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical">
+ <TextView android:id="@+id/auto_launch"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:layout_alignParentLeft="true"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="6dip"
+ android:paddingRight="6dip"
+ android:paddingLeft="6dip" />
+ <Button android:id="@+id/clear_activities_button"
+ android:layout_alignParentRight="true"
+ android:layout_below="@id/auto_launch"
+ android:layout_centerHorizontal="true"
+ android:layout_width="150dip"
+ android:text="@string/clear_activities"
+ android:layout_height="wrap_content" />
+ </RelativeLayout>
+
+ <!-- Permissions section -->
+ <LinearLayout
+ android:id="@+id/permissions_section"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="vertical">
+ <TextView
+ style="?android:attr/listSeparatorTextViewStyle"
+ android:text="@string/permissions_label" />
+ <TextView
+ android:text="@string/security_settings_desc"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:paddingTop="6dip"
+ android:paddingLeft="6dip"
+ android:paddingBottom="6dip"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" />
+ <LinearLayout
+ android:id="@+id/security_settings_list"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="vertical"/>
+ </LinearLayout>
+
+ <!-- Prefered activities section -->
+ <TextView
+ style="?android:attr/listSeparatorTextViewStyle"
+ android:text="@string/controls_label" />
+
+ <RelativeLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical">
+ <Button android:id="@+id/force_stop_button"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentTop="true"
+ android:layout_centerHorizontal="true"
+ android:layout_width="150dip"
+ android:text="@string/force_stop"
+ android:layout_height="wrap_content" />
+ </RelativeLayout>
+ </LinearLayout>
+</ScrollView>
+
diff --git a/res/layout/intent_sender.xml b/res/layout/intent_sender.xml
new file mode 100644
index 0000000..07fe67d
--- /dev/null
+++ b/res/layout/intent_sender.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* //device/apps/Preferences/assets/res/any/layout/intent_sender.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:paddingLeft="6dip"
+ android:paddingRight="6dip"
+ android:paddingBottom="3dip"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <TextView
+ android:textStyle="bold"
+ android:maxLines="1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/intent_sender_action_label" />
+
+ <EditText android:id="@+id/intent"
+ android:singleLine="true"
+ android:layout_marginTop="2dip"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:scrollHorizontally="true"
+ android:capitalize="none"
+ android:autoText="false" />
+
+ <TextView
+ android:textStyle="bold"
+ android:maxLines="1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/intent_sender_data_label" />
+
+ <EditText android:id="@+id/data"
+ android:singleLine="true"
+ android:layout_marginTop="2dip"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:scrollHorizontally="true"
+ android:capitalize="none"
+ android:autoText="false" />
+
+ <TextView
+ android:textStyle="bold"
+ android:maxLines="1"
+ android:layout_marginTop="4dip"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/intent_sender_account_label" />
+
+ <EditText android:id="@+id/account"
+ android:singleLine="true"
+ android:layout_marginTop="2dip"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:scrollHorizontally="true"
+ android:capitalize="none"
+ android:autoText="false" />
+
+ <TextView
+ android:textStyle="bold"
+ android:maxLines="1"
+ android:layout_marginTop="4dip"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/intent_sender_resource_label" />
+
+ <EditText android:id="@+id/resource"
+ android:singleLine="true"
+ android:layout_marginTop="2dip"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:scrollHorizontally="true"
+ android:capitalize="none"
+ android:autoText="false" />
+
+ <Button android:id="@+id/sendbroadcast"
+ android:layout_marginTop="8dip"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/intent_sender_sendbroadcast_text" />
+
+ <Button android:id="@+id/startactivity"
+ android:layout_marginTop="8dip"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/intent_sender_startactivity_text" />
+ </LinearLayout>
+</ScrollView>
+
diff --git a/res/layout/list_content_with_empty_view.xml b/res/layout/list_content_with_empty_view.xml
new file mode 100644
index 0000000..324d23f
--- /dev/null
+++ b/res/layout/list_content_with_empty_view.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent" >
+
+ <ListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/list"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:drawSelectorOnTop="false"
+ />
+
+ <TextView android:id="@+id/empty"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:padding="5dip"
+ android:gravity="center"
+ android:visibility="gone" />
+
+</FrameLayout>
diff --git a/res/layout/locale_picker.xml b/res/layout/locale_picker.xml
new file mode 100644
index 0000000..476293f
--- /dev/null
+++ b/res/layout/locale_picker.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <ListView android:id="@android:id/list"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:drawSelectorOnTop="false"
+ />
+
+</LinearLayout>
diff --git a/res/layout/locale_picker_in_setupwizard.xml b/res/layout/locale_picker_in_setupwizard.xml
new file mode 100644
index 0000000..184250d
--- /dev/null
+++ b/res/layout/locale_picker_in_setupwizard.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/select_your_language"
+ android:layout_gravity="center_horizontal"
+ android:paddingBottom="10dip"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ />
+
+ <View
+ android:layout_width="fill_parent"
+ android:layout_height="1dip"
+ android:layout_marginTop="8dip"
+ android:background="@android:drawable/divider_horizontal_dark"
+ />
+
+ <ListView android:id="@android:id/list"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:drawSelectorOnTop="false"
+ />
+
+</LinearLayout>
diff --git a/res/layout/locale_picker_item.xml b/res/layout/locale_picker_item.xml
new file mode 100644
index 0000000..caa6fb5
--- /dev/null
+++ b/res/layout/locale_picker_item.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="horizontal"
+ android:layout_height="wrap_content"
+ android:layout_width="fill_parent"
+ android:gravity="center_vertical"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:padding="5dip">
+<!--
+ <ImageView android:id="@+id/icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:focusable="false"
+ android:clickable="false"
+ android:src="@drawable/place_holder_for_locale"
+ />
+-->
+ <TextView android:id="@+id/locale"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ />
+</LinearLayout >
diff --git a/res/layout/manage_applications_item.xml b/res/layout/manage_applications_item.xml
new file mode 100755
index 0000000..ecefcf5
--- /dev/null
+++ b/res/layout/manage_applications_item.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<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:orientation="horizontal"
+ android:paddingRight="6dip"
+ android:paddingLeft="6dip"
+ android:paddingTop="5dip"
+ android:paddingBottom="5dip"
+ android:gravity="center_vertical" >
+
+ <ImageView android:id="@+id/app_icon"
+ android:layout_width="@android:dimen/app_icon_size"
+ android:layout_height="@android:dimen/app_icon_size"
+ android:layout_marginLeft="5dip"
+ android:layout_marginRight="11dip"
+ android:layout_gravity="center_vertical"
+ android:scaleType="fitCenter"/>
+
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" >
+ <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" />
+ <TextView android:id="@+id/app_size"
+ 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>
+</LinearLayout>
+
diff --git a/res/layout/master_clear_final.xml b/res/layout/master_clear_final.xml
new file mode 100644
index 0000000..8de789a
--- /dev/null
+++ b/res/layout/master_clear_final.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright (C) 2008 The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ style="@style/info_layout">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="20sp"
+ android:text="@string/master_clear_final_desc" />
+
+ <Button android:id="@+id/execute_master_clear"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginTop="40dip"
+ android:layout_width="150dip"
+ android:layout_height="wrap_content"
+ android:text="@string/master_clear_final_button_text"
+ android:gravity="center" />
+
+</LinearLayout>
diff --git a/res/layout/master_clear_primary.xml b/res/layout/master_clear_primary.xml
new file mode 100644
index 0000000..ffac171
--- /dev/null
+++ b/res/layout/master_clear_primary.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright (C) 2008 The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ style="@style/info_layout">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="18sp"
+ android:text="@string/master_clear_desc" />
+
+ <Button android:id="@+id/initiate_master_clear"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginTop="40dip"
+ android:layout_width="150dip"
+ android:layout_height="wrap_content"
+ android:text="@string/master_clear_button_text"
+ android:gravity="center" />
+
+</LinearLayout>
diff --git a/res/layout/media_format_final.xml b/res/layout/media_format_final.xml
new file mode 100644
index 0000000..ab18f34
--- /dev/null
+++ b/res/layout/media_format_final.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright (C) 2008 The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ style="@style/info_layout">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="20sp"
+ android:text="@string/media_format_final_desc" />
+
+ <Button android:id="@+id/execute_media_format"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginTop="40dip"
+ android:layout_width="150dip"
+ android:layout_height="wrap_content"
+ android:text="@string/media_format_final_button_text"
+ android:gravity="center" />
+
+</LinearLayout>
diff --git a/res/layout/media_format_primary.xml b/res/layout/media_format_primary.xml
new file mode 100644
index 0000000..3590492
--- /dev/null
+++ b/res/layout/media_format_primary.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright (C) 2008 The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ style="@style/info_layout">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="18sp"
+ android:text="@string/media_format_desc" />
+
+ <Button android:id="@+id/initiate_media_format"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginTop="40dip"
+ android:layout_width="150dip"
+ android:layout_height="wrap_content"
+ android:text="@string/media_format_button_text"
+ android:gravity="center" />
+
+</LinearLayout>
diff --git a/res/layout/preference_bluetooth.xml b/res/layout/preference_bluetooth.xml
new file mode 100644
index 0000000..e832f20
--- /dev/null
+++ b/res/layout/preference_bluetooth.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2006 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<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:paddingRight="?android:attr/scrollbarSize">
+
+ <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:textAppearance="?android:attr/textAppearanceLarge" />
+
+ <TextView android:id="@+android:id/summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@android:id/title"
+ android:layout_alignLeft="@android:id/title"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:maxLines="2" />
+
+ </RelativeLayout>
+
+ <ImageView
+ android:id="@+id/btClass"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginRight="12dip"
+ android:layout_gravity="center_vertical" />
+
+</LinearLayout>
diff --git a/res/layout/preference_dialog_ringervolume.xml b/res/layout/preference_dialog_ringervolume.xml
new file mode 100644
index 0000000..63cc97a
--- /dev/null
+++ b/res/layout/preference_dialog_ringervolume.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="vertical"
+ android:gravity="center_horizontal"
+ android:paddingBottom="20dip">
+
+ <ImageView android:id="@android:id/icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingTop="20dip" />
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/incoming_call_volume_title"
+ android:paddingTop="20dip"
+ android:paddingLeft="20dip"
+ android:paddingRight="20dip" />
+
+ <!-- Used for the ring volume. This is what the superclass VolumePreference uses. -->
+ <SeekBar android:id="@*android:id/seekbar"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="6dip"
+ android:paddingLeft="20dip"
+ android:paddingRight="20dip" />
+
+ <CheckBox android:id="@+id/same_notification_volume"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/checkbox_notification_same_as_incoming_call"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:layout_marginTop="6dip"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip" />
+
+ <TextView android:id="@+id/notification_volume_title"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/notification_volume_title"
+ android:paddingTop="6dip"
+ android:paddingLeft="20dip"
+ android:paddingRight="20dip" />
+
+ <!-- Used for the notification volume -->
+ <SeekBar android:id="@+id/notification_volume_seekbar"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="6dip"
+ android:paddingLeft="20dip"
+ android:paddingRight="20dip" />
+
+</LinearLayout>
+
diff --git a/res/layout/preference_progress_category.xml b/res/layout/preference_progress_category.xml
new file mode 100644
index 0000000..6528e54
--- /dev/null
+++ b/res/layout/preference_progress_category.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2006 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- Layout used for ProgressCategory in bluetooth settings. -->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ style="?android:attr/listSeparatorTextViewStyle">
+
+ <!-- This and the other text view have the style of the list separator text view without the background and padding -->
+ <TextView
+ style="?android:attr/listSeparatorTextViewStyle"
+ android:background="@null"
+ android:paddingLeft="0dip"
+ android:id="@+android:id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentLeft="true"
+ android:layout_centerVertical="true"
+ />
+
+ <ProgressBar
+ android:id="@+id/scanning_progress"
+ android:text="@string/progress_scanning"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentRight="true"
+ android:layout_centerVertical="true"
+ android:layout_marginRight="?android:attr/scrollbarSize"
+ style="?android:attr/progressBarStyleSmallTitle"
+ />
+
+ <TextView
+ style="?android:attr/listSeparatorTextViewStyle"
+ android:background="@null"
+ android:paddingLeft="0dip"
+ android:id="@+id/scanning_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true"
+ android:layout_toLeftOf="@id/scanning_progress"
+ android:layout_marginRight="5sp"
+ android:text="@string/progress_scanning"
+ />
+
+</RelativeLayout>
diff --git a/res/layout/preference_widget_shortcut.xml b/res/layout/preference_widget_shortcut.xml
new file mode 100644
index 0000000..bb66f32
--- /dev/null
+++ b/res/layout/preference_widget_shortcut.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/shortcut"
+ android:layout_width="40dip"
+ android:layout_height="40dip"
+ android:layout_marginRight="4sp"
+ android:layout_gravity="center_vertical"
+ android:background="#55ffffff"
+ android:gravity="center"
+ android:textAppearance="?android:attr/textAppearanceLarge" />
diff --git a/res/layout/preference_widget_wifi_signal.xml b/res/layout/preference_widget_wifi_signal.xml
new file mode 100644
index 0000000..55dd587
--- /dev/null
+++ b/res/layout/preference_widget_wifi_signal.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/signal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginRight="4sp"
+ android:layout_gravity="center_vertical"
+ android:src="@drawable/wifi_signal" />
diff --git a/res/layout/proxy.xml b/res/layout/proxy.xml
new file mode 100644
index 0000000..914d0ea
--- /dev/null
+++ b/res/layout/proxy.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* //device/apps/Browser/res/layout/proxy.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:paddingLeft="6dip"
+ android:paddingRight="6dip"
+ android:paddingBottom="3dip"
+ android:layout_width="fill_parent" android:layout_height="wrap_content">
+
+ <TextView
+ android:textStyle="bold"
+ android:maxLines="1"
+ android:layout_marginTop="8dip"
+ android:layout_width="wrap_content" android:layout_height="wrap_content"
+ android:text="@string/proxy_hostname_label" />
+
+ <EditText android:id="@+id/hostname"
+ android:maxLines="1"
+ android:layout_marginTop="2dip"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:autoText="false"
+ android:capitalize="none"
+ android:scrollHorizontally="true" />
+
+ <TextView
+ android:textStyle="bold"
+ android:maxLines="1"
+ android:layout_marginTop="4dip"
+ android:layout_width="wrap_content" android:layout_height="wrap_content"
+ android:text="@string/proxy_port_label" />
+
+ <EditText android:id="@+id/port"
+ android:numeric="integer"
+ android:maxLines="1"
+ android:layout_marginTop="2dip"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:scrollHorizontally="true" />
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:paddingTop="8dip"
+ android:layout_width="wrap_content" android:layout_height="wrap_content">
+
+ <Button android:id="@+id/action"
+ android:layout_width="wrap_content" android:layout_height="fill_parent"
+ android:layout_weight="1"
+ android:text="@string/proxy_action_text" />
+
+ <Button android:id="@+id/clear"
+ android:layout_width="wrap_content" android:layout_height="fill_parent"
+ android:layout_weight="1"
+ android:text="@string/proxy_clear_text" />
+
+ <Button android:id="@+id/defaultView"
+ android:layout_width="wrap_content" android:layout_height="fill_parent"
+ android:layout_weight="1"
+ android:text="@string/proxy_defaultView_text" />
+
+ </LinearLayout>
+</LinearLayout>
+
diff --git a/res/layout/radio_info.xml b/res/layout/radio_info.xml
new file mode 100644
index 0000000..b560fff
--- /dev/null
+++ b/res/layout/radio_info.xml
@@ -0,0 +1,265 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* //device/apps/Settings/assets/res/any/layout/radio_info.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent" >
+
+ <LinearLayout style="@style/info_layout">
+
+ <!-- IMEI -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_imei_label" style="@style/info_label" />
+ <TextView android:id="@+id/imei" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Phone Number -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_phone_number_label" style="@style/info_label" />
+ <TextView android:id="@+id/number" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Network Identifier -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_current_network_label" style="@style/info_label" />
+ <TextView android:id="@+id/operator" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Ping stats -->
+ <Button android:id="@+id/ping_test"
+ android:textSize="14sp"
+ android:layout_marginTop="8dip"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/ping_test_label"
+ />
+
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_ping_ipaddr" style="@style/info_label" />
+ <TextView android:id="@+id/pingIpAddr" style="@style/info_value" />
+ </LinearLayout>
+
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_ping_hostname" style="@style/info_label" />
+ <TextView android:id="@+id/pingHostname" style="@style/info_value" />
+ </LinearLayout>
+
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_http_client_test" style="@style/info_label" />
+ <TextView android:id="@+id/httpClientTest" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Signal Strength -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_signal_strength_label" style="@style/info_label" />
+ <TextView android:id="@+id/dbm" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Location -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_signal_location_label" style="@style/info_label" />
+ <TextView android:id="@+id/location" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Neighboring Cids -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_neighboring_location_label"
+ style="@style/info_label" />
+ <TextView android:id="@+id/neighboring" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Roaming -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_roaming_label" style="@style/info_label" />
+ <TextView android:id="@+id/roaming" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- GSM Service -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_gsm_service_label" style="@style/info_label" />
+ <TextView android:id="@+id/gsm" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- GPRS Service -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_gprs_service_label" style="@style/info_label" />
+ <TextView android:id="@+id/gprs" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Network Type -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_network_type_label" style="@style/info_label" />
+ <TextView android:id="@+id/network" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Message Waiting Indicator -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_message_waiting_label" style="@style/info_label" />
+ <TextView android:id="@+id/mwi" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Call Forwarding Indicator -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_call_redirect_label" style="@style/info_label" />
+ <TextView android:id="@+id/cfi" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Call Status -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_call_status_label" style="@style/info_label" />
+ <TextView android:id="@+id/call" style="@style/info_value" />
+ </LinearLayout>
+
+
+ <!-- Radio Resets -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_radio_resets_label" style="@style/info_label" />
+ <TextView android:id="@+id/resets" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Attempted Data Connections -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_data_attempts_label"
+ style="@style/info_label" />
+ <TextView android:id="@+id/attempts" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Successful Data Connections -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_data_successes_label"
+ style="@style/info_label" />
+ <TextView android:id="@+id/successes" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- GSM Disconnects -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_gsm_disconnects_label"
+ style="@style/info_label" />
+ <TextView android:id="@+id/disconnects" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- PPP Sent -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_ppp_sent_label"
+ style="@style/info_label" />
+ <TextView android:id="@+id/sent" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- PPP Received -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_ppp_received_label"
+ style="@style/info_label" />
+ <TextView android:id="@+id/received" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- PPP Sent since last received -->
+ <LinearLayout style="@style/entry_layout">
+ <TextView android:text="@string/radio_info_ppp_resets_label"
+ style="@style/info_label" />
+ <TextView android:id="@+id/sentSinceReceived" style="@style/info_value" />
+ </LinearLayout>
+
+ <!-- Preferred Network Type -->
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/radio_info_set_perferred_label"
+ style="@style/info_label"
+ />
+
+ <Spinner android:id="@+id/preferredNetworkType"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ />
+
+ <!-- Ciphering -->
+ <LinearLayout style="@style/entry_layout">
+ <Button android:id="@+id/ciph_toggle"
+ android:textSize="14sp"
+ android:layout_marginTop="8dip"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/radio_info_toggle_ciph_label"
+ />
+ <TextView android:id="@+id/ciphState" style="@style/info_value" />
+
+ </LinearLayout>
+
+ <!-- QXDM logging & radio power -->
+ <LinearLayout style="@style/entry_layout">
+ <Button android:id="@+id/qxdm_log"
+ android:textSize="14sp"
+ android:layout_marginTop="8dip"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ />
+
+ <Button android:id="@+id/radio_power"
+ android:textSize="14sp"
+ android:layout_marginTop="8dip"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ />
+ </LinearLayout>
+
+ <!-- SMSC -->
+ <RelativeLayout android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+ <TextView android:id="@+id/smsc_label"
+ android:text="@string/radio_info_smsc_label"
+ android:layout_alignBaseline="@+id/update_smsc"
+ style="@style/info_label" />
+ <Button android:id="@+id/refresh_smsc"
+ android:textSize="14sp"
+ android:layout_marginTop="8dip"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/radio_info_smsc_refresh_label"
+ android:layout_alignParentRight="true"
+ />
+ <Button android:id="@+id/update_smsc"
+ android:textSize="14sp"
+ android:layout_marginTop="8dip"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/radio_info_smsc_update_label"
+ android:layout_toLeftOf="@+id/refresh_smsc"
+ android:layout_alignBaseline="@+id/refresh_smsc"
+ />
+ <EditText android:id="@+id/smsc"
+ style="@style/form_value"
+ android:layout_alignBaseline="@+id/refresh_smsc"
+ android:layout_toLeftOf="@id/update_smsc"
+ android:layout_toRightOf="@id/smsc_label" />
+ </RelativeLayout>
+
+ <!-- Test setting to ignore bad DNS, useful in lab environments -->
+ <LinearLayout style="@style/entry_layout">
+ <Button android:id="@+id/dns_check_toggle"
+ android:textSize="14sp"
+ android:layout_marginTop="8dip"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/radio_info_toggle_dns_check_label"
+ />
+ <TextView android:id="@+id/dnsCheckState" style="@style/info_value" />
+ </LinearLayout>
+
+ </LinearLayout>
+</ScrollView>
diff --git a/res/layout/sdcard_settings_screen.xml b/res/layout/sdcard_settings_screen.xml
new file mode 100644
index 0000000..734a5b6
--- /dev/null
+++ b/res/layout/sdcard_settings_screen.xml
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* //device/apps/Settings/res/layout/sdcard_settings_screen.xml
+**
+** Copyright 2007, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <LinearLayout android:id="@+id/list"
+ android:orientation="vertical"
+ android:padding="10dip"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+
+ <LinearLayout android:id="@+id/usb"
+ android:orientation="vertical"
+ android:paddingBottom="10dip"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+
+ <CheckBox android:id="@+id/mass_storage"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/sdcard_settings_screen_mass_storage_text">
+ <requestFocus/>
+ </CheckBox>
+
+ <TextView android:text="@string/sdcard_changes_instructions" style="@style/info_small" />
+ </LinearLayout>
+
+ <!-- divider line -->
+ <View android:background="#FF000000"
+ android:layout_width="fill_parent"
+ android:layout_height="1dip" />
+
+ <LinearLayout android:id="@+id/mounted"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="10dip">
+
+ <TextView android:id="@+id/read_only"
+ android:text="@string/sdcard_settings_read_only_status"
+ style="@style/info_label" />
+
+ <Button android:id="@+id/sdcard_unmount"
+ android:text="@string/sdcard_unmount"
+ android:textSize="14sp"
+ android:layout_marginTop="8dip"
+ android:layout_width="wrap_content" android:layout_height="wrap_content" />
+
+ <Button android:id="@+id/sdcard_format"
+ android:text="@string/sdcard_format"
+ android:textSize="14sp"
+ android:layout_marginTop="8dip"
+ android:layout_width="wrap_content" android:layout_height="wrap_content" />
+
+ <TableLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="10dip">
+ <TableRow>
+ <TextView android:text="@string/sdcard_settings_total_bytes_label" style="@style/info_label" />
+ <TextView android:id="@+id/total" style="@style/info_value" />
+ </TableRow>
+ <TableRow>
+ <TextView android:text="@string/sdcard_settings_used_bytes_label" style="@style/info_label" />
+ <TextView android:id="@+id/used" style="@style/info_value" />
+ </TableRow>
+ <TableRow>
+ <TextView android:text="@string/sdcard_settings_available_bytes_label" style="@style/info_label" />
+ <TextView android:id="@+id/available" style="@style/info_value" />
+ </TableRow>
+ </TableLayout>
+
+ </LinearLayout>
+
+ <LinearLayout style="@style/entry_layout"
+ android:id="@+id/scanning"
+ android:paddingTop="10dip">
+ <TextView android:text="@string/sdcard_settings_scanning_status" style="@style/info_label" />
+ </LinearLayout>
+
+ <LinearLayout style="@style/entry_layout"
+ android:id="@+id/removed"
+ android:paddingTop="10dip">
+ <TextView android:text="@string/sdcard_settings_not_present_status" style="@style/info_label" />
+ </LinearLayout>
+
+ <LinearLayout android:id="@+id/shared"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="10dip">
+
+ <LinearLayout style="@style/entry_layout" >
+ <TextView android:text="@string/sdcard_settings_mass_storage_status" style="@style/info_label" />
+ </LinearLayout>
+
+ </LinearLayout>
+
+ <LinearLayout style="@style/entry_layout"
+ android:id="@+id/unmounted"
+ android:paddingTop="10dip">
+ <TextView android:text="@string/sdcard_settings_unmounted_status" style="@style/info_label" />
+ </LinearLayout>
+
+ <LinearLayout style="@style/entry_layout"
+ android:id="@+id/bad_removal"
+ android:paddingTop="10dip">
+ <TextView android:text="@string/sdcard_settings_bad_removal_status" style="@style/info_label" />
+ </LinearLayout>
+
+ </LinearLayout>
+</ScrollView>
+
diff --git a/res/layout/usage_stats.xml b/res/layout/usage_stats.xml
new file mode 100755
index 0000000..727052d
--- /dev/null
+++ b/res/layout/usage_stats.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <TextView
+ android:text="@string/display_order_text"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" />
+
+ <Spinner
+ android:id="@+id/typeSpinner"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:entries="@array/usage_stats_display_order_types" />
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" >
+ <TextView
+ android:text="@string/app_name_label"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="wrap_content"
+ android:paddingRight="6dip"
+ android:layout_height="wrap_content" />
+ <TextView
+ android:text="@string/launch_count_label"
+ android:paddingRight="6dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+ <TextView
+ android:text="@string/usage_time_label"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+ </LinearLayout>
+ <ListView android:id="@+id/pkg_list"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:drawSelectorOnTop="false" />
+</LinearLayout>
diff --git a/res/layout/usage_stats_item.xml b/res/layout/usage_stats_item.xml
new file mode 100755
index 0000000..7ab0090
--- /dev/null
+++ b/res/layout/usage_stats_item.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:minHeight="?android:attr/listPreferredItemHeight">
+
+ <TextView android:id="@+id/package_name"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:paddingRight="6dip"
+ android:paddingLeft="12dip"
+ android:maxLines="1" />
+
+ <TextView android:id="@+id/launch_count"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:paddingRight="6dip"
+ android:paddingLeft="12dip"
+ android:maxLines="1" />
+
+ <TextView android:id="@+id/usage_time"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:paddingRight="6dip"
+ android:paddingLeft="12dip"
+ android:maxLines="1" />
+</LinearLayout>
+
diff --git a/res/layout/wifi_ap_configure.xml b/res/layout/wifi_ap_configure.xml
new file mode 100644
index 0000000..d786cff
--- /dev/null
+++ b/res/layout/wifi_ap_configure.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:padding="8dip"
+ android:orientation="vertical">
+
+
+
+ <!-- SSID -->
+
+ <TextView
+ style="?android:attr/textAppearanceSmallInverse"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/wifi_type_ssid" />
+
+ <EditText android:id="@+id/ssid_edit"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="2dip"
+ android:singleLine="true" />
+
+
+
+ <!-- Security -->
+
+ <TextView
+ style="?android:attr/textAppearanceSmallInverse"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dip"
+ android:text="@string/wifi_security" />
+
+ <!-- The entries will be set programmatically -->
+ <Spinner android:id="@+id/security_spinner"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" />
+
+
+
+ <!-- Password -->
+
+ <TextView android:id="@+id/password_text"
+ style="?android:attr/textAppearanceSmallInverse"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dip"
+ android:text="@string/please_type_passphrase" />
+
+ <EditText android:id="@+id/password_edit"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="2dip"
+ android:singleLine="true"
+ android:password="true" />
+
+ <CheckBox android:id="@+id/show_password_checkbox"
+ style="?android:attr/textAppearanceSmallInverse"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="2dip"
+ android:text="@string/wifi_show_password" />
+
+ <Spinner android:id="@+id/wep_type_spinner"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:entries="@array/wifi_wep_type" />
+
+ </LinearLayout>
+
+</ScrollView>
diff --git a/res/layout/wifi_ap_info.xml b/res/layout/wifi_ap_info.xml
new file mode 100644
index 0000000..8c430fc
--- /dev/null
+++ b/res/layout/wifi_ap_info.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+
+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:padding="8dip"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:id="@+id/table"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="vertical">
+
+ <!-- Info dynamically added here. -->
+
+ </LinearLayout>
+
+ <!-- Password -->
+ <TextView android:id="@+id/password_text"
+ style="?android:attr/textAppearanceSmallInverse"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dip"
+ android:text="@string/please_type_passphrase" />
+
+ <EditText android:id="@+id/password_edit"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="2dip"
+ android:singleLine="true"
+ android:password="true" />
+
+ <CheckBox android:id="@+id/show_password_checkbox"
+ style="?android:attr/textAppearanceSmallInverse"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="2dip"
+ android:text="@string/wifi_show_password" />
+
+ </LinearLayout>
+
+</ScrollView>
diff --git a/res/layout/wifi_ap_info_row.xml b/res/layout/wifi_ap_info_row.xml
new file mode 100644
index 0000000..79064b0
--- /dev/null
+++ b/res/layout/wifi_ap_info_row.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+ <TextView
+ android:id="@+id/name"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginRight="8dip"
+ android:textAppearance="?android:attr/textAppearanceSmallInverse" />
+ <TextView
+ android:id="@+id/value"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceSmallInverse"
+ android:textStyle="bold" />
+</LinearLayout>
diff --git a/res/layout/wifi_ap_retry_password.xml b/res/layout/wifi_ap_retry_password.xml
new file mode 100644
index 0000000..14a4eae
--- /dev/null
+++ b/res/layout/wifi_ap_retry_password.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+
+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:padding="8dip"
+ android:orientation="vertical">
+
+ <TextView
+ style="?android:attr/textAppearanceSmallInverse"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/wifi_password_incorrect_error" />
+
+ <!-- Password -->
+ <TextView android:id="@+id/password_text"
+ style="?android:attr/textAppearanceSmallInverse"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dip"
+ android:text="@string/please_type_passphrase" />
+
+ <EditText android:id="@+id/password_edit"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="2dip"
+ android:singleLine="true"
+ android:password="true" />
+
+ <CheckBox android:id="@+id/show_password_checkbox"
+ style="?android:attr/textAppearanceSmallInverse"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="2dip"
+ android:text="@string/wifi_show_password" />
+
+ </LinearLayout>
+
+</ScrollView>
diff --git a/res/values-cs-nokeys/strings.xml b/res/values-cs-nokeys/strings.xml
new file mode 100644
index 0000000..38e089e
--- /dev/null
+++ b/res/values-cs-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">"Správa aplikací"</string>
+</resources>
diff --git a/res/values-cs/arrays.xml b/res/values-cs/arrays.xml
new file mode 100644
index 0000000..a62f049
--- /dev/null
+++ b/res/values-cs/arrays.xml
@@ -0,0 +1,72 @@
+<?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>"Amerika"</item>
+ <item>"Evropa"</item>
+ <item>"Afrika"</item>
+ <item>"Asie"</item>
+ <item>"Austrálie"</item>
+ <item>"Tichomoří"</item>
+ <item>"Všechny"</item>
+ </string-array>
+ <string-array name="screen_timeout_entries">
+ <item>"15 sekund"</item>
+ <item>"30 sekund"</item>
+ <item>"1 minuta"</item>
+ <item>"2 minuty"</item>
+ <item>"10 minut"</item>
+ <item>"Nevypínat"</item>
+ </string-array>
+ <string-array name="wifi_security_entries">
+ <item>"Automaticky"</item>
+ <item>"Žádné"</item>
+ <item>"WEP"</item>
+ <item>"WPA Personal"</item>
+ <item>"WPA2 Personal"</item>
+ </string-array>
+ <string-array name="wifi_security_without_auto_entries">
+ <item>"Žádné"</item>
+ <item>"WEP"</item>
+ <item>"WPA Personal"</item>
+ <item>"WPA2 Personal"</item>
+ </string-array>
+ <string-array name="wifi_wep_type">
+ <item>"Automaticky"</item>
+ <item>"WEP ASCII"</item>
+ <item>"Hexadecimální WEP"</item>
+ </string-array>
+ <string-array name="wifi_sleep_policy_entries">
+ <item>"Při vypnutí obrazovky"</item>
+ <item>"Nikdy, je-li zapnuto napájení"</item>
+ <item>"Nikdy"</item>
+ </string-array>
+ <!-- no translation found for battery_history_type_spinner:0 (2193799199027871385) -->
+ <!-- no translation found for battery_history_type_spinner:1 (6401018715947316517) -->
+ <!-- no translation found for battery_history_type_spinner:2 (188092590354892392) -->
+ <!-- no translation found for battery_history_type_spinner:3 (8414109131222049141) -->
+ <!-- no translation found for battery_history_type_spinner:4 (1327904325081257093) -->
+ <!-- no translation found for battery_history_type_spinner:5 (4832254146664706277) -->
+ <!-- no translation found for battery_history_which_spinner:0 (3451981114763440074) -->
+ <!-- no translation found for battery_history_which_spinner:1 (166936313535197598) -->
+ <!-- no translation found for battery_history_which_spinner:2 (4793941382744963893) -->
+ <string-array name="usage_stats_display_order_types">
+ <item>"Doba použití"</item>
+ <item>"Počet spuštění"</item>
+ <item>"Název aplikace"</item>
+ </string-array>
+</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
new file mode 100644
index 0000000..5aca72a
--- /dev/null
+++ b/res/values-cs/strings.xml
@@ -0,0 +1,672 @@
+<?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">"Neznámé"</string>
+ <string name="turn_on_radio">"Zapnout rádio"</string>
+ <string name="turn_off_radio">"Vypnout rádio"</string>
+ <string name="turn_on_qxdm">"Povolit protokol QXDM SD"</string>
+ <string name="turn_off_qxdm">"Zakázat protokol QXDM SD"</string>
+ <string name="radioInfo_menu_viewADN">"Zobrazit adresář karty SIM"</string>
+ <string name="radioInfo_menu_viewFDN">"Zobrazit povolená telefonní čísla"</string>
+ <string name="radioInfo_menu_viewSDN">"Zobrazit čísla volání služeb"</string>
+ <string name="radioInfo_menu_getPDP">"Získat seznam PDP"</string>
+ <string name="radioInfo_menu_enableData">"Povolit připojení datových služeb"</string>
+ <string name="radioInfo_menu_disableData">"Zakázat připojení datových služeb"</string>
+ <string name="radioInfo_menu_enableDataOnBoot">"Povolit startovací data"</string>
+ <string name="radioInfo_menu_disableDataOnBoot">"Zakázat startovací data"</string>
+ <string name="radioInfo_service_in">"V provozu"</string>
+ <string name="radioInfo_service_out">"Nepokrytá oblast"</string>
+ <string name="radioInfo_service_emergency">"Pouze tísňová volání"</string>
+ <string name="radioInfo_service_off">"Rádio je vypnuto"</string>
+ <string name="radioInfo_roaming_in">"Roaming"</string>
+ <string name="radioInfo_roaming_not">"Bez roamingu"</string>
+ <string name="radioInfo_phone_idle">"Nečinný"</string>
+ <string name="radioInfo_phone_ringing">"Vyzvánění"</string>
+ <string name="radioInfo_phone_offhook">"Probíhající hovor"</string>
+ <string name="radioInfo_data_disconnected">"Odpojeno"</string>
+ <string name="radioInfo_data_connecting">"Připojování"</string>
+ <string name="radioInfo_data_connected">"Připojeno"</string>
+ <string name="radioInfo_data_suspended">"Pozastaveno"</string>
+ <string name="radioInfo_unknown">"neznámý"</string>
+ <string name="radioInfo_display_packets">"pakety"</string>
+ <string name="radioInfo_display_bytes">"B"</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">"Odpojit kartu SD"</string>
+ <string name="sdcard_format">"Formátovat kartu SD"</string>
+ <string name="small_font">"Malá"</string>
+ <string name="medium_font">"Střední"</string>
+ <string name="large_font">"Velká"</string>
+ <string name="font_size_save">"OK"</string>
+ <string name="sdcard_setting">"Karta SD"</string>
+ <string name="battery_info_status_label">"Stav baterie:"</string>
+ <string name="battery_info_scale_label">"Měřítko baterie:"</string>
+ <string name="battery_info_level_label">"Stav baterie:"</string>
+ <string name="battery_info_health_label">"Zdraví baterie:"</string>
+ <string name="battery_info_technology_label">"Technologie baterie:"</string>
+ <string name="battery_info_voltage_label">"Napětí baterie:"</string>
+ <string name="battery_info_voltage_units">"mV"</string>
+ <string name="battery_info_temperature_label">"Teplota baterie:"</string>
+ <string name="battery_info_temperature_units">"°C"</string>
+ <string name="battery_info_uptime">"Čas od spuštění:"</string>
+ <string name="battery_info_awake_battery">"Doba provozu z baterie:"</string>
+ <string name="battery_info_awake_plugged">"Doba provozu při nabíjení:"</string>
+ <string name="battery_info_screen_on">"Doba zapnutí obrazovky:"</string>
+ <string name="battery_info_status_unknown">"Neznámé"</string>
+ <string name="battery_info_status_charging">"Nabíjení"</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">"Vybíjení"</string>
+ <string name="battery_info_status_not_charging">"Nenabíjí se"</string>
+ <string name="battery_info_status_full">"Plná"</string>
+ <string name="battery_info_health_unknown">"Neznámé"</string>
+ <string name="battery_info_health_good">"Dobrá"</string>
+ <string name="battery_info_health_overheat">"Přehřátá"</string>
+ <string name="battery_info_health_dead">"Vybitá"</string>
+ <string name="battery_info_health_over_voltage">"Přepětí"</string>
+ <string name="battery_info_health_unspecified_failure">"Neznámá chyba"</string>
+ <string name="bluetooth">"Bluetooth"</string>
+ <string name="bluetooth_visibility">"Viditelné"</string>
+ <string name="bluetooth_is_discoverable">"Zařízení je viditelné v intervalu <xliff:g id="DISCOVERABLE_TIME_PERIOD">%1$s</xliff:g> s."</string>
+ <string name="bluetooth_not_discoverable">"Přepne zařízení do viditelného režimu"</string>
+ <string name="bluetooth_devices">"Zařízení Bluetooth"</string>
+ <string name="bluetooth_device_name">"Název zařízení"</string>
+ <string name="bluetooth_name_not_set">"Název není nastaven, použit název účtu"</string>
+ <string name="bluetooth_scan_for_devices">"Vyhledat zařízení"</string>
+ <string name="bluetooth_disconnect_blank">"Zařízení <xliff:g id="DEVICE_NAME">%1$s</xliff:g> bude odpojeno."</string>
+ <string name="bluetooth_connected">"Připojeno"</string>
+ <string name="bluetooth_disconnected">"Odpojeno"</string>
+ <string name="bluetooth_disconnecting">"Odpojování..."</string>
+ <string name="bluetooth_connecting">"Připojování..."</string>
+ <!-- no translation found for bluetooth_unknown (1905151516611093010) -->
+ <skip />
+ <string name="bluetooth_not_connected">"Párovat s tímto zařízením"</string>
+ <string name="bluetooth_pairing">"Párování..."</string>
+ <!-- no translation found for bluetooth_paired (1247541089000057726) -->
+ <skip />
+ <string name="bluetooth_device">"Náhlavní souprava či handsfree"</string>
+ <string name="progress_scanning">"Vyhledávání"</string>
+ <string name="bluetooth_notif_ticker">"Požadavek na párování zařízení Bluetooth"</string>
+ <string name="bluetooth_notif_title">"Požadavek na párování"</string>
+ <string name="bluetooth_notif_message">"Povolit párování se zařízením "</string>
+ <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>
+ <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>
+ <!-- no translation found for intent_sender_data_label (8363026381459131554) -->
+ <skip />
+ <string name="intent_sender_sendbroadcast_text">"Odeslat <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">"Spustit činnost <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">"Účet:"</string>
+ <string name="proxy_clear_text">"Vymazat"</string>
+ <string name="proxy_port_label">"Port"</string>
+ <string name="proxy_defaultView_text">"Obnovit výchozí nastavení"</string>
+ <string name="proxy_action_text">"Uložit"</string>
+ <string name="proxy_hostname_label">"Název hostitele"</string>
+ <string name="proxy_error">"Upozornění"</string>
+ <string name="proxy_error_dismiss">"OK"</string>
+ <string name="proxy_error_invalid_host">"Zadaný název hostitele není platný."</string>
+ <string name="proxy_error_empty_port">"Je třeba vyplnit pole port."</string>
+ <string name="proxy_error_empty_host_set_port">"Pokud je pole hostitel prázdné, musí být prázdné i pole port."</string>
+ <string name="proxy_error_invalid_port">"Zadaný port není platný."</string>
+ <string name="radio_info_signal_location_label">"Poloha:"</string>
+ <string name="radio_info_neighboring_location_label">"Sousední identifikátor CID:"</string>
+ <string name="radio_info_data_attempts_label">"Pokusy dat:"</string>
+ <string name="radio_info_gprs_service_label">"Služba 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">"Přesměrované hovory:"</string>
+ <string name="radio_info_ppp_resets_label">"Počet obnovení protokolu PPP od spuštění:"</string>
+ <string name="radio_info_gsm_disconnects_label">"Odpojení od sítě GSM:"</string>
+ <string name="radio_info_current_network_label">"Aktuální síť:"</string>
+ <string name="radio_info_data_successes_label">"Úspěšná data:"</string>
+ <string name="radio_info_ppp_received_label">"Přijaté protokoly PPP:"</string>
+ <string name="radio_info_gsm_service_label">"Služba GSM:"</string>
+ <string name="radio_info_signal_strength_label">"Síla signálu:"</string>
+ <string name="radio_info_call_status_label">"Stav hovoru:"</string>
+ <string name="radio_info_ppp_sent_label">"Odeslané informace PPP:"</string>
+ <string name="radio_info_radio_resets_label">"Resety rádia:"</string>
+ <string name="radio_info_message_waiting_label">"Čekající zprávy:"</string>
+ <string name="radio_info_phone_number_label">"Telefonní číslo:"</string>
+ <string name="radio_info_band_mode_label">"Zvolit pásmo rádia"</string>
+ <string name="radio_info_network_type_label">"Typ sítě:"</string>
+ <string name="radio_info_set_perferred_label">"Upřednostňovaný typ sítě:"</string>
+ <string name="radio_info_ping_ipaddr">"Použít test Ping na IpAddr:"</string>
+ <string name="radio_info_ping_hostname">"Provést test Ping hostitele (www.google.cz):"</string>
+ <string name="radio_info_http_client_test">"Test klienta HTTP:"</string>
+ <string name="radio_info_toggle_ciph_label">"Přepnout šifrování"</string>
+ <string name="ping_test_label">"Spustit test Ping"</string>
+ <string name="radio_info_smsc_label">"SMSC:"</string>
+ <string name="radio_info_smsc_update_label">"Aktualizovat"</string>
+ <string name="radio_info_smsc_refresh_label">"Obnovit"</string>
+ <string name="radio_info_toggle_dns_check_label">"Přepnout kontrolu DNS"</string>
+ <string name="band_mode_title">"Nastavit pásmo pro GSM a UMTS"</string>
+ <string name="band_mode_loading">"Načítání seznamu pásem..."</string>
+ <string name="band_mode_set">"Nastavit"</string>
+ <string name="band_mode_failed">"Pásmo nenastaveno."</string>
+ <string name="band_mode_succeeded">"Pásmo nastaveno."</string>
+ <string name="sdcard_changes_instructions">"Změna se projeví při příštím připojení kabelu USB."</string>
+ <string name="sdcard_settings_screen_mass_storage_text">"Povolit velkokapacitní paměťové zařízení USB"</string>
+ <string name="sdcard_settings_total_bytes_label">"Celková paměť (bajty):"</string>
+ <string name="sdcard_settings_not_present_status">"Žádná karta SD není dostupná."</string>
+ <string name="sdcard_settings_available_bytes_label">"Dostupná paměť (bajty):"</string>
+ <string name="sdcard_settings_mass_storage_status">"Karta SD je využívána jako velkokapacitní paměťové zařízení."</string>
+ <string name="sdcard_settings_unmounted_status">"Nyní můžete kartu SD bezpečně odebrat."</string>
+ <string name="sdcard_settings_bad_removal_status">"Karta SD byla odstraněna za provozu."</string>
+ <string name="sdcard_settings_used_bytes_label">"Obsazená paměť (bajty):"</string>
+ <string name="sdcard_settings_scanning_status">"Vyhledávání mediálních souborů na kartě SD..."</string>
+ <string name="sdcard_settings_read_only_status">"Karta SD byla připojena pouze pro čtení."</string>
+ <string name="next_label">"Další"</string>
+ <string name="language_picker_title">"Národní prostředí"</string>
+ <string name="select_your_language">"Zvolte jazyk"</string>
+ <string name="activity_picker_label">"Zvolit činnost"</string>
+ <string name="device_info_label">"Info o zařízení"</string>
+ <string name="battery_info_label">"Info o baterii"</string>
+ <string name="battery_history_label">"Historie baterie"</string>
+ <string name="display_label">"Zobrazení"</string>
+ <string name="phone_info_label">"Info o telefonu"</string>
+ <string name="sd_card_settings_label">"Karta SD"</string>
+ <string name="proxy_settings_label">"Nastavení proxy serveru"</string>
+ <string name="cancel">"Zrušit"</string>
+ <string name="settings_label">"Nastavení"</string>
+ <string name="airplane_mode">"Režim V letadle"</string>
+ <string name="airplane_mode_summary">"Vypne všechna bezdrátová připojení"</string>
+ <string name="airplane_mode_turning_on">"Vypínání bezdrátových připojení..."</string>
+ <string name="airplane_mode_turning_off">"Povolování bezdrátových připojení..."</string>
+ <string name="radio_controls_title">"Ovládání bezdrátových sítí"</string>
+ <string name="radio_controls_summary">"Umožňuje spravovat WiFi, Bluetooth, režim v letadle a mobilní sítě"</string>
+ <string name="date_and_time_settings_title">"Datum a čas"</string>
+ <string name="date_and_time_settings_summary">"Umožňuje nastavit datum, čas, časové pásmo a formát"</string>
+ <string name="date_time_auto">"Automaticky"</string>
+ <string name="date_time_auto_summaryOn">"Budou použity hodnoty poskytnuté sítí"</string>
+ <string name="date_time_auto_summaryOff">"Jsou použity hodnoty poskytnuté sítí"</string>
+ <string name="date_time_24hour">"Použít 24hodinový formát"</string>
+ <string name="date_time_set_time">"Nastavení času"</string>
+ <string name="date_time_set_timezone">"Volba časového pásma"</string>
+ <string name="date_time_set_date">"Nastavení data"</string>
+ <string name="date_time_date_format">"Formát data"</string>
+ <string name="zone_list_menu_sort_alphabetically">"Řadit abecedně"</string>
+ <string name="zone_list_menu_sort_by_timezone">"Řadit podle časového pásma"</string>
+ <string name="security_settings_title">"Zabezpečení a poloha"</string>
+ <string name="security_settings_summary">"Umožňuje nastavit vaši polohu, odemknutí obrazovky a blokování karty SIM"</string>
+ <string name="security_passwords_title">"Hesla"</string>
+ <string name="bluetooth_quick_toggle_title">"Bluetooth"</string>
+ <string name="bluetooth_quick_toggle_summary">"Zapíná Bluetooth"</string>
+ <string name="bluetooth_settings">"Nastavení Bluetooth"</string>
+ <string name="bluetooth_settings_title">"Nastavení Bluetooth"</string>
+ <string name="bluetooth_settings_summary">"Umožňuje spravovat připojení, nastavit název zařízení a viditelnost"</string>
+ <string name="bluetooth_pin_entry">"Požadavek na párování zařízení Bluetooth"</string>
+ <string name="bluetooth_device_info">"Info o zařízení Bluetooth"</string>
+ <string name="bluetooth_enter_pin_msg">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"\n\n"Párování začnete zadáním kódu PIN."\n"(Zkuste 0000 nebo 1234.)"</string>
+ <string name="bluetooth_error_title">"Upozornění"</string>
+ <string name="bluetooth_pairing_error_message">"Při párování se zařízením <xliff:g id="DEVICE_NAME">%1$s</xliff:g> došlo k potížím."</string>
+ <string name="bluetooth_pairing_pin_error_message">"Při párování se zařízením <xliff:g id="DEVICE_NAME">%1$s</xliff:g> došlo k potížím. Zadaný kód PIN je nesprávný."</string>
+ <string name="bluetooth_connecting_error_message">"Při připojování k zařízení <xliff:g id="DEVICE_NAME">%1$s</xliff:g> došlo k potížím."</string>
+ <string name="bluetooth_preference_scan_title">"Vyhledat zařízení"</string>
+ <string name="bluetooth_device_context_connect">"Připojit"</string>
+ <string name="bluetooth_device_context_disconnect">"Odpojit"</string>
+ <string name="bluetooth_device_context_pair_connect">"Párovat a připojit"</string>
+ <string name="bluetooth_device_context_unpair">"Zrušit párování"</string>
+ <string name="bluetooth_device_context_disconnect_unpair">"Odpojit a zrušit párování"</string>
+ <string name="bluetooth_device_context_connect_advanced">"Možnosti"</string>
+ <string name="bluetooth_connect_specific_profiles_title">"Připojit k síti…"</string>
+ <string name="bluetooth_profile_a2dp">"Média"</string>
+ <string name="bluetooth_profile_headset">"Telefon"</string>
+ <string name="bluetooth_summary_connected_to_a2dp">"Připojeno ke zvukovému médiu"</string>
+ <string name="bluetooth_summary_connected_to_headset">"Připojeno k náhlavní soupravě"</string>
+ <string name="bluetooth_summary_connected_to_a2dp_headset">"Připojeno k náhlavní soupravě a zvukovému médiu"</string>
+ <string name="bluetooth_device_advanced_title">"Možnosti zařízení <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_device_advanced_online_mode_title">"Připojit"</string>
+ <string name="bluetooth_device_advanced_online_mode_summary">"Umožňuje připojení zařízení s rozhraním Bluetooth"</string>
+ <string name="bluetooth_device_advanced_profile_header_title">"Profily"</string>
+ <string name="bluetooth_a2dp_profile_summary_connected">"Připojeno ke zvukovému médiu"</string>
+ <string name="bluetooth_headset_profile_summary_connected">"Připojeno k náhlavní soupravě"</string>
+ <string name="bluetooth_a2dp_profile_summary_use_for">"Umožňuje připojení zvukového média"</string>
+ <string name="bluetooth_headset_profile_summary_use_for">"Umožňuje připojení náhlavní soupravy"</string>
+ <string name="wifi">"WiFi"</string>
+ <string name="wifi_quick_toggle_title">"WiFi"</string>
+ <string name="wifi_quick_toggle_summary">"Zapíná WiFi"</string>
+ <string name="wifi_settings">"Nastavení WiFi"</string>
+ <string name="wifi_settings_category">"Nastavení WiFi"</string>
+ <string name="wifi_settings_summary">"Umožňuje nastavit a spravovat přístupové body bezdrátové sítě"</string>
+ <string name="forget_network">"Odstranit"</string>
+ <string name="wifi_status">"Stav"</string>
+ <string name="wifi_link_speed">"Rychlost"</string>
+ <string name="wifi_signal_3">"Vynikající"</string>
+ <string name="wifi_signal_2">"Dobrá"</string>
+ <string name="wifi_signal_1">"Dostačující"</string>
+ <string name="wifi_signal_0">"Nízká"</string>
+ <string name="security">"Zabezpečení"</string>
+ <string name="wifi_security_open">"Nezabezpečená"</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">"Neznámé"</string>
+ <string name="wifi_security_verbose_open">"Nezabezpečená síť"</string>
+ <string name="wifi_security_verbose_wep">"Zabezpečení WEP"</string>
+ <string name="wifi_security_verbose_wpa">"Zabezpečení WPA"</string>
+ <string name="wifi_security_verbose_wpa2">"Zabezpečení WPA2"</string>
+ <string name="ip_address">"Adresa IP"</string>
+ <string name="signal">"Síla signálu"</string>
+ <string name="wifi_starting">"Zapínání WiFi..."</string>
+ <string name="wifi_stopping">"Vypínání..."</string>
+ <string name="wifi_error">"Chyba"</string>
+ <string name="error_starting">"WiFi se nepodařilo spustit."</string>
+ <string name="error_stopping">"WiFi se nepodařilo zastavit."</string>
+ <string name="error_scanning">"Nepodařilo se vyhledávat sítě."</string>
+ <string name="error_connecting">"K síti se nelze připojit."</string>
+ <string name="error_saving">"Síť nelze uložit."</string>
+ <string name="connect">"Připojit"</string>
+ <string name="connect_to_blank">"Připojit k síti <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+ <string name="please_type_passphrase">"Heslo bezdrátové sítě"</string>
+ <string name="please_type_hex_key">"Hexadecimální klíč WEP (0-9, A-F)"</string>
+ <string name="wifi_show_password">"Zobrazovat heslo."</string>
+ <string name="scan_wifi">"Vyhledávání"</string>
+ <string name="summary_not_in_range">"Mimo dosah"</string>
+ <string name="summary_remembered">"Uložené nastavení"</string>
+ <string name="summary_connection_failed">"Připojení se nezdařilo, zkuste to znovu."</string>
+ <string name="wifi_access_points">"Sítě WiFi"</string>
+ <string name="wifi_type_ssid">"Identifikátor SSID sítě"</string>
+ <string name="wifi_security">"Zabezpečení"</string>
+ <string name="wifi_save_config">"Uložit"</string>
+ <string name="wifi_password_unchanged">"(nezměněno)"</string>
+ <string name="wifi_add_other_network">"Přidat síť WiFi"</string>
+ <string name="wifi_notify_open_networks">"Oznamování sítě"</string>
+ <string name="wifi_notify_open_networks_summary">"Oznamování dostupných nezabezpečených sítí"</string>
+ <string name="wifi_password_incorrect_error">"Původní síťové heslo bylo zadáno nesprávně. Zkuste to znovu."</string>
+ <string name="wifi_generic_connection_error">"Při připojování k síti došlo k chybě. Zkuste to znovu."</string>
+ <string name="wifi_menu_advanced">"Pokročilé"</string>
+ <string name="wifi_ip_settings_titlebar">"Nastavení adresy IP"</string>
+ <string name="wifi_ip_settings_menu_save">"Uložit"</string>
+ <string name="wifi_ip_settings_menu_cancel">"Zrušit"</string>
+ <string name="wifi_ip_settings_invalid_ip">"Zadejte platnou adresu IP."</string>
+ <string name="wifi_use_static_ip">"Použít statickou adresu IP"</string>
+ <string name="wifi_ip_address">"Adresa IP"</string>
+ <string name="wifi_dns1">"Server DNS 1"</string>
+ <string name="wifi_dns2">"Server DNS 2"</string>
+ <string name="wifi_gateway">"Brána"</string>
+ <string name="wifi_netmask">"Maska sítě"</string>
+ <string name="wifi_context_menu_connect">"Připojit k síti"</string>
+ <string name="wifi_context_menu_forget">"Odstranit záznam sítě"</string>
+ <string name="wifi_context_menu_change_password">"Změnit heslo"</string>
+ <string name="wifi_advanced_titlebar">"Pokročilé"</string>
+ <string name="wifi_setting_num_channels_title">"Regulační doména"</string>
+ <string name="wifi_setting_num_channels_summary">"Umožňuje nastavit počet použitých kanálů"</string>
+ <string name="wifi_setting_num_channels_error">"Při nastavení regulační domény došlo k chybě."</string>
+ <string name="wifi_setting_num_channels_channel_phrase">"Kanály: <xliff:g id="NUM_CHANNELS">%1$d</xliff:g>"</string>
+ <string name="wifi_setting_sleep_policy_title">"Zásady používání sítě Wi-Fi v režimu spánku"</string>
+ <string name="wifi_setting_sleep_policy_summary">"Určit, kdy přepnout ze sítě Wi-Fi na mobilní datový přenos"</string>
+ <string name="wifi_setting_sleep_policy_error">"Při nastavení zásad pro režim spánku došlo k problému."</string>
+ <string name="wifi_advanced_mac_address_title">"Adresa MAC"</string>
+ <string name="fragment_status_scanning">"Vyhledávání..."</string>
+ <string name="fragment_status_connecting">"Připojování k síti <xliff:g id="NETWORK_NAME">%1$s</xliff:g>..."</string>
+ <string name="fragment_status_authenticating">"Ověřování v síti <xliff:g id="NETWORK_NAME">%1$s</xliff:g>..."</string>
+ <string name="fragment_status_obtaining_ip">"Získávání adresy IP ze sítě <xliff:g id="NETWORK_NAME">%1$s</xliff:g>..."</string>
+ <string name="fragment_status_connected">"Připojeno k síti <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+ <string name="fragment_status_disconnecting">"Odpojování od sítě <xliff:g id="NETWORK_NAME">%1$s</xliff:g>..."</string>
+ <string name="fragment_status_disconnected">"Odpojeno"</string>
+ <string name="fragment_status_failed">"Připojení se nezdařilo."</string>
+ <string name="status_scanning">"Vyhledávání..."</string>
+ <string name="status_connecting">"Připojování..."</string>
+ <string name="status_authenticating">"Ověřování..."</string>
+ <string name="status_obtaining_ip">"Získávání adresy..."</string>
+ <string name="status_connected">"Připojeno"</string>
+ <string name="status_disconnecting">"Odpojování..."</string>
+ <string name="status_disconnected">"Odpojeno"</string>
+ <string name="status_failed">"Připojení se nezdařilo."</string>
+ <string name="sound_and_display_settings">"Obraz a zvuk"</string>
+ <string name="sound_settings">"Nastavení zvuku"</string>
+ <string name="sound_and_display_settings_summary">"Umožňuje nastavit vyzváněcí tón, oznámení a jas obrazovky"</string>
+ <string name="silent_mode_title">"Tichý režim"</string>
+ <string name="silent_mode_summary">"Ztiší všechny zvuky kromě médií a upozornění"</string>
+ <string name="ringtone_title">"Vyzváněcí tón telefonu"</string>
+ <string name="ringtone_summary">"Umožňuje nastavit výchozí vyzváněcí tón příchozího hovoru"</string>
+ <string name="ring_volume_title">"Hlasitost vyzvánění"</string>
+ <string name="ring_volume_summary">"Umožňuje nastavit hlasitost příchozích hovorů a oznámení"</string>
+ <string name="vibrate_title">"Vibrace telefonu"</string>
+ <string name="vibrate_summary">"Příchozí hovory jsou provázeny vibracemi"</string>
+ <string name="notification_sound_title">"Tón oznámení"</string>
+ <string name="notification_sound_summary">"Umožňuje nastavit výchozí tón oznámení"</string>
+ <string name="incoming_call_volume_title">"Hlasitost příchozího hovoru"</string>
+ <string name="notification_volume_title">"Hlasitost oznámení"</string>
+ <string name="checkbox_notification_same_as_incoming_call">"Použije hlasitost příchozích hovorů také pro oznámení"</string>
+ <string name="notification_sound_dialog_title">"Zvolit vyzváněcí tón oznámení"</string>
+ <string name="media_volume_title">"Hlasitost médií"</string>
+ <string name="media_volume_summary">"Umožňuje nastavit hlasitost hudby a videí"</string>
+ <string name="dtmf_tone_enable_title">"Dotyky jsou provázeny zvuky"</string>
+ <string name="dtmf_tone_enable_summary_on">"Tlačítka číselníku jsou provázena zvuky"</string>
+ <string name="dtmf_tone_enable_summary_off">"Tlačítka číselníku jsou provázena zvuky"</string>
+ <string name="sound_effects_enable_title">"Výběr se zvuky"</string>
+ <string name="sound_effects_enable_summary_on">"Výběr na obrazovce je provázen zvuky"</string>
+ <string name="sound_effects_enable_summary_off">"Výběr na obrazovce je provázen zvuky"</string>
+ <string name="play_media_notification_sounds_enable_title">"Oznámení karty SD"</string>
+ <string name="play_media_notification_sounds_enable_summary_on">"Vypnout zvuky oznámení karty SD"</string>
+ <string name="play_media_notification_sounds_enable_summary_off">"Povolit zvuky oznámení karty SD"</string>
+ <string name="sync_settings">"Synchronizace dat"</string>
+ <string name="sync_settings_summary">"Umožňuje vybrat aplikace pro synchronizaci"</string>
+ <string name="display_settings">"Nastavení zobrazení"</string>
+ <string name="animations_title">"Animace"</string>
+ <string name="animations_summary_on">"Zobrazit animace otevírání a zavírání oken"</string>
+ <string name="animations_summary_off">"Animuje otevírání a zavírání oken"</string>
+ <string name="brightness">"Jas"</string>
+ <string name="brightness_summary">"Nastavte jas displeje"</string>
+ <string name="screen_timeout">"Interval vypnutí obrazovky"</string>
+ <string name="screen_timeout_summary">"Upravte prodlevu, po které se obrazovka automaticky vypne"</string>
+ <string name="sim_lock_settings">"Nastavení zámku karty SIM"</string>
+ <string name="sim_lock_settings_category">"Nastavení zámku karty SIM"</string>
+ <string name="sim_lock_settings_title">"Zámek karty SIM"</string>
+ <string name="sim_pin_toggle">"Zamykat kartu SIM"</string>
+ <string name="sim_lock_on">"K použití telefonu je vyžadován kód PIN"</string>
+ <string name="sim_lock_off">"K použití telefonu je vyžadován PIN"</string>
+ <string name="sim_pin_change">"Změnit kód PIN karty SIM"</string>
+ <string name="sim_enter_pin">"Kód PIN karty SIM"</string>
+ <string name="sim_enable_sim_lock">"Zamykat kartu SIM"</string>
+ <string name="sim_disable_sim_lock">"Odemknout kartu SIM"</string>
+ <string name="sim_enter_old">"Starý kód PIN karty SIM"</string>
+ <string name="sim_enter_new">"Nový kód PIN karty SIM"</string>
+ <string name="sim_reenter_new">"Potvrďte nový kód PIN."</string>
+ <string name="sim_change_pin">"Kód PIN karty SIM"</string>
+ <string name="sim_bad_pin">"Nesprávný kód PIN."</string>
+ <string name="sim_pins_dont_match">"Kódy PIN nejsou shodné."</string>
+ <string name="sim_change_failed">"Změna kódu PIN se nezdařila."\n"Kód PIN je zřejmě nesprávný."</string>
+ <string name="sim_change_succeeded">"Kód PIN karty SIM byl úspěšně změněn."</string>
+ <string name="sim_lock_failed">"Stav zámku karty SIM nelze změnit."\n"Zřejmě jste zadali nesprávný kód PIN."</string>
+ <string name="sim_enter_ok">"OK"</string>
+ <string name="sim_enter_cancel">"Zrušit"</string>
+ <string name="device_info_settings">"Stav telefonu"</string>
+ <string name="system_update_settings_list_item_title">"Aktualizace systému"</string>
+ <string name="system_update_settings_list_item_summary">"Zkontrolovat aktualizace systému"</string>
+ <string name="firmware_version">"Verze firmwaru"</string>
+ <string name="model_number">"Označení modelu"</string>
+ <string name="baseband_version">"Verze základního pásma"</string>
+ <string name="kernel_version">"Verze jádra"</string>
+ <string name="build_number">"Číslo sestavení"</string>
+ <string name="device_info_not_available">"Nedostupný"</string>
+ <string name="device_status_activity_title">"Stav"</string>
+ <string name="device_status">"Stav"</string>
+ <string name="device_status_summary">"IMEI, telefonní číslo, signál, atd."</string>
+ <string name="storage_settings_title">"Karta SD a paměť telefonu"</string>
+ <string name="storage_settings_summary">"Odpojuje kartu SD a zobrazuje dostupnou paměť"</string>
+ <string name="status_number">"Telefonní číslo"</string>
+ <string name="status_network_type">"Typ mobilní sítě"</string>
+ <string name="status_data_state">"Stav mobilní sítě"</string>
+ <string name="status_service_state">"Stav služby"</string>
+ <string name="status_signal_strength">"Síla signálu"</string>
+ <string name="status_roaming">"Roaming"</string>
+ <string name="status_operator">"Síť"</string>
+ <string name="status_wifi_mac_address">"Adresa MAC sítě WiFi"</string>
+ <string name="status_bt_address">"Adresa zařízení Bluetooth"</string>
+ <string name="status_unavailable">"Nedostupný údaj"</string>
+ <string name="status_network_traffic_stats">"Využití sítě"</string>
+ <string name="status_network_traffic_summary">"Odesláno: <xliff:g id="NETWORK_TRAFFIC_0">%1$d packets, %2$d bytes%n</xliff:g>Přijato: <xliff:g id="NETWORK_TRAFFIC_1">%3$d packets, %4$d bytes</xliff:g>"</string>
+ <string name="status_up_time">"Doba provozu"</string>
+ <string name="status_awake_time">"Doba provozu"</string>
+ <string name="internal_memory">"Interní paměť telefonu"</string>
+ <string name="sd_memory">"Karta SD"</string>
+ <string name="memory_available">"Dostupná paměť"</string>
+ <string name="memory_size">"Celková paměť"</string>
+ <string name="sd_eject">"Odpojit kartu SD"</string>
+ <string name="sd_eject_summary">"Odpojit kartu SD za účelem bezpečného odebrání"</string>
+ <string name="sd_format">"Formátovat kartu SD"</string>
+ <string name="sd_format_summary">"Formátovat (vymazat) kartu SD"</string>
+ <string name="sd_unavailable">"Nedostupný údaj"</string>
+ <string name="read_only">" (Pouze pro čtení)"</string>
+ <string name="battery_status_title">"Stav baterie"</string>
+ <string name="battery_level_title">"Stav baterie"</string>
+ <string name="apn_settings">"Přístupové body"</string>
+ <string name="apn_edit">"Upravit přístupový bod"</string>
+ <string name="apn_not_set">"&lt;Nenastaveno&gt;"</string>
+ <string name="apn_name">"Jméno"</string>
+ <string name="apn_apn">"Název přístupvého bodu (APN)"</string>
+ <string name="apn_http_proxy">"Proxy"</string>
+ <string name="apn_http_port">"Port"</string>
+ <string name="apn_user">"Uživatelské jméno"</string>
+ <string name="apn_password">"Heslo"</string>
+ <string name="apn_server">"Server"</string>
+ <string name="apn_mmsc">"MMSC"</string>
+ <string name="apn_mms_proxy">"Proxy server systému MMS"</string>
+ <string name="apn_mms_port">"Port systému MMS"</string>
+ <string name="apn_mcc">"MCC"</string>
+ <string name="apn_mnc">"MNC"</string>
+ <string name="apn_type">"typ APN"</string>
+ <string name="menu_delete">"Smazat APN"</string>
+ <string name="menu_new">"Nový APN"</string>
+ <string name="menu_save">"Uložit"</string>
+ <string name="menu_cancel">"Zrušit"</string>
+ <string name="error_title">"Upozornění"</string>
+ <string name="error_name_empty">"Pole Název nemůže být prázdné."</string>
+ <string name="error_apn_empty">"Název AP nemůže být prázdný."</string>
+ <string name="error_mcc_not3">"Pole MCC musí obsahovat alespoň 3 číslice."</string>
+ <string name="error_mnc_not23">"Pole MNC musí obsahovat 2 nebo 3 číslice."</string>
+ <string name="master_clear_title">"Obnovení továrních dat"</string>
+ <string name="master_clear_summary">"Umožňuje odstranit všechna data v telefonu"</string>
+ <string name="master_clear_desc">"Tato akce obnoví výchozí tovární nastavení telefonu. Všechna data a stažené aplikace budou smazány."</string>
+ <string name="master_clear_button_text">"Resetovat telefon"</string>
+ <string name="master_clear_final_desc">"Opravdu chcete resetovat telefon? Smažete veškerá data a aplikace. Proces nelze zvrátit."</string>
+ <string name="master_clear_final_button_text">"Odstranit vše"</string>
+ <string name="master_clear_gesture_prompt">"Nakreslete své bezpečnostní gesto"</string>
+ <string name="master_clear_gesture_explanation">"Chcete-li potvrdit resetování telefonu, musíte nakreslit bezpečnostní gesto."</string>
+ <string name="master_clear_failed">"Pokus o reset se nezdařil, protože služba System Clear není dostupná."</string>
+ <string name="media_format_title">"Formátovat kartu SD"</string>
+ <string name="media_format_summary">"Vymaže všechna data na kartě SD"</string>
+ <string name="media_format_desc">"Tato akce smaže kartu SD v telefonu. VŠECHNA data na kartě budou ztracena."</string>
+ <string name="media_format_button_text">"Formátovat kartu SD"</string>
+ <string name="media_format_final_desc">"Formátování karty SD. Chcete smazat všechna svoje média? Akci nelze vrátit zpět."</string>
+ <string name="media_format_final_button_text">"Smazat vše"</string>
+ <string name="media_format_gesture_prompt">"Nakreslete své bezpečnostní gesto"</string>
+ <string name="media_format_gesture_explanation">"Formátování karty SD je potřeba potvrdit nakreslením bezpečnostního gesta."</string>
+ <string name="call_settings_title">"Nastavení hovorů"</string>
+ <string name="call_settings_summary">"Umožňuje nastavit hlasovou schránku, přesměrování hovorů, další hovory na lince a ID volajícího"</string>
+ <string name="network_settings_title">"Mobilní sítě"</string>
+ <string name="network_settings_summary">"Umožňuje nastavit možnosti roamingu, sítí a názvy přístupových bodů"</string>
+ <string name="location_title">"Zdroje polohy"</string>
+ <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 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="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>
+ <string name="contributors_title">"Přispěvatelé"</string>
+ <string name="copyright_title">"Autorská práva"</string>
+ <string name="license_title">"Licence"</string>
+ <string name="terms_title">"Smluvní podmínky"</string>
+ <string name="settings_license_activity_title">"Licence open source"</string>
+ <string name="settings_license_activity_unavailable">"Při načítání licencí došlo k chybě."</string>
+ <string name="settings_license_activity_loading">"Načítání..."</string>
+ <string name="lock_settings_title">"Gesto pro odemknutí obrazovky"</string>
+ <string name="lockpattern_change_lock_pattern_label">"Změna bezpečnostního gesta"</string>
+ <string name="lockpattern_need_to_unlock">"Potvrďte uložené gesto"</string>
+ <string name="lockpattern_need_to_unlock_wrong">"Zkuste to prosím znovu:"</string>
+ <string name="lockpattern_recording_intro_header">"Nakreslete své bezpečnostní gesto."</string>
+ <string name="lockpattern_recording_intro_footer">"Nápovědu zobrazíte stisknutím klávesy Menu."</string>
+ <string name="lockpattern_recording_inprogress">"Na závěr zdvihněte prst z obrazovky."</string>
+ <string name="lockpattern_recording_incorrect_too_short">"Minimální počet spojených teček je <xliff:g id="NUMBER">%d</xliff:g>. Zkuste to znovu:"</string>
+ <string name="lockpattern_pattern_entered_header">"Gesto bylo zaznamenáno."</string>
+ <string name="lockpattern_need_to_confirm">"Pro potvrzení nakreslete gesto znovu:"</string>
+ <string name="lockpattern_pattern_confirmed_header">"Nové bezpečnostní gesto:"</string>
+ <string name="lockpattern_confirm_button_text">"Potvrdit"</string>
+ <string name="lockpattern_restart_button_text">"Nakreslit znovu"</string>
+ <string name="lockpattern_retry_button_text">"Zkusit znovu"</string>
+ <string name="lockpattern_continue_button_text">"Pokračovat"</string>
+ <string name="lockpattern_settings_title">"Bezpečnostní gesto"</string>
+ <string name="lockpattern_settings_enable_title">"Požadovat gesto"</string>
+ <string name="lockpattern_settings_enable_summary">"Obrazovku je nutné odemknout pomocí bezpečnostního gesta"</string>
+ <string name="lockpattern_settings_enable_visible_pattern_title">"Použití viditelného gesta"</string>
+ <string name="lockpattern_settings_enable_tactile_feedback_title">"Použití dotykového ověření"</string>
+ <string name="lockpattern_settings_choose_lock_pattern">"Nastavení bezpečnostního gesta"</string>
+ <string name="lockpattern_settings_change_lock_pattern">"Změna bezpečnostního gesta"</string>
+ <string name="lockpattern_settings_help_how_to_record">"Bezpečnostní gesto nakreslíte takto"</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_header">"Příliš mnoho neplatných pokusů."</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_footer">"Sekundy zbývající do dalšího pokusu: <xliff:g id="NUMBER">%d</xliff:g>."</string>
+ <string name="skip_button_label">"Zrušit"</string>
+ <string name="next_button_label">"Další"</string>
+ <string name="lock_title">"Zabezpečení telefonu"</string>
+ <string name="lock_intro_message"><font size="17">"Chraňte svůj telefon před nepovoleným použitím vytvořením osobního bezpečnostního gesta. "\n<font height="17">\n</font><b>"1"</b>" Příklad takového gesta uvidíte na dalším snímku. "\n<font height="17">\n</font><b>"2"</b>" Až budete připraveni, nakreslete své osobní bezpečnostní gesto. Vyzkoušejte více gest, ale vždy spojte alespoň čtyři tečky. "\n<font height="17">\n</font><b>"3"</b>" Chcete-li gesto potvrdit, zopakujte je. "\n<font height="17">\n</font><b>"Jste připraveni začít? Zvolte tlačítko Další "</b>". "\n<font height="3">\n</font>"Chcete-li ponechat telefon nezabezpečený, zvolte tlačítko Zrušit."</font></string>
+ <string name="lock_example_title">"Příklad gesta"</string>
+ <string name="lock_example_message">"Spojte alespoň čtyři tečky."\n" "\n"Až budete připraveni nakreslit vlastní gesto, zvolte tlačítko Další."</string>
+ <string name="manageapplications_settings_title">"Správa aplikací"</string>
+ <string name="manageapplications_settings_summary">"Spravovat a odebrat instalované aplikace"</string>
+ <string name="applications_settings">"Aplikace"</string>
+ <string name="applications_settings_summary">"Umožňuje spravovat aplikace a nastavit klávesové zkratky rychlého spuštění"</string>
+ <string name="applications_settings_header">"Nastavení aplikace"</string>
+ <string name="install_applications">"Neznámé zdroje"</string>
+ <string name="install_unknown_applications">"Povoluje instalaci aplikací mimo službu Market"</string>
+ <string name="install_all_warning">"Váš telefon a osobní údaje jsou zranitelnější vůči útoku aplikací z neznámých zdrojů. Vyjadřujete souhlas, že nesete osobní odpovědnost za jakékoli škody způsobené na vašem telefonu nebo za ztrátu dat v důsledku používání těchto aplikací."</string>
+ <string name="application_info_label">"Info o aplikaci"</string>
+ <string name="storage_label">"Paměť"</string>
+ <string name="auto_launch_label">"Spustit jako výchozí"</string>
+ <string name="permissions_label">"Povolení"</string>
+ <string name="cache_header_label">"Mezipaměť"</string>
+ <string name="clear_cache_btn_text">"Vymazat mezipaměť"</string>
+ <string name="cache_size_label">"Mezipaměť"</string>
+ <string name="controls_label">"Ovládací prvky"</string>
+ <string name="force_stop">"Vynutit ukončení"</string>
+ <string name="total_size_label">"Celkem"</string>
+ <string name="application_size_label">"Aplikace"</string>
+ <string name="data_size_label">"Data"</string>
+ <string name="uninstall_text">"Odinstalovat"</string>
+ <string name="clear_user_data_text">"Vymazat data"</string>
+ <string name="auto_launch_enable_text">"Aplikace byla nastavena, aby se pro některé akce spouštěla jako výchozí."</string>
+ <string name="auto_launch_disable_text">"Žádná výchozí nastavení."</string>
+ <string name="clear_activities">"Vymazat výchozí nastavení"</string>
+ <string name="unknown">"Neznámé"</string>
+ <string name="sort_order_alpha">"Řadit"</string>
+ <string name="sort_order_size">"Řadit podle velikosti"</string>
+ <string name="manage_space_text">"Správa paměti"</string>
+ <string name="filter">"Filtrovat"</string>
+ <string name="filter_dlg_title">"Vyberte možnosti filtru"</string>
+ <string name="filter_apps_all">"Všechny"</string>
+ <string name="filter_apps_third_party">"Aplikace třetí strany"</string>
+ <string name="filter_apps_running">"Spuštěné"</string>
+ <string name="loading">"Načítání..."</string>
+ <string name="recompute_size">"Přepočítávání velikosti..."</string>
+ <string name="clear_data_dlg_title">"Smazat"</string>
+ <string name="clear_data_dlg_text">"Všechny informace uložené v této aplikaci budou trvale smazány."</string>
+ <string name="dlg_ok">"OK"</string>
+ <string name="dlg_cancel">"Zrušit"</string>
+ <string name="app_not_found_dlg_title">"Aplikace nebyla nalezena"</string>
+ <string name="app_not_found_dlg_text">"Aplikaci se nepodařilo najít na seznamu nainstalovaných aplikací."</string>
+ <string name="clear_data_failed">"Nepodařilo se vymazat data aplikace."</string>
+ <string name="security_settings_desc">"Tato aplikace má přístup k následujícím položkám telefonu:"</string>
+ <string name="computing_size">"Probíhá výpočet…"</string>
+ <string name="invalid_size_value">"Nepodařilo se určit velikost balíčku"</string>
+ <string name="empty_list_msg">"Žádné aplikace třetí strany nejsou nainstalovány."</string>
+ <string name="language_settings">"Národní prostředí a text"</string>
+ <string name="language_settings_summary">"Nastavení národního prostředí (jazyka a oblasti) a možností zadávání a automatických oprav textu"</string>
+ <string name="language_category">"Nastavení národního prostředí"</string>
+ <string name="text_category">"Nastavení textu"</string>
+ <string name="phone_language">"Volba národního prostředí"</string>
+ <string name="phone_language_summary">"Vyberte jazyk a oblast"</string>
+ <string name="auto_replace">"Automatické nahrazování"</string>
+ <string name="auto_replace_summary">"Opravuje pravopisné chyby"</string>
+ <string name="auto_caps">"Automatická velká písmena"</string>
+ <string name="auto_caps_summary">"První písmeno ve větě je automaticky velké"</string>
+ <string name="auto_punctuate">"Automatická interpunkce"</string>
+ <string name="hardkeyboard_category">"Nastavení fyzické klávesnice"</string>
+ <string name="auto_punctuate_summary">"Znak „.“ lze vložit dvěma stisky klávesy Mezerník."</string>
+ <string name="show_password">"Zobrazování hesel"</string>
+ <string name="show_password_summary">"Zadávané heslo je zobrazováno"</string>
+ <string name="user_dict_settings_titlebar">"Uživatelský slovník"</string>
+ <string name="user_dict_settings_title">"Uživatelský slovník"</string>
+ <string name="user_dict_settings_summary">"Přidat nebo odebrat slova z uživatelského slovníku"</string>
+ <string name="user_dict_settings_add_menu_title">"Přidat"</string>
+ <string name="user_dict_settings_add_dialog_title">"Přidat do slovníku"</string>
+ <string name="user_dict_settings_context_menu_edit_title">"Upravit"</string>
+ <string name="user_dict_settings_context_menu_delete_title">"Smazat"</string>
+ <string name="user_dict_settings_empty_text">"V uživatelském slovníku nejsou žádná slova. Slovo můžete přidat pomocí nabídky."</string>
+ <string name="testing">"Testování"</string>
+ <string name="testing_phone_info">"Info o telefonu"</string>
+ <string name="testing_battery_info">"Info o baterii"</string>
+ <string name="testing_battery_history">"Historie baterie"</string>
+ <string name="quick_launch_title">"Rychlé spuštění"</string>
+ <string name="quick_launch_summary">"Umožňuje nastavit klávesové zkratky pro spouštění aplikací"</string>
+ <string name="quick_launch_assign_application">"Přiřadit aplikaci"</string>
+ <string name="quick_launch_no_shortcut">"Žádná klávesová zkratka"</string>
+ <string name="quick_launch_shortcut">"Hledat + <xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g>"</string>
+ <string name="quick_launch_clear_dialog_title">"Vymazat"</string>
+ <string name="quick_launch_clear_dialog_message">"Klávesová zkratka <xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g> (<xliff:g id="APPLICATION_NAME">%2$s</xliff:g>) bude vymazána."</string>
+ <string name="quick_launch_clear_ok_button">"OK"</string>
+ <string name="quick_launch_clear_cancel_button">"Zrušit"</string>
+ <string name="quick_launch_display_mode_applications">"Aplikace"</string>
+ <string name="quick_launch_display_mode_shortcuts">"Klávesové zkratky"</string>
+ <string name="input_methods_settings_title">"Zadávání textu"</string>
+ <string name="input_methods_settings_summary">"Správa možností zadávání textu"</string>
+ <string name="input_methods_settings_label_format">"%s: nastavení"</string>
+ <string name="development_settings_title">"Vývoj"</string>
+ <string name="development_settings_summary">"Umožňuje nastavit možnosti pro vývoj aplikace"</string>
+ <string name="enable_adb">"Ladění USB"</string>
+ <string name="enable_adb_summary">"Povoluje režim ladění s připojeným zařízením USB"</string>
+ <string name="keep_screen_on">"Nevypínat obrazovku"</string>
+ <string name="keep_screen_on_summary">"Obrazovka se při nabíjení nepřepne do režimu spánku"</string>
+ <string name="allow_mock_location">"Povoluje simulované polohy"</string>
+ <string name="allow_mock_location_summary">"Povoluje simulované polohy"</string>
+ <!-- no translation found for gadget_picker_title (98374951396755811) -->
+ <skip />
+ <!-- no translation found for widget_picker_title (9130684134213467557) -->
+ <skip />
+ <string name="battery_history_details_for">"Podrobnosti pro UID %d"</string>
+ <string name="battery_history_uid">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
+ <string name="battery_history_network_usage">"Podrobnosti o používání sítě aplikací <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
+ <string name="battery_history_bytes_received">"Přijato bytů: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_sent">"Odesláno bytů: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_total">"Celkem bytů: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_cpu_usage">"Podrobnosti o využívání CPU aplikací <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
+ <string name="battery_history_user_time">"Čas uživatele:"</string>
+ <string name="battery_history_system_time">"Systémový čas:"</string>
+ <string name="battery_history_total_time">"Celková doba:"</string>
+ <string name="battery_history_starts">"Počet spuštění: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
+ <string name="battery_history_days">"<xliff:g id="DAYS">%1$d</xliff:g> dní, <xliff:g id="HOURS">%2$d</xliff:g> hod., <xliff:g id="MINUTES">%3$d</xliff:g> min., <xliff:g id="SECONDS">%4$d</xliff:g> s"</string>
+ <string name="battery_history_hours">"<xliff:g id="HOURS">%1$d</xliff:g> hod., <xliff:g id="MINUTES">%2$d</xliff:g> min., <xliff:g id="SECONDS">%3$d</xliff:g> s"</string>
+ <string name="battery_history_minutes">"<xliff:g id="MINUTES">%1$d</xliff:g> min., <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
+ <string name="battery_history_seconds">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
+ <string name="battery_history_packages_sharing_this_uid">"Balíčky sdílející toto UID:"</string>
+ <string name="battery_history_no_data">"Údaje o využití baterie nejsou k dispozici"</string>
+ <string name="battery_history_sensor">"Senzor:"</string>
+ <!-- no translation found for battery_history_wakelock (608683447522396293) -->
+ <skip />
+ <string name="battery_history_used_by_packages">"Senzor je používán následujícími balíčky:"</string>
+ <string name="battery_history_sensor_usage">"Použito <xliff:g id="COUNT">%1$d</xliff:g>krát balíčkem <xliff:g id="PACKAGE">%2$s</xliff:g>"</string>
+ <string name="battery_history_sensor_usage_multi">"Použito <xliff:g id="COUNT">%1$d</xliff:g>krát některým z následujících:"</string>
+ <!-- no translation found for battery_history_awake_label (8449792868990080882) -->
+ <skip />
+ <!-- no translation found for battery_history_screen_on_label (1848936521786339362) -->
+ <skip />
+ <!-- no translation found for battery_history_phone_on_label (700191958853142297) -->
+ <skip />
+ <!-- no translation found for battery_history_awake (4350886665719031057) -->
+ <skip />
+ <string name="battery_history_screen_on">"Doba se zapnutou obrazovkou:"</string>
+ <!-- no translation found for battery_history_phone_on (4891504401623839532) -->
+ <skip />
+ <string name="battery_history_screen_on_battery">"Na baterii:"</string>
+ <string name="battery_history_screen_on_plugged">"Připojeno:"</string>
+ <string name="usage_stats_label">"Statistika použití"</string>
+ <string name="testing_usage_stats">"Statistika použití"</string>
+ <string name="display_order_text">"Řadit podle:"</string>
+ <string name="app_name_label">"Aplikace"</string>
+ <string name="launch_count_label">"Počet"</string>
+ <string name="usage_time_label">"Doba použití"</string>
+</resources>
diff --git a/res/values-de-nokeys/strings.xml b/res/values-de-nokeys/strings.xml
new file mode 100644
index 0000000..3efeb55
--- /dev/null
+++ b/res/values-de-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">"Anwendungen verwalten"</string>
+</resources>
diff --git a/res/values-de/arrays.xml b/res/values-de/arrays.xml
new file mode 100644
index 0000000..e3f0ec1
--- /dev/null
+++ b/res/values-de/arrays.xml
@@ -0,0 +1,72 @@
+<?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>"Amerika"</item>
+ <item>"Europa"</item>
+ <item>"Afrika"</item>
+ <item>"Asien"</item>
+ <item>"Australien"</item>
+ <item>"Pacific"</item>
+ <item>"Alle"</item>
+ </string-array>
+ <string-array name="screen_timeout_entries">
+ <item>"15 Sekunden"</item>
+ <item>"30 Sekunden"</item>
+ <item>"1 Minute"</item>
+ <item>"2 Minuten"</item>
+ <item>"10 Minuten"</item>
+ <item>"Kein Timeout"</item>
+ </string-array>
+ <string-array name="wifi_security_entries">
+ <item>"Autom."</item>
+ <item>"Keine"</item>
+ <item>"WEP"</item>
+ <item>"WPA Personal"</item>
+ <item>"WPA2 Personal"</item>
+ </string-array>
+ <string-array name="wifi_security_without_auto_entries">
+ <item>"Keine"</item>
+ <item>"WEP"</item>
+ <item>"WPA Personal"</item>
+ <item>"WPA2 Personal"</item>
+ </string-array>
+ <string-array name="wifi_wep_type">
+ <item>"Autom."</item>
+ <item>"WEP ASCII"</item>
+ <item>"WEP hexadezimal"</item>
+ </string-array>
+ <string-array name="wifi_sleep_policy_entries">
+ <item>"Wenn Bildschirm abschaltet"</item>
+ <item>"Niemals im Netzbetrieb"</item>
+ <item>"Niemals"</item>
+ </string-array>
+ <!-- no translation found for battery_history_type_spinner:0 (2193799199027871385) -->
+ <!-- no translation found for battery_history_type_spinner:1 (6401018715947316517) -->
+ <!-- no translation found for battery_history_type_spinner:2 (188092590354892392) -->
+ <!-- no translation found for battery_history_type_spinner:3 (8414109131222049141) -->
+ <!-- no translation found for battery_history_type_spinner:4 (1327904325081257093) -->
+ <!-- no translation found for battery_history_type_spinner:5 (4832254146664706277) -->
+ <!-- no translation found for battery_history_which_spinner:0 (3451981114763440074) -->
+ <!-- no translation found for battery_history_which_spinner:1 (166936313535197598) -->
+ <!-- no translation found for battery_history_which_spinner:2 (4793941382744963893) -->
+ <string-array name="usage_stats_display_order_types">
+ <item>"Nutzungszeit"</item>
+ <item>"Startzähler"</item>
+ <item>"Name der Anwendung"</item>
+ </string-array>
+</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
new file mode 100644
index 0000000..68790d5
--- /dev/null
+++ b/res/values-de/strings.xml
@@ -0,0 +1,672 @@
+<?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">"Unbekannt"</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">"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>
+ <string name="radioInfo_menu_disableData">"Datenverbindung deaktivieren"</string>
+ <string name="radioInfo_menu_enableDataOnBoot">"Daten beim Start aktivieren"</string>
+ <string name="radioInfo_menu_disableDataOnBoot">"Daten beim Start deaktivieren"</string>
+ <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">"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>
+ <string name="radioInfo_phone_ringing">"Klingelton"</string>
+ <string name="radioInfo_phone_offhook">"Anruf wird getätigt"</string>
+ <string name="radioInfo_data_disconnected">"Nicht verbunden"</string>
+ <string name="radioInfo_data_connecting">"Verbindung wird hergestellt"</string>
+ <string name="radioInfo_data_connected">"Verbunden"</string>
+ <string name="radioInfo_data_suspended">"Angehalten"</string>
+ <string name="radioInfo_unknown">"unbekannt"</string>
+ <string name="radioInfo_display_packets">"Pakete"</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">"SD-Karte entnehmen"</string>
+ <string name="sdcard_format">"SD-Karte formatieren"</string>
+ <string name="small_font">"Klein"</string>
+ <string name="medium_font">"Mittel"</string>
+ <string name="large_font">"Groß"</string>
+ <string name="font_size_save">"OK"</string>
+ <string name="sdcard_setting">"SD-Karte"</string>
+ <string name="battery_info_status_label">"Akkustatus:"</string>
+ <string name="battery_info_scale_label">"Akkuanzeige:"</string>
+ <string name="battery_info_level_label">"Akkuladung:"</string>
+ <string name="battery_info_health_label">"Akkuzustand:"</string>
+ <string name="battery_info_technology_label">"Akkutechnologie:"</string>
+ <string name="battery_info_voltage_label">"Akkuspannung:"</string>
+ <string name="battery_info_voltage_units">"mV"</string>
+ <string name="battery_info_temperature_label">"Akkutemperatur:"</string>
+ <string name="battery_info_temperature_units">"° C"</string>
+ <string name="battery_info_uptime">"Zeit seit Start:"</string>
+ <string name="battery_info_awake_battery">"Aktivzeit bei Akku:"</string>
+ <string name="battery_info_awake_plugged">"Aktivzeit beim Laden:"</string>
+ <string name="battery_info_screen_on">"Display eingeschaltet:"</string>
+ <string name="battery_info_status_unknown">"Unbekannt"</string>
+ <string name="battery_info_status_charging">"Wird geladen"</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">"Entladung"</string>
+ <string name="battery_info_status_not_charging">"Wird nicht geladen"</string>
+ <string name="battery_info_status_full">"Voll"</string>
+ <string name="battery_info_health_unknown">"Unbekannt"</string>
+ <string name="battery_info_health_good">"OK"</string>
+ <string name="battery_info_health_overheat">"Überhitzung"</string>
+ <string name="battery_info_health_dead">"Leer"</string>
+ <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">"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>
+ <string name="bluetooth_device_name">"Gerätename"</string>
+ <string name="bluetooth_name_not_set">"Kein Name festgelegt, Kontoname wird verwendet"</string>
+ <string name="bluetooth_scan_for_devices">"Scannen nach Geräten"</string>
+ <string name="bluetooth_disconnect_blank">"Verbindung mit <xliff:g id="DEVICE_NAME">%1$s</xliff:g> wird getrennt."</string>
+ <string name="bluetooth_connected">"Verbunden"</string>
+ <string name="bluetooth_disconnected">"Nicht verbunden"</string>
+ <string name="bluetooth_disconnecting">"Verbindung wird getrennt..."</string>
+ <string name="bluetooth_connecting">"Verbindung wird hergestellt..."</string>
+ <!-- no translation found for bluetooth_unknown (1905151516611093010) -->
+ <skip />
+ <string name="bluetooth_not_connected">"Pairing mit diesem Gerät"</string>
+ <string name="bluetooth_pairing">"Pairing…"</string>
+ <!-- no translation found for bluetooth_paired (1247541089000057726) -->
+ <skip />
+ <string name="bluetooth_device">"Freisprechfunktion/Headset"</string>
+ <string name="progress_scanning">"Scannen..."</string>
+ <string name="bluetooth_notif_ticker">"Bluetooth-Pairing-Anfrage"</string>
+ <string name="bluetooth_notif_title">"Pairing-Anfrage"</string>
+ <string name="bluetooth_notif_message">"Zum Pairing auswählen "</string>
+ <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="choose_timezone">"Zeitzone auswählen"</string>
+ <string name="display_preview_label">"Vorschau:"</string>
+ <string name="display_font_size_label">"Schriftgröße:"</string>
+ <!-- no translation found for intent_sender_data_label (8363026381459131554) -->
+ <skip />
+ <string name="intent_sender_sendbroadcast_text">"<xliff:g id="BROADCAST">broadcast</xliff:g> senden"</string>
+ <string name="intent_sender_action_label">"<xliff:g id="ACTION">Action</xliff:g>:"</string>
+ <string name="intent_sender_startactivity_text">"<xliff:g id="ACTIVITY">activity</xliff:g> starten"</string>
+ <string name="intent_sender_resource_label">"<xliff:g id="RESOURCE">Resource</xliff:g>:"</string>
+ <string name="intent_sender_account_label">"Konto:"</string>
+ <string name="proxy_clear_text">"Löschen"</string>
+ <string name="proxy_port_label">"Port"</string>
+ <string name="proxy_defaultView_text">"Standard wiederherstellen"</string>
+ <string name="proxy_action_text">"Speichern"</string>
+ <string name="proxy_hostname_label">"Hostname"</string>
+ <string name="proxy_error">"Achtung"</string>
+ <string name="proxy_error_dismiss">"OK"</string>
+ <string name="proxy_error_invalid_host">"Der eingegebene Hostname ist ungültig."</string>
+ <string name="proxy_error_empty_port">"Sie müssen das Feld für den Port ausfüllen."</string>
+ <string name="proxy_error_empty_host_set_port">"Das Feld für den Port muss leer sein, wenn das Feld für den Host leer ist."</string>
+ <string name="proxy_error_invalid_port">"Der eingegebene Port ist ungültig."</string>
+ <string name="radio_info_signal_location_label">"Standort:"</string>
+ <string name="radio_info_neighboring_location_label">"Benachbarte CID:"</string>
+ <string name="radio_info_data_attempts_label">"Datenversuche:"</string>
+ <string name="radio_info_gprs_service_label">"GPRS-Service:"</string>
+ <string name="radio_info_roaming_label">"Roaming:"</string>
+ <string name="radio_info_imei_label">"IMEI:"</string>
+ <string name="radio_info_call_redirect_label">"Rufumleitung:"</string>
+ <string name="radio_info_ppp_resets_label">"Anzahl der PPP-Zurücksetzungen seit dem Start:"</string>
+ <string name="radio_info_gsm_disconnects_label">"GSM-Trennungen:"</string>
+ <string name="radio_info_current_network_label">"Aktuelles Netzwerk:"</string>
+ <string name="radio_info_data_successes_label">"Datenerfolge:"</string>
+ <string name="radio_info_ppp_received_label">"PPP empfangen:"</string>
+ <string name="radio_info_gsm_service_label">"GSM-Service"</string>
+ <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">"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>
+ <string name="radio_info_network_type_label">"Netzwerktyp:"</string>
+ <string name="radio_info_set_perferred_label">"Bevorzugten Netzwerktyp festlegen:"</string>
+ <string name="radio_info_ping_ipaddr">"IP-Adresse pingen:"</string>
+ <string name="radio_info_ping_hostname">"Hostnamen pingen (www.google.com):"</string>
+ <string name="radio_info_http_client_test">"HTTP Client-Test:"</string>
+ <string name="radio_info_toggle_ciph_label">"Verschlüsselung wechseln"</string>
+ <string name="ping_test_label">"Pingtest ausführen"</string>
+ <string name="radio_info_smsc_label">"SMSC:"</string>
+ <string name="radio_info_smsc_update_label">"Aktualisierung"</string>
+ <string name="radio_info_smsc_refresh_label">"Aktualisieren"</string>
+ <string name="radio_info_toggle_dns_check_label">"DNS-Überprüfung ein-/ausschalten"</string>
+ <string name="band_mode_title">"GSM-/UMTS-Band festlegen"</string>
+ <string name="band_mode_loading">"Bandliste wird geladen..."</string>
+ <string name="band_mode_set">"Festlegen"</string>
+ <string name="band_mode_failed">"Fehlgeschlagen"</string>
+ <string name="band_mode_succeeded">"Erfolgreich"</string>
+ <string name="sdcard_changes_instructions">"Die Änderungen werden nach dem erneuten Anschließen des USB-Kabels übernommen."</string>
+ <string name="sdcard_settings_screen_mass_storage_text">"USB-Massenspeicher aktivieren"</string>
+ <string name="sdcard_settings_total_bytes_label">"Bytes insgesamt:"</string>
+ <string name="sdcard_settings_not_present_status">"Keine SD-Karte"</string>
+ <string name="sdcard_settings_available_bytes_label">"Verfügbare Bytes:"</string>
+ <string name="sdcard_settings_mass_storage_status">"SD-Karte wird als Massenspeichergerät verwendet"</string>
+ <string name="sdcard_settings_unmounted_status">"Die SD-Karte kann jetzt entfernt werden."</string>
+ <string name="sdcard_settings_bad_removal_status">"Die SD-Karte wurde während der Verwendung entfernt!"</string>
+ <string name="sdcard_settings_used_bytes_label">"Verwendete Bytes:"</string>
+ <string name="sdcard_settings_scanning_status">"SD-Karte wird auf Medien gescannt..."</string>
+ <string name="sdcard_settings_read_only_status">"SD-Karte schreibgeschützt aktiviert"</string>
+ <string name="next_label">"Weiter"</string>
+ <string name="language_picker_title">"Sprache"</string>
+ <string name="select_your_language">"Sprache auswählen"</string>
+ <string name="activity_picker_label">"Aktion auswählen"</string>
+ <string name="device_info_label">"Geräteinfo"</string>
+ <string name="battery_info_label">"Akkuinfo"</string>
+ <string name="battery_history_label">"Akkuprotokoll"</string>
+ <string name="display_label">"Display"</string>
+ <string name="phone_info_label">"Telefoninfo"</string>
+ <string name="sd_card_settings_label">"SD-Karte"</string>
+ <string name="proxy_settings_label">"Proxy-Einstellungen"</string>
+ <string name="cancel">"Abbrechen"</string>
+ <string name="settings_label">"Einstellungen"</string>
+ <string name="airplane_mode">"Flugmodus"</string>
+ <string name="airplane_mode_summary">"Alle drahtlosen Verbindungen deaktivieren"</string>
+ <string name="airplane_mode_turning_on">"Wireless-Verbindungen werden deaktiviert..."</string>
+ <string name="airplane_mode_turning_off">"Wireless-Verbindungen werden aktiviert..."</string>
+ <string name="radio_controls_title">"Wireless"</string>
+ <string name="radio_controls_summary">"WLAN, Bluetooth, Flugmodus und mobile Netzwerke verwalten"</string>
+ <string name="date_and_time_settings_title">"Datum und Uhrzeit"</string>
+ <string name="date_and_time_settings_summary">"Datum, Uhrzeit, Zeitzone und Formate festlegen"</string>
+ <string name="date_time_auto">"Automatisch"</string>
+ <string name="date_time_auto_summaryOn">"Vom Netzwerk bereitgestellte Werte verwenden"</string>
+ <string name="date_time_auto_summaryOff">"Vom Netzwerk bereitgestellte Werte verwenden"</string>
+ <string name="date_time_24hour">"24-Stunden-Format"</string>
+ <string name="date_time_set_time">"Uhrzeit festlegen"</string>
+ <string name="date_time_set_timezone">"Zeitzone auswählen"</string>
+ <string name="date_time_set_date">"Datum festlegen"</string>
+ <string name="date_time_date_format">"Datumsformat auswählen"</string>
+ <string name="zone_list_menu_sort_alphabetically">"Alphabetisch sortieren"</string>
+ <string name="zone_list_menu_sort_by_timezone">"Nach Zeitzone sortieren"</string>
+ <string name="security_settings_title">"Sicherheit und Standort"</string>
+ <string name="security_settings_summary">"Meinen Standort, Display-Entsperrung und SIM-Kartensperrung festlegen"</string>
+ <string name="security_passwords_title">"Passwörter"</string>
+ <string name="bluetooth_quick_toggle_title">"Bluetooth"</string>
+ <string name="bluetooth_quick_toggle_summary">"Bluetooth aktivieren"</string>
+ <string name="bluetooth_settings">"Bluetooth-Einstellungen"</string>
+ <string name="bluetooth_settings_title">"Bluetooth-Einstellungen"</string>
+ <string name="bluetooth_settings_summary">"Verbindungen, Gerätenamen und Erkennbarkeit verwalten"</string>
+ <string name="bluetooth_pin_entry">"Bluetooth-Pairing-Anfrage"</string>
+ <string name="bluetooth_device_info">"Bluetooth-Geräteinfo"</string>
+ <string name="bluetooth_enter_pin_msg">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"\n\n"PIN für Pairing eingeben."\n"(Versuchen Sie 0000 oder 1234.)"</string>
+ <string name="bluetooth_error_title">"Achtung"</string>
+ <string name="bluetooth_pairing_error_message">"Beim Pairing mit <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ist ein Problem aufgetreten."</string>
+ <string name="bluetooth_pairing_pin_error_message">"Beim Pairing mit <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ist ein Problem aufgetreten, da die eingegebene PIN falsch ist."</string>
+ <string name="bluetooth_connecting_error_message">"Beim Verbindungsaufbau mit <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ist ein Problem aufgetreten."</string>
+ <string name="bluetooth_preference_scan_title">"Scan nach Geräten"</string>
+ <string name="bluetooth_device_context_connect">"Verbinden"</string>
+ <string name="bluetooth_device_context_disconnect">"Verbindung trennen"</string>
+ <string name="bluetooth_device_context_pair_connect">"Paaren und verbinden"</string>
+ <string name="bluetooth_device_context_unpair">"Pairing aufheben"</string>
+ <string name="bluetooth_device_context_disconnect_unpair">"Verbindung trennen und Pairing aufheben"</string>
+ <string name="bluetooth_device_context_connect_advanced">"Optionen..."</string>
+ <string name="bluetooth_connect_specific_profiles_title">"Verbinden mit..."</string>
+ <string name="bluetooth_profile_a2dp">"Medien"</string>
+ <string name="bluetooth_profile_headset">"Telefon"</string>
+ <string name="bluetooth_summary_connected_to_a2dp">"Verbunden mit Audiosystem von Medien"</string>
+ <string name="bluetooth_summary_connected_to_headset">"Verbunden mit Audiosystem des Telefons"</string>
+ <string name="bluetooth_summary_connected_to_a2dp_headset">"Verbunden mit Audiosystem von Telefon und Medien"</string>
+ <string name="bluetooth_device_advanced_title">"Optionen von <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_device_advanced_online_mode_title">"Verbinden"</string>
+ <string name="bluetooth_device_advanced_online_mode_summary">"Mit Bluetooth-Gerät verbinden"</string>
+ <string name="bluetooth_device_advanced_profile_header_title">"Profile"</string>
+ <string name="bluetooth_a2dp_profile_summary_connected">"Verbunden mit Audiosystem von Medien"</string>
+ <string name="bluetooth_headset_profile_summary_connected">"Verbunden mit Audiosystem des Telefons"</string>
+ <string name="bluetooth_a2dp_profile_summary_use_for">"Für Audiosystem von Medien verwenden"</string>
+ <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">"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>
+ <string name="forget_network">"Entfernen"</string>
+ <string name="wifi_status">"Status"</string>
+ <string name="wifi_link_speed">"Geschwindigkeit"</string>
+ <string name="wifi_signal_3">"Ausgezeichnet"</string>
+ <string name="wifi_signal_2">"OK"</string>
+ <string name="wifi_signal_1">"Gut"</string>
+ <string name="wifi_signal_0">"Schwach"</string>
+ <string name="security">"Sicherheit"</string>
+ <string name="wifi_security_open">"Öffnen"</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">"Unbekannt"</string>
+ <string name="wifi_security_verbose_open">"Offenes Netzwerk"</string>
+ <string name="wifi_security_verbose_wep">"Gesichert mit WEP"</string>
+ <string name="wifi_security_verbose_wpa">"Gesichert mit WPA"</string>
+ <string name="wifi_security_verbose_wpa2">"Gesichert mit WPA2"</string>
+ <string name="ip_address">"IP-Adresse"</string>
+ <string name="signal">"Signalstärke"</string>
+ <string name="wifi_starting">"Aktivierung..."</string>
+ <string name="wifi_stopping">"Wird beendet..."</string>
+ <string name="wifi_error">"Fehler"</string>
+ <string name="error_starting">"WLAN kann nicht gestartet werden"</string>
+ <string name="error_stopping">"WLAN kann nicht beendet werden"</string>
+ <string name="error_scanning">"Netzwerkscan nicht möglich"</string>
+ <string name="error_connecting">"Netzwerkverbindung kann nicht hergestellt werden"</string>
+ <string name="error_saving">"Netzwerk kann nicht gespeichert werden"</string>
+ <string name="connect">"Verbinden"</string>
+ <string name="connect_to_blank">"Mit <xliff:g id="NETWORK_NAME">%1$s</xliff:g> verbinden"</string>
+ <string name="please_type_passphrase">"Passwort für Wireless-Zugang"</string>
+ <string name="please_type_hex_key">"WEP Hexadezimalschlüssel (0-9, A-F)"</string>
+ <string name="wifi_show_password">"Passwort anzeigen"</string>
+ <string name="scan_wifi">"Scannen"</string>
+ <string name="summary_not_in_range">"Nicht in Reichweite"</string>
+ <string name="summary_remembered">"Gespeichert"</string>
+ <string name="summary_connection_failed">"Verbindung fehlgeschlagen, versuchen Sie es erneut."</string>
+ <string name="wifi_access_points">"WLAN-Netzwerke"</string>
+ <string name="wifi_type_ssid">"Netzwerk-SSID"</string>
+ <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">"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>
+ <string name="wifi_generic_connection_error">"Beim Herstellen der Netzwerkverbindung ist ein Problem aufgetreten. Bitte versuchen Sie es erneut."</string>
+ <string name="wifi_menu_advanced">"Erweitert"</string>
+ <string name="wifi_ip_settings_titlebar">"IP-Einstellungen"</string>
+ <string name="wifi_ip_settings_menu_save">"Speichern"</string>
+ <string name="wifi_ip_settings_menu_cancel">"Abbrechen"</string>
+ <string name="wifi_ip_settings_invalid_ip">"Bitte geben Sie eine gültige IP-Adresse ein."</string>
+ <string name="wifi_use_static_ip">"Statische IP verwenden"</string>
+ <string name="wifi_ip_address">"IP-Adresse"</string>
+ <string name="wifi_dns1">"DNS 1"</string>
+ <string name="wifi_dns2">"DNS 2"</string>
+ <string name="wifi_gateway">"Gateway"</string>
+ <string name="wifi_netmask">"Netmask"</string>
+ <string name="wifi_context_menu_connect">"Mit Netzwerk verbinden"</string>
+ <string name="wifi_context_menu_forget">"Netzwerk entfernen"</string>
+ <string name="wifi_context_menu_change_password">"Passwort ändern"</string>
+ <string name="wifi_advanced_titlebar">"Erweitert"</string>
+ <string name="wifi_setting_num_channels_title">"Rechtliche Domain"</string>
+ <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">"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>
+ <string name="fragment_status_connecting">"Verbindung mit <xliff:g id="NETWORK_NAME">%1$s</xliff:g> wird hergestellt..."</string>
+ <string name="fragment_status_authenticating">"Authentifizierung mit <xliff:g id="NETWORK_NAME">%1$s</xliff:g>..."</string>
+ <string name="fragment_status_obtaining_ip">"IP-Adresse wird von <xliff:g id="NETWORK_NAME">%1$s</xliff:g> abgerufen..."</string>
+ <string name="fragment_status_connected">"Verbunden mit <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+ <string name="fragment_status_disconnecting">"Verbindung mit <xliff:g id="NETWORK_NAME">%1$s</xliff:g> wird getrennt..."</string>
+ <string name="fragment_status_disconnected">"Nicht verbunden"</string>
+ <string name="fragment_status_failed">"Fehlgeschlagen"</string>
+ <string name="status_scanning">"Scannen…"</string>
+ <string name="status_connecting">"Verbindung wird hergestellt..."</string>
+ <string name="status_authenticating">"Authentifizierung..."</string>
+ <string name="status_obtaining_ip">"Adresse wird abgerufen..."</string>
+ <string name="status_connected">"Verbunden"</string>
+ <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">"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>
+ <string name="silent_mode_summary">"Alle Töne außer für Medien und Warnungen sind stummgeschaltet"</string>
+ <string name="ringtone_title">"Klingelton"</string>
+ <string name="ringtone_summary">"Standardklingelton für eingehende Anrufe festlegen"</string>
+ <string name="ring_volume_title">"Klingeltonlautstärke"</string>
+ <string name="ring_volume_summary">"Lautstärke für eingehende Anrufe und Benachrichtigungen festlegen"</string>
+ <string name="vibrate_title">"Vibration"</string>
+ <string name="vibrate_summary">"Vibration für eingehende Anrufe"</string>
+ <string name="notification_sound_title">"Benachrichtigungston"</string>
+ <string name="notification_sound_summary">"Standard-Benachrichtigungston festlegen"</string>
+ <string name="incoming_call_volume_title">"Lautstärke für eingehende Anrufe"</string>
+ <string name="notification_volume_title">"Benachrichtigungslautstärke"</string>
+ <string name="checkbox_notification_same_as_incoming_call">"Lautstärke für eingehende Anrufe für Benachrichtigungen verwenden"</string>
+ <string name="notification_sound_dialog_title">"Benachrichtigungston auswählen"</string>
+ <string name="media_volume_title">"Medienlautstärke"</string>
+ <string name="media_volume_summary">"Lautstärke für Musik und Videos festlegen"</string>
+ <string name="dtmf_tone_enable_title">"Tastentöne"</string>
+ <string name="dtmf_tone_enable_summary_on">"Töne bei Telefonwahl"</string>
+ <string name="dtmf_tone_enable_summary_off">"Töne bei Telefonwahl"</string>
+ <string name="sound_effects_enable_title">"Akustische Auswahl"</string>
+ <string name="sound_effects_enable_summary_on">"Ton bei Auswahl auf Display"</string>
+ <string name="sound_effects_enable_summary_off">"Ton bei Auswahl auf Display"</string>
+ <string name="play_media_notification_sounds_enable_title">"SD-Karten-Benachrichtigungen"</string>
+ <string name="play_media_notification_sounds_enable_summary_on">"SD-Karten-Benachrichtigungston deaktivieren"</string>
+ <string name="play_media_notification_sounds_enable_summary_off">"SD-Karten-Benachrichtigungston aktivieren"</string>
+ <string name="sync_settings">"Datensynchronisierung"</string>
+ <string name="sync_settings_summary">"Auswählen, welche Anwendungen synchronisiert werden"</string>
+ <string name="display_settings">"Display-Einstellungen"</string>
+ <string name="animations_title">"Animation"</string>
+ <string name="animations_summary_on">"Animation beim Öffnen/Schließen von Fenstern anzeigen"</string>
+ <string name="animations_summary_off">"Animation beim Öffnen/Schließen von Fenstern anzeigen"</string>
+ <string name="brightness">"Helligkeit"</string>
+ <string name="brightness_summary">"Helligkeit des Bildschirms anpassen"</string>
+ <string name="screen_timeout">"Display-Timeout"</string>
+ <string name="screen_timeout_summary">"Verzögerung vor automatischer Bildschirmabschaltung anpassen"</string>
+ <string name="sim_lock_settings">"Einstellungen"</string>
+ <string name="sim_lock_settings_category">"SIM-Kartensperrung einrichten"</string>
+ <string name="sim_lock_settings_title">"SIM-Kartensperrung"</string>
+ <string name="sim_pin_toggle">"SIM-Karte sperren"</string>
+ <string name="sim_lock_on">"PIN zur Verwendung des Telefons erforderlich"</string>
+ <string name="sim_lock_off">"PIN zur Verwendung des Telefons erforderlich"</string>
+ <string name="sim_pin_change">"PIN der SIM-Karte ändern"</string>
+ <string name="sim_enter_pin">"PIN für SIM-Karte"</string>
+ <string name="sim_enable_sim_lock">"SIM-Karte sperren"</string>
+ <string name="sim_disable_sim_lock">"SIM-Karte entsperren"</string>
+ <string name="sim_enter_old">"Alte PIN der SIM-Karte"</string>
+ <string name="sim_enter_new">"Neue PIN für SIM-Karte"</string>
+ <string name="sim_reenter_new">"Neue PIN erneut eingeben"</string>
+ <string name="sim_change_pin">"PIN für SIM-Karte"</string>
+ <string name="sim_bad_pin">"Falsche PIN!"</string>
+ <string name="sim_pins_dont_match">"Die PINs stimmen nicht überein!"</string>
+ <string name="sim_change_failed">"PIN kann nicht geändert werden."\n"Möglicherweise falsche Eingabe."</string>
+ <string name="sim_change_succeeded">"SIM-PIN erfolgreich geändert"</string>
+ <string name="sim_lock_failed">"Status der SIM-Kartensperrung kann nicht geändert werden."\n"Möglicherweise falsche PIN."</string>
+ <string name="sim_enter_ok">"OK"</string>
+ <string name="sim_enter_cancel">"Abbrechen"</string>
+ <string name="device_info_settings">"Telefonstatus"</string>
+ <string name="system_update_settings_list_item_title">"Systemaktualisierungen"</string>
+ <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">"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>
+ <string name="device_status_activity_title">"Status"</string>
+ <string name="device_status">"Status"</string>
+ <string name="device_status_summary">"IMEI, Telefonnummer, Signal usw."</string>
+ <string name="storage_settings_title">"SD-Karte und Speicher"</string>
+ <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">"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>
+ <string name="status_operator">"Netzwerk"</string>
+ <string name="status_wifi_mac_address">"WLAN-MAC-Adresse"</string>
+ <string name="status_bt_address">"Bluetooth-Adresse"</string>
+ <string name="status_unavailable">"Nicht verfügbar"</string>
+ <string name="status_network_traffic_stats">"Netzwerknutzung"</string>
+ <string name="status_network_traffic_summary">"Gesendet: \n<xliff:g id="NETWORK_TRAFFIC_0">%1$d packets, %2$d bytes%n</xliff:g>Erhalt: <xliff:g id="NETWORK_TRAFFIC_1">%3$d packets, %4$d bytes</xliff:g>"</string>
+ <string name="status_up_time">"Betriebszeit"</string>
+ <string name="status_awake_time">"Aktivzeit"</string>
+ <string name="internal_memory">"Interner Telefonspeicher"</string>
+ <string name="sd_memory">"SD-Karte"</string>
+ <string name="memory_available">"Verfügbarer Speicher"</string>
+ <string name="memory_size">"Gesamtspeicher"</string>
+ <string name="sd_eject">"SD-Karte entnehmen"</string>
+ <string name="sd_eject_summary">"SD-Karte vorsichtig entnehmen"</string>
+ <string name="sd_format">"SD-Karte formatieren"</string>
+ <string name="sd_format_summary">"SD-Karte formatieren (löschen)"</string>
+ <string name="sd_unavailable">"Nicht verfügbar"</string>
+ <string name="read_only">" (schreibgeschützt)"</string>
+ <string name="battery_status_title">"Akkustatus"</string>
+ <string name="battery_level_title">"Akkuladung"</string>
+ <string name="apn_settings">"APNs"</string>
+ <string name="apn_edit">"Zugangspunkt bearbeiten"</string>
+ <string name="apn_not_set">"Nicht festgelegt"</string>
+ <string name="apn_name">"Name"</string>
+ <string name="apn_apn">"APN"</string>
+ <string name="apn_http_proxy">"Proxy"</string>
+ <string name="apn_http_port">"Port"</string>
+ <string name="apn_user">"Nutzername"</string>
+ <string name="apn_password">"Passwort"</string>
+ <string name="apn_server">"Server"</string>
+ <string name="apn_mmsc">"MMSC"</string>
+ <string name="apn_mms_proxy">"MMS-Proxy"</string>
+ <string name="apn_mms_port">"MMS-Port"</string>
+ <string name="apn_mcc">"MCC"</string>
+ <string name="apn_mnc">"MNC"</string>
+ <string name="apn_type">"APN-Typ"</string>
+ <string name="menu_delete">"APN löschen"</string>
+ <string name="menu_new">"Neuer APN"</string>
+ <string name="menu_save">"Speichern"</string>
+ <string name="menu_cancel">"Verwerfen"</string>
+ <string name="error_title">"Achtung"</string>
+ <string name="error_name_empty">"Das Namensfeld darf nicht leer sein."</string>
+ <string name="error_apn_empty">"Der APN darf nicht leer sein."</string>
+ <string name="error_mcc_not3">"Das MCC-Feld muss 3 Zeichen enthalten."</string>
+ <string name="error_mnc_not23">"Das MNC-Feld muss 2 oder 3 Zeichen enthalten."</string>
+ <string name="master_clear_title">"Auf Werkszustand zurück"</string>
+ <string name="master_clear_summary">"Löscht alle Daten auf dem Telefon"</string>
+ <string name="master_clear_desc">"Durch diese Aktion wird das Telefon auf den Werkszustand zurückgesetzt. Alle Daten und heruntergeladenen Anwendungen werden gelöscht!"</string>
+ <string name="master_clear_button_text">"Telefon zurücksetzen"</string>
+ <string name="master_clear_final_desc">"Telefon zurücksetzen und alle Ihre Daten und Anwendungen löschen? Die Aktion kann nicht rückgängig gemacht werden!"</string>
+ <string name="master_clear_final_button_text">"Alles löschen"</string>
+ <string name="master_clear_gesture_prompt">"Bitte zeichnen Sie Ihr Entsperrungsmuster."</string>
+ <string name="master_clear_gesture_explanation">"Sie müssen Ihr Entsperrungsmuster eingeben, um das Zurücksetzen des Telefons zu bestätigen."</string>
+ <string name="master_clear_failed">"Die Zurücksetzung konnte nicht durchgeführt werden, da der Service zur Systembereinigung nicht verfügbar ist."</string>
+ <string name="media_format_title">"SD-Karte formatieren."</string>
+ <string name="media_format_summary">"Löscht alle Daten auf der SD-Karte"</string>
+ <string name="media_format_desc">"Durch diese Aktion wird die SD-Karte im Telefon gelöscht. Sie verlieren dann ALLE Daten auf der Karte!"</string>
+ <string name="media_format_button_text">"SD-Karte formatieren"</string>
+ <string name="media_format_final_desc">"SD-Karte formatieren und alle Medien löschen? Die Aktion kann nicht rückgängig gemacht werden!"</string>
+ <string name="media_format_final_button_text">"Alles löschen"</string>
+ <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, 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>
+ <string name="location_network_based">"Wireless nutzen"</string>
+ <string name="location_networks_disabled">"Standort über Wireless-Netzwerke anzeigen (z.B. in Google Maps)"</string>
+ <string name="location_neighborhood_level">"Standort bestimmt von WLAN und/oder mobilen Netzwerken"</string>
+ <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="about_settings">"Telefoninfo"</string>
+ <string name="about_settings_summary">"Rechtliche Hinweise, Telefonstatus und Softwareversion anzeigen"</string>
+ <string name="legal_information">"Rechtliche Hinweise"</string>
+ <string name="contributors_title">"Mitwirkende"</string>
+ <string name="copyright_title">"Urheberrecht"</string>
+ <string name="license_title">"Lizenz"</string>
+ <string name="terms_title">"Nutzungsbedingungen"</string>
+ <string name="settings_license_activity_title">"Open Source-Lizenzen"</string>
+ <string name="settings_license_activity_unavailable">"Beim Laden der Lizenzen ist ein Problem aufgetreten."</string>
+ <string name="settings_license_activity_loading">"Wird geladen..."</string>
+ <string name="lock_settings_title">"Display-Entsperrungsmuster"</string>
+ <string name="lockpattern_change_lock_pattern_label">"Entsperrungsmuster ändern"</string>
+ <string name="lockpattern_need_to_unlock">"Gespeichertes Muster bestätigen"</string>
+ <string name="lockpattern_need_to_unlock_wrong">"Versuchen Sie es bitte erneut:"</string>
+ <string name="lockpattern_recording_intro_header">"Zeichnen Sie ein Entsperrungsmuster."</string>
+ <string name="lockpattern_recording_intro_footer">"Menütaste drücken, um die Hilfe aufzurufen"</string>
+ <string name="lockpattern_recording_inprogress">"Lassen Sie die Tasten los, wenn Sie fertig sind."</string>
+ <string name="lockpattern_recording_incorrect_too_short">"Verbinden Sie mindestens <xliff:g id="NUMBER">%d</xliff:g> Punkte. Versuchen Sie es erneut:"</string>
+ <string name="lockpattern_pattern_entered_header">"Muster wurde aufgezeichnet!"</string>
+ <string name="lockpattern_need_to_confirm">"Zeichnen Sie das Muster zur Bestätigung erneut:"</string>
+ <string name="lockpattern_pattern_confirmed_header">"Ihr neues Entsperrungsmuster:"</string>
+ <string name="lockpattern_confirm_button_text">"Bestätigen"</string>
+ <string name="lockpattern_restart_button_text">"Neu aufzeichnen"</string>
+ <string name="lockpattern_retry_button_text">"Erneut versuchen"</string>
+ <string name="lockpattern_continue_button_text">"Weiter"</string>
+ <string name="lockpattern_settings_title">"Entsperrungsmuster"</string>
+ <string name="lockpattern_settings_enable_title">"Muster erforderlich"</string>
+ <string name="lockpattern_settings_enable_summary">"Zum Entsperren muss ein Muster gezeichnet werden"</string>
+ <string name="lockpattern_settings_enable_visible_pattern_title">"Muster sichtbar"</string>
+ <string name="lockpattern_settings_enable_tactile_feedback_title">"Haptisches Feedback verwenden"</string>
+ <string name="lockpattern_settings_choose_lock_pattern">"Entsperrungsmuster"</string>
+ <string name="lockpattern_settings_change_lock_pattern">"Muster ändern"</string>
+ <string name="lockpattern_settings_help_how_to_record">"Zeichnen eines Entsperrungsmusters"</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_header">"Zu viele fehlgeschlagene Versuche!"</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_footer">"In <xliff:g id="NUMBER">%d</xliff:g> Sekunden erneut versuchen."</string>
+ <string name="skip_button_label">"Abbrechen"</string>
+ <string name="next_button_label">"Weiter"</string>
+ <string name="lock_title">"Sichern Ihres Telefons"</string>
+ <string name="lock_intro_message"><font size="17">"Schützen Sie Ihr Telefon vor unerlaubter Verwendung, indem Sie ein persönliches Entsperrungsmuster erstellen. "\n<font height="17">\n</font><b>"1"</b>"  Auf dem nächsten Bildschirm sehen Sie, wie ein Beispielmuster gezeichnet wird. "\n<font height="17">\n</font><b>"2"</b>"  Anschließend können Sie Ihr eigenes Entsperrungsmuster aufzeichnen. Sie können verschiedene Muster ausprobieren, müssen jedoch immer mindestens vier Punkte miteinander verbinden. "\n<font height="17">\n</font><b>"3"</b>"  Zeichnen Sie Ihr Muster zur Bestätigung erneut. "\n<font height="17">\n</font><b>"Bereit? Wählen Sie “Weiter”"</b>". "\n<font height="3">\n</font>"Wählen Sie “Abbrechen”, wenn Sie Ihr Telefon nicht schützen möchten."</font></string>
+ <string name="lock_example_title">"Beispielmuster"</string>
+ <string name="lock_example_message">"Verbinden Sie mindestens vier Punkte."\n" "\n"Wählen Sie \"Weiter\", um ein eigenes Muster aufzuzeichnen."</string>
+ <string name="manageapplications_settings_title">"Anwendungen verwalten"</string>
+ <string name="manageapplications_settings_summary">"Installierte Anwendungen verwalten und entfernen"</string>
+ <string name="applications_settings">"Anwendungen"</string>
+ <string name="applications_settings_summary">"Anwendungen verwalten, Tastenkombinationen für Schnellstart einrichten"</string>
+ <string name="applications_settings_header">"Anwendungen"</string>
+ <string name="install_applications">"Unbekannte Quellen"</string>
+ <string name="install_unknown_applications">"Installation von Nicht-Market-Anwendungen zulassen"</string>
+ <string name="install_all_warning">"Anwendungen aus unbekannten Quellen können gefährlich für Ihr Telefon und Ihre persönlichen Daten sein. Sie stimmen zu, dass Sie die Verantwortung für alle Schäden an Ihrem Telefon oder jegliche Datenverluste tragen, die aus der Verwendung dieser Anwendungen entstehen können."</string>
+ <string name="application_info_label">"Anwendungsinfo"</string>
+ <string name="storage_label">"Speicher"</string>
+ <string name="auto_launch_label">"Standardmäßig starten"</string>
+ <string name="permissions_label">"Berechtigungen"</string>
+ <string name="cache_header_label">"Cache"</string>
+ <string name="clear_cache_btn_text">"Cache löschen"</string>
+ <string name="cache_size_label">"Cache"</string>
+ <string name="controls_label">"Steuerung"</string>
+ <string name="force_stop">"Stoppen erzwingen"</string>
+ <string name="total_size_label">"Insgesamt"</string>
+ <string name="application_size_label">"Anwendung"</string>
+ <string name="data_size_label">"Daten"</string>
+ <string name="uninstall_text">"Deinstallieren"</string>
+ <string name="clear_user_data_text">"Daten löschen"</string>
+ <string name="auto_launch_enable_text">"Sie haben diese Anwendung für einige Aktionen als Standard festgelegt."</string>
+ <string name="auto_launch_disable_text">"Kein Standard"</string>
+ <string name="clear_activities">"Standardeinstellungen löschen"</string>
+ <string name="unknown">"Unbekannt"</string>
+ <string name="sort_order_alpha">"Sortieren"</string>
+ <string name="sort_order_size">"Nach Größe sortieren"</string>
+ <string name="manage_space_text">"Speicherplatz verwalten"</string>
+ <string name="filter">"Filter"</string>
+ <string name="filter_dlg_title">"Filteroptionen auswählen"</string>
+ <string name="filter_apps_all">"Alle"</string>
+ <string name="filter_apps_third_party">"Drittanbieter"</string>
+ <string name="filter_apps_running">"Wird ausgeführt"</string>
+ <string name="loading">"Wird geladen..."</string>
+ <string name="recompute_size">"Größe wird neu berechnet..."</string>
+ <string name="clear_data_dlg_title">"Löschen"</string>
+ <string name="clear_data_dlg_text">"Alle in dieser Anwendung gespeicherten Informationen werden endgültig gelöscht."</string>
+ <string name="dlg_ok">"OK"</string>
+ <string name="dlg_cancel">"Abbrechen"</string>
+ <string name="app_not_found_dlg_title">"Anwendung nicht gefunden"</string>
+ <string name="app_not_found_dlg_text">"Diese Anwendung wurde in der Liste der installierten Anwendungen nicht gefunden."</string>
+ <string name="clear_data_failed">"Anwendungsdaten können nicht gelöscht werden."</string>
+ <string name="security_settings_desc">"Diese Anwendung kann auf die folgenden Funktionen Ihres Telefons zugreifen:"</string>
+ <string name="computing_size">"Berechnung..."</string>
+ <string name="invalid_size_value">"Paketgröße kann nicht berechnet werden"</string>
+ <string name="empty_list_msg">"Sie haben keine Anwendungen von Drittanbietern installiert."</string>
+ <string name="language_settings">"Gebietsschema und Text"</string>
+ <string name="language_settings_summary">"Optionen für Gebietsschema (Sprache und Region), Texteingabe und Autokorrektur festlegen"</string>
+ <string name="language_category">"Ländereinstellung"</string>
+ <string name="text_category">"Texteinstellungen"</string>
+ <string name="phone_language">"Sprache wählen"</string>
+ <string name="phone_language_summary">"Sprache und Region auswählen"</string>
+ <string name="auto_replace">"Autom. Ersetzung"</string>
+ <string name="auto_replace_summary">"Tippfehler korrigieren"</string>
+ <string name="auto_caps">"Autom. Großschreibung"</string>
+ <string name="auto_caps_summary">"Jeden Satz mit einem Großbuchstaben beginnen"</string>
+ <string name="auto_punctuate">"Autom. Zeichensetzung"</string>
+ <string name="hardkeyboard_category">"Einstellungen für physische Tastatur"</string>
+ <string name="auto_punctuate_summary">"Leertaste zweimal drücken, um \".\" hinzuzufügen"</string>
+ <string name="show_password">"Sichtbare Passwörter"</string>
+ <string name="show_password_summary">"Passwort bei der Eingabe anzeigen"</string>
+ <string name="user_dict_settings_titlebar">"Wörterbuch des Nutzers"</string>
+ <string name="user_dict_settings_title">"Wörterbuch des Nutzers"</string>
+ <string name="user_dict_settings_summary">"Hinzufügen &amp; Entfernen von Wörtern im Wörterbuch des Nutzers"</string>
+ <string name="user_dict_settings_add_menu_title">"Hinzufügen"</string>
+ <string name="user_dict_settings_add_dialog_title">"Zum Wörterbuch hinzufügen"</string>
+ <string name="user_dict_settings_context_menu_edit_title">"Bearbeiten"</string>
+ <string name="user_dict_settings_context_menu_delete_title">"Löschen"</string>
+ <string name="user_dict_settings_empty_text">"Sie haben keine Wörter im Nutzerwörterbuch. Sie können über das Menü ein Wort hinzufügen."</string>
+ <string name="testing">"Test"</string>
+ <string name="testing_phone_info">"Telefoninformation"</string>
+ <string name="testing_battery_info">"Akkuinformationen"</string>
+ <string name="testing_battery_history">"Akkuprotokoll"</string>
+ <string name="quick_launch_title">"Schnellstart"</string>
+ <string name="quick_launch_summary">"Tastenkombinationen zum Starten von Anwendungen festlegen"</string>
+ <string name="quick_launch_assign_application">"Anwendung zuweisen"</string>
+ <string name="quick_launch_no_shortcut">"Keine Tastenkombination"</string>
+ <string name="quick_launch_shortcut">"Suchen + <xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g>"</string>
+ <string name="quick_launch_clear_dialog_title">"Löschen"</string>
+ <string name="quick_launch_clear_dialog_message">"Die Tastenkombination für <xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g> (<xliff:g id="APPLICATION_NAME">%2$s</xliff:g>) wird gelöscht."</string>
+ <string name="quick_launch_clear_ok_button">"OK"</string>
+ <string name="quick_launch_clear_cancel_button">"Abbrechen"</string>
+ <string name="quick_launch_display_mode_applications">"Anwendungen"</string>
+ <string name="quick_launch_display_mode_shortcuts">"Tastenkombinationen"</string>
+ <string name="input_methods_settings_title">"Texteingabe"</string>
+ <string name="input_methods_settings_summary">"Optionen für Texteingabe verwalten"</string>
+ <string name="input_methods_settings_label_format">"%s Einstellungen"</string>
+ <string name="development_settings_title">"Entwicklung"</string>
+ <string name="development_settings_summary">"Optionen zur Anwendungsentwicklung festlegen"</string>
+ <string name="enable_adb">"USB-Debugging"</string>
+ <string name="enable_adb_summary">"Debugmodus bei Anschluss eines USB-Geräts"</string>
+ <string name="keep_screen_on">"Aktiv bleiben"</string>
+ <string name="keep_screen_on_summary">"Display wird beim Laden nie in den Ruhezustand versetzt"</string>
+ <string name="allow_mock_location">"Falsche Standorte zulassen"</string>
+ <string name="allow_mock_location_summary">"Falsche Standorte zulassen"</string>
+ <!-- no translation found for gadget_picker_title (98374951396755811) -->
+ <skip />
+ <!-- no translation found for widget_picker_title (9130684134213467557) -->
+ <skip />
+ <string name="battery_history_details_for">"Details für UID %d"</string>
+ <string name="battery_history_uid">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
+ <string name="battery_history_network_usage">"Netzwerk-Nutzungsdetails für <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
+ <string name="battery_history_bytes_received">"Empfangene Bytes: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_sent">"Gesendete Bytes: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_total">"Bytes insgesamt: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_cpu_usage">"CPU-Nutzungsdetails für <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
+ <string name="battery_history_user_time">"Nutzerzeit:"</string>
+ <string name="battery_history_system_time">"Systemzeit:"</string>
+ <string name="battery_history_total_time">"Gesamtzeit:"</string>
+ <string name="battery_history_starts">"Startet: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
+ <string name="battery_history_days">"<xliff:g id="DAYS">%1$d</xliff:g> Tage, <xliff:g id="HOURS">%2$d</xliff:g> Stunden, <xliff:g id="MINUTES">%3$d</xliff:g> Minuten, <xliff:g id="SECONDS">%4$d</xliff:g> Sekunden"</string>
+ <string name="battery_history_hours">"<xliff:g id="HOURS">%1$d</xliff:g> Stunden, <xliff:g id="MINUTES">%2$d</xliff:g> Minuten, <xliff:g id="SECONDS">%3$d</xliff:g> Sekunden"</string>
+ <string name="battery_history_minutes">"<xliff:g id="MINUTES">%1$d</xliff:g> Minuten, <xliff:g id="SECONDS">%2$d</xliff:g> Sekunden"</string>
+ <string name="battery_history_seconds">"<xliff:g id="SECONDS">%1$d</xliff:g> Sekunden"</string>
+ <string name="battery_history_packages_sharing_this_uid">"Pakete, die diese UID teilen:"</string>
+ <string name="battery_history_no_data">"Keine Akku-Nutzungsdaten verfügbar"</string>
+ <string name="battery_history_sensor">"Sensor:"</string>
+ <!-- no translation found for battery_history_wakelock (608683447522396293) -->
+ <skip />
+ <string name="battery_history_used_by_packages">"Sensor verwendet von Paketen:"</string>
+ <string name="battery_history_sensor_usage">"<xliff:g id="COUNT">%1$d</xliff:g> mal von <xliff:g id="PACKAGE">%2$s</xliff:g> verwendet"</string>
+ <string name="battery_history_sensor_usage_multi">"<xliff:g id="COUNT">%1$d</xliff:g> mal von einem der folgenden verwendet:"</string>
+ <!-- no translation found for battery_history_awake_label (8449792868990080882) -->
+ <skip />
+ <!-- no translation found for battery_history_screen_on_label (1848936521786339362) -->
+ <skip />
+ <!-- no translation found for battery_history_phone_on_label (700191958853142297) -->
+ <skip />
+ <!-- no translation found for battery_history_awake (4350886665719031057) -->
+ <skip />
+ <string name="battery_history_screen_on">"Zeit mit Display eingeschaltet:"</string>
+ <!-- no translation found for battery_history_phone_on (4891504401623839532) -->
+ <skip />
+ <string name="battery_history_screen_on_battery">"Auf Akku:"</string>
+ <string name="battery_history_screen_on_plugged">"Eingesteckt:"</string>
+ <string name="usage_stats_label">"Nutzungsstatistik"</string>
+ <string name="testing_usage_stats">"Nutzungsstatistik"</string>
+ <string name="display_order_text">"Sortieren nach:"</string>
+ <string name="app_name_label">"Anwendung"</string>
+ <string name="launch_count_label">"Anzahl"</string>
+ <string name="usage_time_label">"Nutzungszeit"</string>
+</resources>
diff --git a/res/values-es-nokeys/strings.xml b/res/values-es-nokeys/strings.xml
new file mode 100644
index 0000000..0a6a749
--- /dev/null
+++ b/res/values-es-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/arrays.xml b/res/values-es/arrays.xml
new file mode 100644
index 0000000..3129a72
--- /dev/null
+++ b/res/values-es/arrays.xml
@@ -0,0 +1,72 @@
+<?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>"Todas"</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>"Tiempo de espera ilimitado"</item>
+ </string-array>
+ <string-array name="wifi_security_entries">
+ <item>"Automática"</item>
+ <item>"Ninguna"</item>
+ <item>"WEP"</item>
+ <item>"WPA Personal"</item>
+ <item>"WPA2 Personal"</item>
+ </string-array>
+ <string-array name="wifi_security_without_auto_entries">
+ <item>"Ninguna"</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 la pantalla de apague"</item>
+ <item>"Nunca si está conectado"</item>
+ <item>"Nunca"</item>
+ </string-array>
+ <!-- no translation found for battery_history_type_spinner:0 (2193799199027871385) -->
+ <!-- no translation found for battery_history_type_spinner:1 (6401018715947316517) -->
+ <!-- no translation found for battery_history_type_spinner:2 (188092590354892392) -->
+ <!-- no translation found for battery_history_type_spinner:3 (8414109131222049141) -->
+ <!-- no translation found for battery_history_type_spinner:4 (1327904325081257093) -->
+ <!-- no translation found for battery_history_type_spinner:5 (4832254146664706277) -->
+ <!-- no translation found for battery_history_which_spinner:0 (3451981114763440074) -->
+ <!-- no translation found for battery_history_which_spinner:1 (166936313535197598) -->
+ <!-- no translation found for battery_history_which_spinner:2 (4793941382744963893) -->
+ <string-array name="usage_stats_display_order_types">
+ <item>"Tiempo de uso"</item>
+ <item>"Número de inicios"</item>
+ <item>"Nombre de la aplicación"</item>
+ </string-array>
+</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
new file mode 100644
index 0000000..e22ee4b
--- /dev/null
+++ b/res/values-es/strings.xml
@@ -0,0 +1,671 @@
+<?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">"Activar señal móvil"</string>
+ <string name="turn_off_radio">"Desactivar señal móvil"</string>
+ <string name="turn_on_qxdm">"Habilitar registro QXDM de SD"</string>
+ <string name="turn_off_qxdm">"Inhabilitar registro QXDM de SD"</string>
+ <string name="radioInfo_menu_viewADN">"Ver libreta de direcciones de tarjeta SIM"</string>
+ <string name="radioInfo_menu_viewFDN">"Ver números de marcación fija"</string>
+ <string name="radioInfo_menu_viewSDN">"Ver números de marcación de servicio"</string>
+ <string name="radioInfo_menu_getPDP">"Obtener lista PDP"</string>
+ <string name="radioInfo_menu_enableData">"Habilitar conexión de datos"</string>
+ <string name="radioInfo_menu_disableData">"Inhabilitar conexión de datos"</string>
+ <string name="radioInfo_menu_enableDataOnBoot">"Habilitar datos al iniciar"</string>
+ <string name="radioInfo_menu_disableDataOnBoot">"Inhabilitar datos al iniciar"</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">"Señal móvil desactivada"</string>
+ <string name="radioInfo_roaming_in">"Itinerancia"</string>
+ <string name="radioInfo_roaming_not">"Sin itinerancia"</string>
+ <string name="radioInfo_phone_idle">"Inactivo"</string>
+ <string name="radioInfo_phone_ringing">"Sonando"</string>
+ <string name="radioInfo_phone_offhook">"Llamada en curso"</string>
+ <string name="radioInfo_data_disconnected">"Desconectada"</string>
+ <string name="radioInfo_data_connecting">"Estableciendo conexión..."</string>
+ <string name="radioInfo_data_connected">"Conectado"</string>
+ <string name="radioInfo_data_suspended">"Suspendido"</string>
+ <string name="radioInfo_unknown">"desconocido"</string>
+ <string name="radioInfo_display_packets">"pqts"</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">"Desactivar 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 la batería:"</string>
+ <string name="battery_info_scale_label">"Nivel de batería:"</string>
+ <string name="battery_info_level_label">"Nivel de batería:"</string>
+ <string name="battery_info_health_label">"Estado de la batería:"</string>
+ <string name="battery_info_technology_label">"Tecnología de 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 inicio:"</string>
+ <string name="battery_info_awake_battery">"Tiempo de actividad en batería:"</string>
+ <string name="battery_info_awake_plugged">"Tiempo de actividad durante la carga:"</string>
+ <string name="battery_info_screen_on">"Pantalla de duración de encendido"</string>
+ <string name="battery_info_status_unknown">"Desconocido"</string>
+ <string name="battery_info_status_charging">"Cargando..."</string>
+ <string name="battery_info_status_charging_ac">"(CA)"</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 está cargando."</string>
+ <string name="battery_info_status_full">"Completa"</string>
+ <string name="battery_info_health_unknown">"Desconocido"</string>
+ <string name="battery_info_health_good">"Buena"</string>
+ <string name="battery_info_health_overheat">"Sobrecalentamiento"</string>
+ <string name="battery_info_health_dead">"Agotada"</string>
+ <string name="battery_info_health_over_voltage">"Sobretensión"</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 visible el dispositivo"</string>
+ <string name="bluetooth_devices">"Dispositivos Bluetooth"</string>
+ <string name="bluetooth_device_name">"Nombre del dispositivo"</string>
+ <string name="bluetooth_name_not_set">"No se ha establecido ningún nombre; se utiliza el nombre de cuenta."</string>
+ <string name="bluetooth_scan_for_devices">"Buscar dispositivos"</string>
+ <string name="bluetooth_disconnect_blank">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> se desconectará."</string>
+ <string name="bluetooth_connected">"Conectado"</string>
+ <string name="bluetooth_disconnected">"Desconectada"</string>
+ <string name="bluetooth_disconnecting">"Desconectando..."</string>
+ <string name="bluetooth_connecting">"Estableciendo conexión..."</string>
+ <!-- no translation found for bluetooth_unknown (1905151516611093010) -->
+ <skip />
+ <string name="bluetooth_not_connected">"Sincronizar con este dispositivo"</string>
+ <string name="bluetooth_pairing">"Sincronizando..."</string>
+ <string name="bluetooth_paired">"Sincronizado pero no conectado"</string>
+ <string name="bluetooth_device">"manos libres/auriculares"</string>
+ <string name="progress_scanning">"Buscando..."</string>
+ <string name="bluetooth_notif_ticker">"Solicitud de sincronización de Bluetooth"</string>
+ <string name="bluetooth_notif_title">"Solicitud de sincronización"</string>
+ <string name="bluetooth_notif_message">"Seleccionar dispositivo para sincronización "</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 (8363026381459131554) -->
+ <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">"Iniciar <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 valores predeterminados"</string>
+ <string name="proxy_action_text">"Guardar"</string>
+ <string name="proxy_hostname_label">"Nombre de host"</string>
+ <string name="proxy_error">"Atención"</string>
+ <string name="proxy_error_dismiss">"Aceptar"</string>
+ <string name="proxy_error_invalid_host">"El nombre de host introducido 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 de portal debe estar vacío si el campo de host también lo está."</string>
+ <string name="proxy_error_invalid_port">"El puerto introducido no es válido."</string>
+ <string name="radio_info_signal_location_label">"Ubicación:"</string>
+ <string name="radio_info_neighboring_location_label">"CID anexo"</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">"Itinerancia:"</string>
+ <string name="radio_info_imei_label">"IMEI:"</string>
+ <string name="radio_info_call_redirect_label">"Desvío de llamada:"</string>
+ <string name="radio_info_ppp_resets_label">"Número de PPP restablecidos desde el inicio:"</string>
+ <string name="radio_info_gsm_disconnects_label">"Desconexión 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">"Intensidad de la señal:"</string>
+ <string name="radio_info_call_status_label">"Estado de la llamada:"</string>
+ <string name="radio_info_ppp_sent_label">"PPP enviado:"</string>
+ <string name="radio_info_radio_resets_label">"Restablecimientos de señal móvil:"</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 señal móvil"</string>
+ <string name="radio_info_network_type_label">"Tipo de red:"</string>
+ <string name="radio_info_set_perferred_label">"Establecer tipo de red preferido:"</string>
+ <string name="radio_info_ping_ipaddr">"Hacer ping a DirIP:"</string>
+ <string name="radio_info_ping_hostname">"Hacer ping a nombre de host (www.google.com):"</string>
+ <string name="radio_info_http_client_test">"Prueba de cliente HTTP:"</string>
+ <string name="radio_info_toggle_ciph_label">"Alternar cifrado"</string>
+ <string name="ping_test_label">"Ejecutar prueba de ping"</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">"alternar comprobación de DNS"</string>
+ <string name="band_mode_title">"Establecer banda GSM/UMTS"</string>
+ <string name="band_mode_loading">"Cargando lista de bandas..."</string>
+ <string name="band_mode_set">"Establecer"</string>
+ <string name="band_mode_failed">"Con error"</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">"Habilitar almacenamiento masivo USB"</string>
+ <string name="sdcard_settings_total_bytes_label">"Bytes totales:"</string>
+ <string name="sdcard_settings_not_present_status">"Falta la tarjeta SD"</string>
+ <string name="sdcard_settings_available_bytes_label">"Bytes disponibles:"</string>
+ <string name="sdcard_settings_mass_storage_status">"La tarjeta SD se está utilizando como dispositivo de almacenamiento masivo."</string>
+ <string name="sdcard_settings_unmounted_status">"Es seguro extraer la tarjeta SD"</string>
+ <string name="sdcard_settings_bad_removal_status">"La tarjeta SD se ha extraído mientras estaba en uso."</string>
+ <string name="sdcard_settings_used_bytes_label">"Bytes utilizados:"</string>
+ <string name="sdcard_settings_scanning_status">"Buscando medios en tarjeta SD..."</string>
+ <string name="sdcard_settings_read_only_status">"Tarjeta SD activada en modo de sólo lectura"</string>
+ <string name="next_label">"Siguiente"</string>
+ <string name="language_picker_title">"Configuración local"</string>
+ <string name="select_your_language">"Selecciona el idioma que prefieras."</string>
+ <string name="activity_picker_label">"Seleccionar actividad"</string>
+ <string name="device_info_label">"Información del dispositivo"</string>
+ <string name="battery_info_label">"Información sobre la batería"</string>
+ <string name="battery_history_label">"Historial de la batería"</string>
+ <string name="display_label">"Pantalla"</string>
+ <string name="phone_info_label">"Información sobre el 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">"Ajustes"</string>
+ <string name="airplane_mode">"Modo avión"</string>
+ <string name="airplane_mode_summary">"Inhabilitar todas las conexiones inalámbricas"</string>
+ <string name="airplane_mode_turning_on">"Inhabilitando conexiones inalámbricas..."</string>
+ <string name="airplane_mode_turning_off">"Habilitando conexiones inalámbricas..."</string>
+ <string name="radio_controls_title">"Conexiones inalámbricas"</string>
+ <string name="radio_controls_summary">"Administrar Wi-Fi, Bluetooth, modo avión y redes móviles"</string>
+ <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 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>
+ <string name="date_time_date_format">"Seleccionar 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 ubicación, bloqueo de pantalla y 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">"Bluetooth"</string>
+ <string name="bluetooth_settings_title">"Ajustes de Bluetooth"</string>
+ <string name="bluetooth_settings_summary">"Administrar conexiones, establecer el nombre del dispositivo y la visibilidad"</string>
+ <string name="bluetooth_pin_entry">"Solicitud de sincronización de Bluetooth"</string>
+ <string name="bluetooth_device_info">"Información de dispositivo Bluetooth"</string>
+ <string name="bluetooth_enter_pin_msg">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"\n\n"Introduce el PIN para la sincronización."\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 realizar la sincronización con <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+ <string name="bluetooth_pairing_pin_error_message">"Se ha producido un problema al realizar la sincronización con <xliff:g id="DEVICE_NAME">%1$s</xliff:g>, porque el PIN introducido es incorrecto."</string>
+ <string name="bluetooth_connecting_error_message">"Se ha producido un problema al establecer conexión con <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+ <string name="bluetooth_preference_scan_title">"Buscar dispositivos"</string>
+ <string name="bluetooth_device_context_connect">"Establecer conexión"</string>
+ <string name="bluetooth_device_context_disconnect">"Desconectar"</string>
+ <string name="bluetooth_device_context_pair_connect">"Sincronizar y conectar"</string>
+ <string name="bluetooth_device_context_unpair">"Desincronizar"</string>
+ <string name="bluetooth_device_context_disconnect_unpair">"Desconectar y desincronizar"</string>
+ <string name="bluetooth_device_context_connect_advanced">"Opciones…"</string>
+ <string name="bluetooth_connect_specific_profiles_title">"Establecer conexión con…"</string>
+ <string name="bluetooth_profile_a2dp">"Multimedia"</string>
+ <string name="bluetooth_profile_headset">"Teléfono"</string>
+ <string name="bluetooth_summary_connected_to_a2dp">"Conectado al audio del medio"</string>
+ <string name="bluetooth_summary_connected_to_headset">"Conectado al audio del teléfono"</string>
+ <string name="bluetooth_summary_connected_to_a2dp_headset">"Conectado a audio de medio y del teléfono"</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">"Establecer conexión"</string>
+ <string name="bluetooth_device_advanced_online_mode_summary">"Establecer conexión con dispositivo Bluetooth"</string>
+ <string name="bluetooth_device_advanced_profile_header_title">"Perfiles"</string>
+ <string name="bluetooth_a2dp_profile_summary_connected">"Conectado al audio del medio"</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 audio de medio"</string>
+ <string name="bluetooth_headset_profile_summary_use_for">"Utilizar para 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">"Activar Wi-Fi"</string>
+ <string name="wifi_settings">"Configuración de Wi-Fi"</string>
+ <string name="wifi_settings_category">"Configuración de Wi-Fi"</string>
+ <string name="wifi_settings_summary">"Configurar y administrar puntos de acceso inalámbricos"</string>
+ <string name="forget_network">"Borrar"</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">"Buena"</string>
+ <string name="wifi_signal_1">"Aceptable"</string>
+ <string name="wifi_signal_0">"Baja"</string>
+ <string name="security">"Seguridad"</string>
+ <string name="wifi_security_open">"Abierta"</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">"Desconocida"</string>
+ <string name="wifi_security_verbose_open">"Red abierta"</string>
+ <string name="wifi_security_verbose_wep">"Protegido con WEP"</string>
+ <string name="wifi_security_verbose_wpa">"Protegida con WPA"</string>
+ <string name="wifi_security_verbose_wpa2">"Protegida con WPA2"</string>
+ <string name="ip_address">"Dirección IP"</string>
+ <string name="signal">"Intensidad de la señal"</string>
+ <string name="wifi_starting">"Activando..."</string>
+ <string name="wifi_stopping">"Desactivando..."</string>
+ <string name="wifi_error">"Error"</string>
+ <string name="error_starting">"No se ha podido iniciar la función Wi-Fi."</string>
+ <string name="error_stopping">"No se ha podido interrumpir la función Wi-Fi."</string>
+ <string name="error_scanning">"No se han podido buscar redes."</string>
+ <string name="error_connecting">"No se ha podido establecer conexión con la red."</string>
+ <string name="error_saving">"No se ha podido guardar la red."</string>
+ <string name="connect">"Establecer conexión"</string>
+ <string name="connect_to_blank">"Establecer conexión con <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+ <string name="please_type_passphrase">"Contraseña de red inalámbrica"</string>
+ <string name="please_type_hex_key">"Clave hex. WEP (0-9, A-F)"</string>
+ <string name="wifi_show_password">"Mostrar contraseña"</string>
+ <string name="scan_wifi">"Buscar"</string>
+ <string name="summary_not_in_range">"Fuera de rango"</string>
+ <string name="summary_remembered">"Recordada"</string>
+ <string name="summary_connection_failed">"La conexión no se ha realizado correctamente; selecciónala para volver a intentarlo."</string>
+ <string name="wifi_access_points">"Redes 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 modificar)"</string>
+ <string name="wifi_add_other_network">"Añadir red Wi-Fi"</string>
+ <string name="wifi_notify_open_networks">"Notificación de red"</string>
+ <string name="wifi_notify_open_networks_summary">"Informarme cuando haya una red abierta disponible"</string>
+ <string name="wifi_password_incorrect_error">"La contraseña de red que has introducido no es correcta. Inténtalo de nuevo."</string>
+ <string name="wifi_generic_connection_error">"Se ha producido un problema al intentar establecer conexión con la red. Inténtalo de nuevo."</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">"Introduce 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">"Puerta de enlace"</string>
+ <string name="wifi_netmask">"Máscara de red"</string>
+ <string name="wifi_context_menu_connect">"Establecer conexión con red"</string>
+ <string name="wifi_context_menu_forget">"Borrar 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 el número de canales que se van a utilizar"</string>
+ <string name="wifi_setting_num_channels_error">"Se ha producido un problema al intentar 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 suspensión de Wi-Fi"</string>
+ <string name="wifi_setting_sleep_policy_summary">"Especificar cuándo cambiar de Wi-Fi a datos móviles"</string>
+ <string name="wifi_setting_sleep_policy_error">"Se ha producido un problema al intentar establecer la política de suspensión."</string>
+ <string name="wifi_advanced_mac_address_title">"Dirección MAC"</string>
+ <string name="fragment_status_scanning">"Buscando..."</string>
+ <string name="fragment_status_connecting">"Conectando con <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">"Conectada 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">"Desconectada"</string>
+ <string name="fragment_status_failed">"Con error"</string>
+ <string name="status_scanning">"Buscando..."</string>
+ <string name="status_connecting">"Estableciendo conexión..."</string>
+ <string name="status_authenticating">"Autenticando..."</string>
+ <string name="status_obtaining_ip">"Obteniendo dirección..."</string>
+ <string name="status_connected">"Conectada"</string>
+ <string name="status_disconnecting">"Desconectando..."</string>
+ <string name="status_disconnected">"Desconectada"</string>
+ <string name="status_failed">"Con error"</string>
+ <string name="sound_and_display_settings">"Sonido y pantalla"</string>
+ <string name="sound_settings">"Configuración de sonido"</string>
+ <string name="sound_and_display_settings_summary">"Establecer tonos, notificaciones, brillo de la pantalla"</string>
+ <string name="silent_mode_title">"Modo silencio"</string>
+ <string name="silent_mode_summary">"Silencio de todos los sonidos (excepto los multimedia y las alarmas)"</string>
+ <string name="ringtone_title">"Tono del teléfono"</string>
+ <string name="ringtone_summary">"Establecer el tono de llamada entrante predeterminado"</string>
+ <string name="ring_volume_title">"Volumen del timbre"</string>
+ <string name="ring_volume_summary">"Establecer volumen para llamadas entrantes y notificaciones"</string>
+ <string name="vibrate_title">"Teléfono en vibración"</string>
+ <string name="vibrate_summary">"Teléfono en vibración para llamadas entrantes"</string>
+ <string name="notification_sound_title">"Tono de notificación"</string>
+ <string name="notification_sound_summary">"Establecer el tono de notificación predeterminado"</string>
+ <string name="incoming_call_volume_title">"Volumen de llamada entrante"</string>
+ <string name="notification_volume_title">"Volumen de notificaciones"</string>
+ <string name="checkbox_notification_same_as_incoming_call">"Utilizar volumen de llamada entrante para notificaciones"</string>
+ <string name="notification_sound_dialog_title">"Seleccionar tono de notificación"</string>
+ <string name="media_volume_title">"Volumen multimedia"</string>
+ <string name="media_volume_summary">"Establecer volumen para música y vídeos"</string>
+ <string name="dtmf_tone_enable_title">"Tonos táctiles sonoros"</string>
+ <string name="dtmf_tone_enable_summary_on">"Reproducir tonos al utilizar teclado de marcado"</string>
+ <string name="dtmf_tone_enable_summary_off">"Reproducir tonos al utilizar teclado de marcado"</string>
+ <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 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>
+ <string name="sync_settings_summary">"Seleccionar las aplicaciones que están sincronizadas"</string>
+ <string name="display_settings">"Configuración de pantalla"</string>
+ <string name="animations_title">"Animación"</string>
+ <string name="animations_summary_on">"Mostrar animación al abrir o cerrar ventanas"</string>
+ <string name="animations_summary_off">"Mostrar animación al abrir o cerrar ventanas"</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 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">"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>
+ <string name="sim_lock_off">"Solicitar PIN para utilizar el teléfono"</string>
+ <string name="sim_pin_change">"Cambiar PIN de tarjeta SIM"</string>
+ <string name="sim_enter_pin">"PIN de tarjeta SIM"</string>
+ <string name="sim_enable_sim_lock">"Bloquear tarjeta SIM"</string>
+ <string name="sim_disable_sim_lock">"Desbloquear tarjeta SIM"</string>
+ <string name="sim_enter_old">"PIN de tarjeta SIM antiguo"</string>
+ <string name="sim_enter_new">"Nuevo PIN de tarjeta SIM"</string>
+ <string name="sim_reenter_new">"Volver a introducir PIN nuevo"</string>
+ <string name="sim_change_pin">"PIN de tarjeta SIM"</string>
+ <string name="sim_bad_pin">"PIN incorrecto"</string>
+ <string name="sim_pins_dont_match">"Los códigos PIN no coinciden."</string>
+ <string name="sim_change_failed">"No se ha podido cambiar el PIN."\n"Es posible que no sea correcto."</string>
+ <string name="sim_change_succeeded">"El PIN de la tarjeta SIM se ha modificado correctamente."</string>
+ <string name="sim_lock_failed">"No se ha podido cambiar el estado de bloqueo de la tarjeta SIM."\n"Es posible que el PIN sea 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">"Buscar actualizaciones del sistema"</string>
+ <string name="firmware_version">"Versión del firmware"</string>
+ <string name="model_number">"Número de modelo"</string>
+ <string name="baseband_version">"Versión de banda base"</string>
+ <string name="kernel_version">"Versión de kernel"</string>
+ <string name="build_number">"Número de compilación"</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">"Almacenamiento"</string>
+ <string name="storage_settings_summary">"Tarjeta de SD sin activar, ver almacenamiento disponible"</string>
+ <string name="status_number">"Número de teléfono"</string>
+ <string name="status_network_type">"Tipo de red móvil"</string>
+ <string name="status_data_state">"Estado de red móvil"</string>
+ <string name="status_service_state">"Estado del servicio"</string>
+ <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 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_network_traffic_stats">"Uso de red"</string>
+ <string name="status_network_traffic_summary">"Enviado: <xliff:g id="NETWORK_TRAFFIC_0">%1$d packets, %2$d bytes%n</xliff:g>Recibido: <xliff:g id="NETWORK_TRAFFIC_1">%3$d packets, %4$d bytes</xliff:g>"</string>
+ <string name="status_up_time">"Tiempo de actividad"</string>
+ <string name="status_awake_time">"Tiempo de actividad"</string>
+ <string name="internal_memory">"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">"Desactivar tarjeta SD"</string>
+ <string name="sd_eject_summary">"Desactiva la tarjeta SD antes de extraerla para evitar la pérdida de datos."</string>
+ <string name="sd_format">"Formatear tarjeta SD"</string>
+ <string name="sd_format_summary">"Formatear (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 la batería"</string>
+ <string name="battery_level_title">"Nivel de batería"</string>
+ <string name="apn_settings">"APN"</string>
+ <string name="apn_edit">"Editar punto de acceso"</string>
+ <string name="apn_not_set">"&lt;No establecido&gt;"</string>
+ <string name="apn_name">"Nombre"</string>
+ <string name="apn_apn">"APN"</string>
+ <string name="apn_http_proxy">"Proxy"</string>
+ <string name="apn_http_port">"Puerto"</string>
+ <string name="apn_user">"Nombre de usuario"</string>
+ <string name="apn_password">"Contraseña"</string>
+ <string name="apn_server">"Servidor"</string>
+ <string name="apn_mmsc">"MMSC"</string>
+ <string name="apn_mms_proxy">"Proxy MMS"</string>
+ <string name="apn_mms_port">"Puerto de 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 campo de APN no puede estar vacío."</string>
+ <string name="error_mcc_not3">"El campo MMC debe contener 3 dígitos."</string>
+ <string name="error_mnc_not23">"El campo MNC debe contener 2 ó 3 dígitos."</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>
+ <string name="master_clear_final_desc">"¿Deseas reiniciar el teléfono y borrar todos los datos y todas las aplicaciones? Recuerda que esta acción no se puede deshacer."</string>
+ <string name="master_clear_final_button_text">"Borrar todo"</string>
+ <string name="master_clear_gesture_prompt">"Crea tu patrón de desbloqueo."</string>
+ <string name="master_clear_gesture_explanation">"Debes crear un patrón de desbloqueo para confirmar el reinicio del teléfono."</string>
+ <string name="master_clear_failed">"No se ha reiniciado el sistema porque el servicio Borrado del sistema no está disponible."</string>
+ <string name="media_format_title">"Formatear tarjeta SD"</string>
+ <string name="media_format_summary">"Borra todos los datos de la tarjeta SD."</string>
+ <string name="media_format_desc">"Esta acción borrará el contenido de la tarjeta SD del teléfono. Perderás TODOS los datos de la tarjeta."</string>
+ <string name="media_format_button_text">"Formatear tarjeta SD"</string>
+ <string name="media_format_final_desc">"¿Quieres formatear la tarjeta SD y borrar todos los datos? Esta acción no se puede deshacer."</string>
+ <string name="media_format_final_button_text">"Borrar todo"</string>
+ <string name="media_format_gesture_prompt">"Crea tu patrón de desbloqueo."</string>
+ <string name="media_format_gesture_explanation">"Debes crear un patrón de desbloqueo para confirmar el formato de la tarjeta SD."</string>
+ <string name="call_settings_title">"Ajustes de llamadas"</string>
+ <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">"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="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>
+ <string name="contributors_title">"Contribuidores"</string>
+ <string name="copyright_title">"Derechos de autor"</string>
+ <string name="license_title">"Licencia"</string>
+ <string name="terms_title">"Términos y condiciones"</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>
+ <string name="lockpattern_change_lock_pattern_label">"Cambiar patrón de desbloqueo"</string>
+ <string name="lockpattern_need_to_unlock">"Confirmar patrón guardado"</string>
+ <string name="lockpattern_need_to_unlock_wrong">"Inténtalo de nuevo:"</string>
+ <string name="lockpattern_recording_intro_header">"Crear un patrón de desbloqueo"</string>
+ <string name="lockpattern_recording_intro_footer">"Pulsa la tecla de menú para obtener ayuda."</string>
+ <string name="lockpattern_recording_inprogress">"Levanta el dedo cuando termines."</string>
+ <string name="lockpattern_recording_incorrect_too_short">"Une al menos <xliff:g id="NUMBER">%d</xliff:g> puntos. Inténtalo de nuevo:"</string>
+ <string name="lockpattern_pattern_entered_header">"Patrón grabado"</string>
+ <string name="lockpattern_need_to_confirm">"Vuelve a dibujar el patrón para confirmarlo:"</string>
+ <string name="lockpattern_pattern_confirmed_header">"Tu patrón de desbloqueo nuevo:"</string>
+ <string name="lockpattern_confirm_button_text">"Confirmar"</string>
+ <string name="lockpattern_restart_button_text">"Crear un patrón nuevo"</string>
+ <string name="lockpattern_retry_button_text">"Reintentar"</string>
+ <string name="lockpattern_continue_button_text">"Seguir"</string>
+ <string name="lockpattern_settings_title">"Patrón de desbloqueo"</string>
+ <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">"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>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_footer">"Espera <xliff:g id="NUMBER">%d</xliff:g> segundos y vuelve a intentarlo."</string>
+ <string name="skip_button_label">"Cancelar"</string>
+ <string name="next_button_label">"Seguir"</string>
+ <string name="lock_title">"Protección del teléfono"</string>
+ <string name="lock_intro_message"><font size="17">"Protege el teléfono de usos no autorizados mediante la creación de un patrón de desbloqueo de pantalla personal. "\n<font height="17">\n</font><b>"1"</b>" En la siguiente pantalla, puedes observar cómo se crea un patrón de ejemplo. "\n<font height="17">\n</font><b>"2"</b>" Cuando estés preparado, crea tu propio patrón de desbloqueo personal. Puedes experimentar con distintos patrones, pero recuerda que debes conectar al menos cuatro puntos. "\n<font height="17">\n</font><b>"3"</b>" Vuelve a dibujar el patrón para confirmarlo. "\n<font height="17">\n</font><b>"Si estás preparado para comenzar, selecciona \"Seguir\""</b>". "\n<font height="3">\n</font>"Para dejar el teléfono desprotegido, selecciona \"Cancelar\"."</font></string>
+ <string name="lock_example_title">"Patrón de ejemplo"</string>
+ <string name="lock_example_message">"Une al menos cuatro puntos."\n" "\n"Selecciona \"Seguir\" cuando estés preparado para crear 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 de inicio rápido"</string>
+ <string name="applications_settings_header">"Configuración de aplicaciones"</string>
+ <string name="install_applications">"Orígenes desconocidos"</string>
+ <string name="install_unknown_applications">"Permitir la instalación de aplicaciones distintas de Market"</string>
+ <string name="install_all_warning">"El teléfono y los datos personales son más vulnerables a los ataques de aplicaciones de origen desconocido. El usuario acepta ser el único responsable de cualquier daño en el teléfono o pérdida de datos que se pueda derivar del uso de estas aplicaciones."</string>
+ <string name="application_info_label">"Información de la aplicación"</string>
+ <string name="storage_label">"Almacenamiento"</string>
+ <string name="auto_launch_label">"Ejecutar de forma predeterminada"</string>
+ <string name="permissions_label">"Permisos"</string>
+ <string name="cache_header_label">"Caché"</string>
+ <string name="clear_cache_btn_text">"Borrar caché"</string>
+ <string name="cache_size_label">"Caché"</string>
+ <string name="controls_label">"Controles"</string>
+ <string name="force_stop">"Forzar 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 ejecutar la aplicación de forma predeterminada para algunas acciones."</string>
+ <string name="auto_launch_disable_text">"No se han establecido valores predeterminados."</string>
+ <string name="clear_activities">"Borrar valores predeterminados"</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 espacio"</string>
+ <string name="filter">"Filtrar"</string>
+ <string name="filter_dlg_title">"Seleccionar opciones de filtrado"</string>
+ <string name="filter_apps_all">"Todas"</string>
+ <string name="filter_apps_third_party">"Externas"</string>
+ <string name="filter_apps_running">"En ejecución"</string>
+ <string name="loading">"Cargando..."</string>
+ <string name="recompute_size">"Recalculando tamaño..."</string>
+ <string name="clear_data_dlg_title">"Suprimir"</string>
+ <string name="clear_data_dlg_text">"Toda la información que hayas guardado en la aplicación se eliminará permanentemente."</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 aplicación."</string>
+ <string name="security_settings_desc">"Esta aplicación puede acceder a los siguientes elementos del 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 externa."</string>
+ <string name="language_settings">"Idioma y país"</string>
+ <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">"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>
+ <string name="auto_caps">"Mayúsculas automáticas"</string>
+ <string name="auto_caps_summary">"Escribir en mayúsculas la primera letra de las frases"</string>
+ <string name="auto_punctuate">"Puntuación automática"</string>
+ <string name="hardkeyboard_category">"Configuración del teclado físico"</string>
+ <string name="auto_punctuate_summary">"Pulsa la barra espaciadora dos veces para insertar el carácter \".\""</string>
+ <string name="show_password">"Contraseñas visibles"</string>
+ <string name="show_password_summary">"Mostrar contraseña mientras se escribe"</string>
+ <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">"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 usuario"</string>
+ <string name="user_dict_settings_context_menu_edit_title">"Editar"</string>
+ <string name="user_dict_settings_context_menu_delete_title">"Suprimir"</string>
+ <string name="user_dict_settings_empty_text">"No tienes ninguna palabra en el diccionario del usuario. Puedes añadir una palabra a través del menú."</string>
+ <string name="testing">"Prueba"</string>
+ <string name="testing_phone_info">"Información sobre el teléfono"</string>
+ <string name="testing_battery_info">"Información sobre la batería"</string>
+ <string name="testing_battery_history">"Historial de la batería"</string>
+ <string name="quick_launch_title">"Inicio rápido"</string>
+ <string name="quick_launch_summary">"Establecer accesos rápidos del teclado para ejecutar aplicaciones"</string>
+ <string name="quick_launch_assign_application">"Asignar aplicación"</string>
+ <string name="quick_launch_no_shortcut">"Sin 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 eliminará el acceso directo <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">"Introducción de texto"</string>
+ <string name="input_methods_settings_summary">"Administrar opciones de introducción de texto"</string>
+ <string name="input_methods_settings_label_format">"Configuración de %s"</string>
+ <string name="development_settings_title">"Desarrollo"</string>
+ <string name="development_settings_summary">"Establecer opciones de desarrollo de aplicaciones"</string>
+ <string name="enable_adb">"Depuración USB"</string>
+ <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">"Permitir ubicaciones simuladas"</string>
+ <string name="allow_mock_location_summary">"Permitir ubicaciones simuladas"</string>
+ <!-- no translation found for gadget_picker_title (98374951396755811) -->
+ <skip />
+ <!-- no translation found for widget_picker_title (9130684134213467557) -->
+ <skip />
+ <string name="battery_history_details_for">"Detalles del ID único %d"</string>
+ <string name="battery_history_uid">"ID único <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
+ <string name="battery_history_network_usage">"Detalles de uso de 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">"Bytes totales: <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">"Tiempo de usuario:"</string>
+ <string name="battery_history_system_time">"Tiempo del sistema:"</string>
+ <string name="battery_history_total_time">"Tiempo total"</string>
+ <string name="battery_history_starts">"Inicios: <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 este ID único:"</string>
+ <string name="battery_history_no_data">"No hay datos disponibles sobre el uso de la batería."</string>
+ <string name="battery_history_sensor">"Sensor:"</string>
+ <!-- no translation found for battery_history_wakelock (608683447522396293) -->
+ <skip />
+ <string name="battery_history_used_by_packages">"Sensor utilizado por 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>
+ <!-- no translation found for battery_history_awake_label (8449792868990080882) -->
+ <skip />
+ <!-- no translation found for battery_history_screen_on_label (1848936521786339362) -->
+ <skip />
+ <!-- no translation found for battery_history_phone_on_label (700191958853142297) -->
+ <skip />
+ <!-- no translation found for battery_history_awake (4350886665719031057) -->
+ <skip />
+ <string name="battery_history_screen_on">"Tiempo transcurrido con la pantalla encendida:"</string>
+ <!-- no translation found for battery_history_phone_on (4891504401623839532) -->
+ <skip />
+ <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">"Número"</string>
+ <string name="usage_time_label">"Tiempo de uso"</string>
+</resources>
diff --git a/res/values-fr-nokeys/strings.xml b/res/values-fr-nokeys/strings.xml
new file mode 100644
index 0000000..a6e4745
--- /dev/null
+++ b/res/values-fr-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">"Gérer les applications"</string>
+</resources>
diff --git a/res/values-fr/arrays.xml b/res/values-fr/arrays.xml
new file mode 100644
index 0000000..6517114
--- /dev/null
+++ b/res/values-fr/arrays.xml
@@ -0,0 +1,72 @@
+<?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érique"</item>
+ <item>"Europe"</item>
+ <item>"Afrique"</item>
+ <item>"Asie"</item>
+ <item>"Australie"</item>
+ <item>"Pacifique"</item>
+ <item>"Tous"</item>
+ </string-array>
+ <string-array name="screen_timeout_entries">
+ <item>"15 secondes"</item>
+ <item>"30 secondes"</item>
+ <item>"1 minute"</item>
+ <item>"2 minutes"</item>
+ <item>"10 minutes"</item>
+ <item>"Ne jamais désactiver"</item>
+ </string-array>
+ <string-array name="wifi_security_entries">
+ <item>"Automatique"</item>
+ <item>"Aucune"</item>
+ <item>"WEP"</item>
+ <item>"WPA personnel"</item>
+ <item>"WPA2 personnel"</item>
+ </string-array>
+ <string-array name="wifi_security_without_auto_entries">
+ <item>"Aucun"</item>
+ <item>"WEP"</item>
+ <item>"WPA personnel"</item>
+ <item>"WPA2 personnel"</item>
+ </string-array>
+ <string-array name="wifi_wep_type">
+ <item>"Automatique"</item>
+ <item>"WEP ASCII"</item>
+ <item>"Clé WEP hexadécimale"</item>
+ </string-array>
+ <string-array name="wifi_sleep_policy_entries">
+ <item>"Lorsque l\'écran s\'éteint"</item>
+ <item>"Jamais si branché"</item>
+ <item>"Jamais"</item>
+ </string-array>
+ <!-- no translation found for battery_history_type_spinner:0 (2193799199027871385) -->
+ <!-- no translation found for battery_history_type_spinner:1 (6401018715947316517) -->
+ <!-- no translation found for battery_history_type_spinner:2 (188092590354892392) -->
+ <!-- no translation found for battery_history_type_spinner:3 (8414109131222049141) -->
+ <!-- no translation found for battery_history_type_spinner:4 (1327904325081257093) -->
+ <!-- no translation found for battery_history_type_spinner:5 (4832254146664706277) -->
+ <!-- no translation found for battery_history_which_spinner:0 (3451981114763440074) -->
+ <!-- no translation found for battery_history_which_spinner:1 (166936313535197598) -->
+ <!-- no translation found for battery_history_which_spinner:2 (4793941382744963893) -->
+ <string-array name="usage_stats_display_order_types">
+ <item>"Temps d\'utilisation"</item>
+ <item>"Nombre de lancements"</item>
+ <item>"Nom de l\'application"</item>
+ </string-array>
+</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
new file mode 100644
index 0000000..7d8e534
--- /dev/null
+++ b/res/values-fr/strings.xml
@@ -0,0 +1,671 @@
+<?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">"Inconnu"</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>
+ <string name="radioInfo_menu_viewFDN">"Afficher les numéros autorisés"</string>
+ <string name="radioInfo_menu_viewSDN">"Afficher les numéros de service"</string>
+ <string name="radioInfo_menu_getPDP">"Récupérer la liste PDP"</string>
+ <string name="radioInfo_menu_enableData">"Activer la connexion des données"</string>
+ <string name="radioInfo_menu_disableData">"Désactiver la connexion des données"</string>
+ <string name="radioInfo_menu_enableDataOnBoot">"Activer les données au démarrage"</string>
+ <string name="radioInfo_menu_disableDataOnBoot">"Désactiver les données lors du démarrage"</string>
+ <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">"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>
+ <string name="radioInfo_phone_ringing">"Sonnerie"</string>
+ <string name="radioInfo_phone_offhook">"Appel en cours"</string>
+ <string name="radioInfo_data_disconnected">"Déconnecté"</string>
+ <string name="radioInfo_data_connecting">"Connexion"</string>
+ <string name="radioInfo_data_connected">"Connecté"</string>
+ <string name="radioInfo_data_suspended">"Interrompu"</string>
+ <string name="radioInfo_unknown">"inconnu"</string>
+ <string name="radioInfo_display_packets">"paquets"</string>
+ <string name="radioInfo_display_bytes">"octets"</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">"Retirer la carte SD"</string>
+ <string name="sdcard_format">"Formater la carte SD"</string>
+ <string name="small_font">"Petite"</string>
+ <string name="medium_font">"Moyenne"</string>
+ <string name="large_font">"Grande"</string>
+ <string name="font_size_save">"OK"</string>
+ <string name="sdcard_setting">"Carte SD"</string>
+ <string name="battery_info_status_label">"État de la batterie :"</string>
+ <string name="battery_info_scale_label">"Batterie :"</string>
+ <string name="battery_info_level_label">"Niveau de la batterie :"</string>
+ <string name="battery_info_health_label">"État de la batterie :"</string>
+ <string name="battery_info_technology_label">"Technologie de la batterie :"</string>
+ <string name="battery_info_voltage_label">"Voltage de la batterie :"</string>
+ <string name="battery_info_voltage_units">"mV"</string>
+ <string name="battery_info_temperature_label">"Température de la batterie :"</string>
+ <string name="battery_info_temperature_units">"° C"</string>
+ <string name="battery_info_uptime">"Temps depuis le démarrage :"</string>
+ <string name="battery_info_awake_battery">"Temps de veille sur batterie :"</string>
+ <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">"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>
+ <string name="battery_info_status_not_charging">"Débranchée"</string>
+ <string name="battery_info_status_full">"Chargée"</string>
+ <string name="battery_info_health_unknown">"Inconnu"</string>
+ <string name="battery_info_health_good">"Bon"</string>
+ <string name="battery_info_health_overheat">"Surchauffe"</string>
+ <string name="battery_info_health_dead">"Vide"</string>
+ <string name="battery_info_health_over_voltage">"Voltage dépassé"</string>
+ <string name="battery_info_health_unspecified_failure">"Erreur inconnue"</string>
+ <string name="bluetooth">"Bluetooth"</string>
+ <string name="bluetooth_visibility">"Identifiable"</string>
+ <string name="bluetooth_is_discoverable">"Identifiable pendant <xliff:g id="DISCOVERABLE_TIME_PERIOD">%1$s</xliff:g> secondes..."</string>
+ <string name="bluetooth_not_discoverable">"Permettre l\'identification de l\'appareil"</string>
+ <string name="bluetooth_devices">"Périphériques Bluetooth"</string>
+ <string name="bluetooth_device_name">"Nom du périphérique"</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">"Rechercher des périphériques"</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>
+ <string name="bluetooth_disconnecting">"Déconnexion…"</string>
+ <string name="bluetooth_connecting">"Connexion…"</string>
+ <!-- no translation found for bluetooth_unknown (1905151516611093010) -->
+ <skip />
+ <string name="bluetooth_not_connected">"Associer à ce périphérique"</string>
+ <string name="bluetooth_pairing">"Association…"</string>
+ <string name="bluetooth_paired">"Associé mais non connecté"</string>
+ <string name="bluetooth_device">"mains libres/casque"</string>
+ <string name="progress_scanning">"Recherche"</string>
+ <string name="bluetooth_notif_ticker">"Demande d\'association Bluetooth"</string>
+ <string name="bluetooth_notif_title">"Demande d\'association"</string>
+ <string name="bluetooth_notif_message">"Sélectionner pour associer à "</string>
+ <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="choose_timezone">"Choisir fuseau horaire"</string>
+ <string name="display_preview_label">"Aperçu :"</string>
+ <string name="display_font_size_label">"Taille de police :"</string>
+ <!-- no translation found for intent_sender_data_label (8363026381459131554) -->
+ <skip />
+ <string name="intent_sender_sendbroadcast_text">"Envoyer <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">"Lancer <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">"Compte :"</string>
+ <string name="proxy_clear_text">"Effacer"</string>
+ <string name="proxy_port_label">"Port"</string>
+ <string name="proxy_defaultView_text">"Rétablir les paramètres par défaut"</string>
+ <string name="proxy_action_text">"Enregistrer"</string>
+ <string name="proxy_hostname_label">"Nom de l\'hôte"</string>
+ <string name="proxy_error">"Attention"</string>
+ <string name="proxy_error_dismiss">"OK"</string>
+ <string name="proxy_error_invalid_host">"Le nom d\'hôte saisi n\'est pas valide."</string>
+ <string name="proxy_error_empty_port">"Vous devez renseigner le champ Port."</string>
+ <string name="proxy_error_empty_host_set_port">"Le champ Port doit rester vide si le champ Hôte n\'est pas renseigné."</string>
+ <string name="proxy_error_invalid_port">"Le port indiqué n\'est pas valide."</string>
+ <string name="radio_info_signal_location_label">"Emplacement :"</string>
+ <string name="radio_info_neighboring_location_label">"CID voisin :"</string>
+ <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">"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>
+ <string name="radio_info_current_network_label">"Réseau actuel :"</string>
+ <string name="radio_info_data_successes_label">"Réussites des données :"</string>
+ <string name="radio_info_ppp_received_label">"PPP reçus :"</string>
+ <string name="radio_info_gsm_service_label">"Service GSM :"</string>
+ <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 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>
+ <string name="radio_info_network_type_label">"Type de réseau :"</string>
+ <string name="radio_info_set_perferred_label">"Définir le type de réseau préféré :"</string>
+ <string name="radio_info_ping_ipaddr">"Adr. IP ping :"</string>
+ <string name="radio_info_ping_hostname">"Nom de l\'hôte du ping (www.google.com) :"</string>
+ <string name="radio_info_http_client_test">"Test du client HTTP :"</string>
+ <string name="radio_info_toggle_ciph_label">"Activer/désactiver le cryptage"</string>
+ <string name="ping_test_label">"Effectuer un test de ping"</string>
+ <string name="radio_info_smsc_label">"SMSC :"</string>
+ <string name="radio_info_smsc_update_label">"Mettre à jour"</string>
+ <string name="radio_info_smsc_refresh_label">"Actualiser"</string>
+ <string name="radio_info_toggle_dns_check_label">"Activer le contrôle DNS"</string>
+ <string name="band_mode_title">"Définir la bande GSM/UMTS"</string>
+ <string name="band_mode_loading">"Chargement de la liste de bandes..."</string>
+ <string name="band_mode_set">"Définir"</string>
+ <string name="band_mode_failed">"Échec"</string>
+ <string name="band_mode_succeeded">"OK"</string>
+ <string name="sdcard_changes_instructions">"Les modifications prendront effet lors de la prochaine connexion du câble USB."</string>
+ <string name="sdcard_settings_screen_mass_storage_text">"Activer le stockage de masse USB"</string>
+ <string name="sdcard_settings_total_bytes_label">"Octets au total :"</string>
+ <string name="sdcard_settings_not_present_status">"Aucune carte SD n\'a été trouvée."</string>
+ <string name="sdcard_settings_available_bytes_label">"Octets disponibles :"</string>
+ <string name="sdcard_settings_mass_storage_status">"La carte SD est utilisée comme périphérique de stockage."</string>
+ <string name="sdcard_settings_unmounted_status">"Vous pouvez maintenant retirer la carte SD en toute sécurité."</string>
+ <string name="sdcard_settings_bad_removal_status">"La carte SD a été retirée pendant son utilisation !"</string>
+ <string name="sdcard_settings_used_bytes_label">"Octets utilisés :"</string>
+ <string name="sdcard_settings_scanning_status">"Recherche de fichiers multimédia sur la carte SD…"</string>
+ <string name="sdcard_settings_read_only_status">"Carte SD montée en lecture seule"</string>
+ <string name="next_label">"Suivant"</string>
+ <string name="language_picker_title">"Paramètres régionaux"</string>
+ <string name="select_your_language">"Choisir la langue"</string>
+ <string name="activity_picker_label">"Sélectionner une activité"</string>
+ <string name="device_info_label">"Informations sur le périphérique"</string>
+ <string name="battery_info_label">"Informations sur la batterie"</string>
+ <string name="battery_history_label">"Historique de la batterie"</string>
+ <string name="display_label">"Afficher"</string>
+ <string name="phone_info_label">"Informations sur le téléphone"</string>
+ <string name="sd_card_settings_label">"Carte SD"</string>
+ <string name="proxy_settings_label">"Paramètres proxy"</string>
+ <string name="cancel">"Annuler"</string>
+ <string name="settings_label">"Paramètres"</string>
+ <string name="airplane_mode">"Mode avion"</string>
+ <string name="airplane_mode_summary">"Désactiver toutes les connexions sans fil"</string>
+ <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="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>
+ <string name="date_time_auto_summaryOn">"Utiliser les valeurs du réseau"</string>
+ <string name="date_time_auto_summaryOff">"Utiliser les valeurs fournies par le réseau"</string>
+ <string name="date_time_24hour">"Utiliser format sur 24 h"</string>
+ <string name="date_time_set_time">"Définir l\'heure"</string>
+ <string name="date_time_set_timezone">"Choisir un fuseau horaire"</string>
+ <string name="date_time_set_date">"Définir la date"</string>
+ <string name="date_time_date_format">"Sélectionner format de date"</string>
+ <string name="zone_list_menu_sort_alphabetically">"Trier par ordre alphabétique"</string>
+ <string name="zone_list_menu_sort_by_timezone">"Trier par fuseau horaire"</string>
+ <string name="security_settings_title">"Sécurité et localisation"</string>
+ <string name="security_settings_summary">"Définir Ma position, le déverrouillage de l\'écran et le blocage de la carte SIM"</string>
+ <string name="security_passwords_title">"Mots de passe"</string>
+ <string name="bluetooth_quick_toggle_title">"Bluetooth"</string>
+ <string name="bluetooth_quick_toggle_summary">"Activer Bluetooth"</string>
+ <string name="bluetooth_settings">"Paramètres Bluetooth"</string>
+ <string name="bluetooth_settings_title">"Paramètres Bluetooth"</string>
+ <string name="bluetooth_settings_summary">"Gérer les connexions, configurer le nom et l\'identification de l\'appareil"</string>
+ <string name="bluetooth_pin_entry">"Demande d\'association Bluetooth"</string>
+ <string name="bluetooth_device_info">"Informations sur le périphérique Bluetooth"</string>
+ <string name="bluetooth_enter_pin_msg">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"\n\n"Saisissez le code PIN pour associer l\'appareil."\n"(Essayez avec 0000 ou 1234.)"</string>
+ <string name="bluetooth_error_title">"Attention"</string>
+ <string name="bluetooth_pairing_error_message">"Un problème est survenu lors de l\'association à <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+ <string name="bluetooth_pairing_pin_error_message">"Un problème est survenu lors de l\'association à <xliff:g id="DEVICE_NAME">%1$s</xliff:g> car le PIN saisi est incorrect."</string>
+ <string name="bluetooth_connecting_error_message">"Un problème est survenu lors de la connexion à <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+ <string name="bluetooth_preference_scan_title">"Rechercher des périphériques"</string>
+ <string name="bluetooth_device_context_connect">"Se connecter"</string>
+ <string name="bluetooth_device_context_disconnect">"Déconnecter"</string>
+ <string name="bluetooth_device_context_pair_connect">"Associer et connecter"</string>
+ <string name="bluetooth_device_context_unpair">"Dissocier"</string>
+ <string name="bluetooth_device_context_disconnect_unpair">"Déconnecter et dissocier"</string>
+ <string name="bluetooth_device_context_connect_advanced">"Options…"</string>
+ <string name="bluetooth_connect_specific_profiles_title">"Se connecter à…"</string>
+ <string name="bluetooth_profile_a2dp">"Multimédia"</string>
+ <string name="bluetooth_profile_headset">"Téléphone"</string>
+ <string name="bluetooth_summary_connected_to_a2dp">"Connecté aux paramètres audio du média"</string>
+ <string name="bluetooth_summary_connected_to_headset">"Connecté aux paramètres audio du téléphone"</string>
+ <string name="bluetooth_summary_connected_to_a2dp_headset">"Connecté aux paramètres audio du téléphone et du média"</string>
+ <string name="bluetooth_device_advanced_title">"Options de <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_device_advanced_online_mode_title">"Se connecter"</string>
+ <string name="bluetooth_device_advanced_online_mode_summary">"Connecter à un appareil Bluetooth"</string>
+ <string name="bluetooth_device_advanced_profile_header_title">"Profils"</string>
+ <string name="bluetooth_a2dp_profile_summary_connected">"Connecté aux paramètres audio du média"</string>
+ <string name="bluetooth_headset_profile_summary_connected">"Connecté aux paramètres audio du téléphone"</string>
+ <string name="bluetooth_a2dp_profile_summary_use_for">"Utiliser pour les paramètres audio du média"</string>
+ <string name="bluetooth_headset_profile_summary_use_for">"Utiliser pour les paramètres audio du téléphone"</string>
+ <string name="wifi">"Wi-Fi"</string>
+ <string name="wifi_quick_toggle_title">"Wi-Fi"</string>
+ <string name="wifi_quick_toggle_summary">"Activer le Wi-Fi"</string>
+ <string name="wifi_settings">"Paramètres Wi-Fi"</string>
+ <string name="wifi_settings_category">"Paramètres Wi-Fi"</string>
+ <string name="wifi_settings_summary">"Configurer et gérer les points d\'accès sans fil"</string>
+ <string name="forget_network">"Retirer"</string>
+ <string name="wifi_status">"État"</string>
+ <string name="wifi_link_speed">"Vitesse"</string>
+ <string name="wifi_signal_3">"Excellente"</string>
+ <string name="wifi_signal_2">"Bonne"</string>
+ <string name="wifi_signal_1">"Satisfaisante"</string>
+ <string name="wifi_signal_0">"Faible"</string>
+ <string name="security">"Sécurité"</string>
+ <string name="wifi_security_open">"Ouvrir"</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">"Inconnu"</string>
+ <string name="wifi_security_verbose_open">"Ouvrir le réseau"</string>
+ <string name="wifi_security_verbose_wep">"Sécurisé avec une clé WEP"</string>
+ <string name="wifi_security_verbose_wpa">"Sécurisé par WPA"</string>
+ <string name="wifi_security_verbose_wpa2">"Sécurisé par WPA2"</string>
+ <string name="ip_address">"Adresse IP"</string>
+ <string name="signal">"Intensité du signal"</string>
+ <string name="wifi_starting">"Activation…"</string>
+ <string name="wifi_stopping">"Désactivation…"</string>
+ <string name="wifi_error">"Erreur"</string>
+ <string name="error_starting">"Impossible de lancer le Wi-Fi"</string>
+ <string name="error_stopping">"Impossible d\'interrompre la connexion Wi-Fi."</string>
+ <string name="error_scanning">"Impossible de rechercher des réseaux"</string>
+ <string name="error_connecting">"Impossible de se connecter au réseau."</string>
+ <string name="error_saving">"Impossible d\'enregistrer le réseau"</string>
+ <string name="connect">"Se connecter"</string>
+ <string name="connect_to_blank">"Connexion à <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+ <string name="please_type_passphrase">"Mot de passe sans fil"</string>
+ <string name="please_type_hex_key">"Touche hex WEP (0-9, A-F)"</string>
+ <string name="wifi_show_password">"Afficher le mot de passe"</string>
+ <string name="scan_wifi">"Rechercher"</string>
+ <string name="summary_not_in_range">"Hors de portée"</string>
+ <string name="summary_remembered">"Réseaux enregistrés"</string>
+ <string name="summary_connection_failed">"Échec de la connexion. Sélectionnez cette option pour réessayer."</string>
+ <string name="wifi_access_points">"Réseaux Wi-Fi"</string>
+ <string name="wifi_type_ssid">"SSID du réseau"</string>
+ <string name="wifi_security">"Sécurité"</string>
+ <string name="wifi_save_config">"Enregistrer"</string>
+ <string name="wifi_password_unchanged">"(aucune modification)"</string>
+ <string name="wifi_add_other_network">"Ajouter un réseau Wi-Fi"</string>
+ <string name="wifi_notify_open_networks">"Notification de réseau"</string>
+ <string name="wifi_notify_open_networks_summary">"Me notifier lorsqu\'un réseau ouvert est disponible"</string>
+ <string name="wifi_password_incorrect_error">"Le mot de passe réseau saisi est incorrect. Veuillez réessayer."</string>
+ <string name="wifi_generic_connection_error">"Un problème est survenu lors de la connexion au réseau. Veuillez réessayer."</string>
+ <string name="wifi_menu_advanced">"Avancés"</string>
+ <string name="wifi_ip_settings_titlebar">"Paramètres IP"</string>
+ <string name="wifi_ip_settings_menu_save">"Enregistrer"</string>
+ <string name="wifi_ip_settings_menu_cancel">"Annuler"</string>
+ <string name="wifi_ip_settings_invalid_ip">"Saisissez une adresse IP valide."</string>
+ <string name="wifi_use_static_ip">"Utiliser une IP fixe"</string>
+ <string name="wifi_ip_address">"Adresse IP"</string>
+ <string name="wifi_dns1">"DNS 1"</string>
+ <string name="wifi_dns2">"DNS 2"</string>
+ <string name="wifi_gateway">"Passerelle"</string>
+ <string name="wifi_netmask">"Masque de réseau"</string>
+ <string name="wifi_context_menu_connect">"Se connecter au réseau"</string>
+ <string name="wifi_context_menu_forget">"Retirer le réseau"</string>
+ <string name="wifi_context_menu_change_password">"Modifier le mot de passe"</string>
+ <string name="wifi_advanced_titlebar">"Avancés"</string>
+ <string name="wifi_setting_num_channels_title">"Domaine régulateur"</string>
+ <string name="wifi_setting_num_channels_summary">"Définir le nombre de canaux à utiliser"</string>
+ <string name="wifi_setting_num_channels_error">"Un problème est survenu lors du paramétrage du domaine régulateur."</string>
+ <string name="wifi_setting_num_channels_channel_phrase">"<xliff:g id="NUM_CHANNELS">%1$d</xliff:g> canaux"</string>
+ <string name="wifi_setting_sleep_policy_title">"Politique de veille Wi-Fi"</string>
+ <string name="wifi_setting_sleep_policy_summary">"Indiquer quand basculer du Wi-Fi sur le réseau de données mobile"</string>
+ <string name="wifi_setting_sleep_policy_error">"Un problème est survenu lors du paramétrage de la politique de veille."</string>
+ <string name="wifi_advanced_mac_address_title">"Adresses MAC"</string>
+ <string name="fragment_status_scanning">"Recherche…"</string>
+ <string name="fragment_status_connecting">"Connexion à <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</string>
+ <string name="fragment_status_authenticating">"Authentification auprès de <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</string>
+ <string name="fragment_status_obtaining_ip">"Récupération de l\'adresse IP à partir de <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</string>
+ <string name="fragment_status_connected">"Connecté à <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+ <string name="fragment_status_disconnecting">"Déconnexion de <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</string>
+ <string name="fragment_status_disconnected">"Déconnecté"</string>
+ <string name="fragment_status_failed">"Échec"</string>
+ <string name="status_scanning">"Recherche…"</string>
+ <string name="status_connecting">"Connexion…"</string>
+ <string name="status_authenticating">"Authentification…"</string>
+ <string name="status_obtaining_ip">"Récupération de l\'adresse…"</string>
+ <string name="status_connected">"Connecté"</string>
+ <string name="status_disconnecting">"Déconnexion…"</string>
+ <string name="status_disconnected">"Déconnecté"</string>
+ <string name="status_failed">"Échec"</string>
+ <string name="sound_and_display_settings">"Sons et affichage"</string>
+ <string name="sound_settings">"Paramètres sonores"</string>
+ <string name="sound_and_display_settings_summary">"Configurer les sonneries, les notifications et la luminosité de l\'écran"</string>
+ <string name="silent_mode_title">"Mode silencieux"</string>
+ <string name="silent_mode_summary">"Aucun son sauf pour le multimédia et le réveil"</string>
+ <string name="ringtone_title">"Sonnerie du téléphone"</string>
+ <string name="ringtone_summary">"Configurer la sonnerie par défaut pour les appels entrants"</string>
+ <string name="ring_volume_title">"Volume de la sonnerie"</string>
+ <string name="ring_volume_summary">"Régler le volume pour les appels entrants"</string>
+ <string name="vibrate_title">"Vibreur"</string>
+ <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 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>
+ <string name="media_volume_title">"Volume"</string>
+ <string name="media_volume_summary">"Régler le volume pour la musique et les vidéos"</string>
+ <string name="dtmf_tone_enable_title">"Tonalité touches audible"</string>
+ <string name="dtmf_tone_enable_summary_on">"Activer la tonalité des touches du clavier"</string>
+ <string name="dtmf_tone_enable_summary_off">"Activer la tonalité des touches du clavier"</string>
+ <string name="sound_effects_enable_title">"Sélections audibles"</string>
+ <string name="sound_effects_enable_summary_on">"Lire les sons lors des sélections à l\'écran"</string>
+ <string name="sound_effects_enable_summary_off">"Jouer un son lors des sélections à l\'écran"</string>
+ <string name="play_media_notification_sounds_enable_title">"Notifications de la carte SD"</string>
+ <string name="play_media_notification_sounds_enable_summary_on">"Désactiver les notifications sonores de la carte SD"</string>
+ <string name="play_media_notification_sounds_enable_summary_off">"Activer les notifications sonores de la carte SD"</string>
+ <string name="sync_settings">"Synchronisation des données"</string>
+ <string name="sync_settings_summary">"Sélectionner les applications à synchroniser"</string>
+ <string name="display_settings">"Afficher les paramètres"</string>
+ <string name="animations_title">"Animation"</string>
+ <string name="animations_summary_on">"Animation lors de l\'ouverture et la fermeture de fenêtres"</string>
+ <string name="animations_summary_off">"Animation lors de l\'ouverture et la fermeture de fenêtres"</string>
+ <string name="brightness">"Luminosité"</string>
+ <string name="brightness_summary">"Régler la luminosité de l\'écran"</string>
+ <string name="screen_timeout">"Mise en veille de l\'écran"</string>
+ <string name="screen_timeout_summary">"Définir le délai avant la mise hors tension automatique de l\'écran"</string>
+ <string name="sim_lock_settings">"Paramètres de blocage carte SIM"</string>
+ <string name="sim_lock_settings_category">"Configurer blocage SIM"</string>
+ <string name="sim_lock_settings_title">"Blocage de la carte SIM"</string>
+ <string name="sim_pin_toggle">"Bloquer la carte SIM"</string>
+ <string name="sim_lock_on">"Demander le code PIN pour utiliser le téléphone"</string>
+ <string name="sim_lock_off">"Demander le code PIN pour utiliser le téléphone"</string>
+ <string name="sim_pin_change">"Modifier PIN de la carte SIM"</string>
+ <string name="sim_enter_pin">"Code PIN de la carte SIM"</string>
+ <string name="sim_enable_sim_lock">"Bloquer la carte SIM"</string>
+ <string name="sim_disable_sim_lock">"Débloquer la carte SIM"</string>
+ <string name="sim_enter_old">"Ancien code PIN de la carte SIM"</string>
+ <string name="sim_enter_new">"Nouveau code PIN de la carte SIM"</string>
+ <string name="sim_reenter_new">"Confirmez le nouveau code PIN"</string>
+ <string name="sim_change_pin">"Code PIN de la carte SIM"</string>
+ <string name="sim_bad_pin">"Le code PIN est incorrect !"</string>
+ <string name="sim_pins_dont_match">"Les codes PIN ne correspondent pas !"</string>
+ <string name="sim_change_failed">"Impossible de modifier le code PIN."\n"Il se peut que ce code PIN soit incorrect."</string>
+ <string name="sim_change_succeeded">"Le code PIN de la carte SIM a été modifié."</string>
+ <string name="sim_lock_failed">"Impossible de changer l\'état de blocage de la carte SIM."\n"Il se peut que le code PIN soit incorrect."</string>
+ <string name="sim_enter_ok">"OK"</string>
+ <string name="sim_enter_cancel">"Annuler"</string>
+ <string name="device_info_settings">"État du téléphone"</string>
+ <string name="system_update_settings_list_item_title">"Mises à jour du système"</string>
+ <string name="system_update_settings_list_item_summary">"Rechercher des mises à jour du système"</string>
+ <string name="firmware_version">"Version du micrologiciel"</string>
+ <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 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">"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>
+ <string name="status_network_type">"Type de réseau mobile"</string>
+ <string name="status_data_state">"État du réseau mobile"</string>
+ <string name="status_service_state">"État du service"</string>
+ <string name="status_signal_strength">"Intensité du signal"</string>
+ <string name="status_roaming">"Itinérance"</string>
+ <string name="status_operator">"Réseau"</string>
+ <string name="status_wifi_mac_address">"Adresse MAC Wi-Fi"</string>
+ <string name="status_bt_address">"Adresse Bluetooth"</string>
+ <string name="status_unavailable">"Non disponible"</string>
+ <string name="status_network_traffic_stats">"Utilisation du réseau"</string>
+ <string name="status_network_traffic_summary">"Envoyés : <xliff:g id="NETWORK_TRAFFIC_0">%1$d packets, %2$d bytes%n</xliff:g> Reçus : <xliff:g id="NETWORK_TRAFFIC_1">%3$d packets, %4$d bytes</xliff:g>"</string>
+ <string name="status_up_time">"Durée d\'activité"</string>
+ <string name="status_awake_time">"Temps en activité"</string>
+ <string name="internal_memory">"Mémoire interne du téléphone"</string>
+ <string name="sd_memory">"Carte SD"</string>
+ <string name="memory_available">"Espace disponible"</string>
+ <string name="memory_size">"Espace total"</string>
+ <string name="sd_eject">"Désactiver la carte SD"</string>
+ <string name="sd_eject_summary">"Désactiver la carte SD pour la retirer en toute sécurité"</string>
+ <string name="sd_format">"Formater la carte SD"</string>
+ <string name="sd_format_summary">"Formater (effacer) la carte SD"</string>
+ <string name="sd_unavailable">"Non disponible"</string>
+ <string name="read_only">" (Lecture seule)"</string>
+ <string name="battery_status_title">"État de la batterie"</string>
+ <string name="battery_level_title">"Niveau de la batterie"</string>
+ <string name="apn_settings">"APN"</string>
+ <string name="apn_edit">"Modifier le point d\'accès"</string>
+ <string name="apn_not_set">"&lt;Non défini&gt;"</string>
+ <string name="apn_name">"Nom"</string>
+ <string name="apn_apn">"APN"</string>
+ <string name="apn_http_proxy">"Proxy"</string>
+ <string name="apn_http_port">"Port"</string>
+ <string name="apn_user">"Nom d\'utilisateur"</string>
+ <string name="apn_password">"Mot de passe"</string>
+ <string name="apn_server">"Serveur"</string>
+ <string name="apn_mmsc">"MMSC"</string>
+ <string name="apn_mms_proxy">"Proxy MMS"</string>
+ <string name="apn_mms_port">"Port MMS"</string>
+ <string name="apn_mcc">"MCC"</string>
+ <string name="apn_mnc">"MNC"</string>
+ <string name="apn_type">"Type d\'APN (nom du point d\'accès)"</string>
+ <string name="menu_delete">"Supprimer l\'APN"</string>
+ <string name="menu_new">"Nouvel APN"</string>
+ <string name="menu_save">"Enregistrer"</string>
+ <string name="menu_cancel">"Supprimer"</string>
+ <string name="error_title">"Attention"</string>
+ <string name="error_name_empty">"Le champ Nom doit être renseigné."</string>
+ <string name="error_apn_empty">"Le champ Nom de point d\'accès (APN) doit être renseigné."</string>
+ <string name="error_mcc_not3">"Le champ MCC doit contenir 3 chiffres."</string>
+ <string name="error_mnc_not23">"Le champ MNC doit contenir 2 ou 3 chiffres."</string>
+ <string name="master_clear_title">"Réinit. valeurs d\'usine"</string>
+ <string name="master_clear_summary">"Effacer toutes les données du téléphone"</string>
+ <string name="master_clear_desc">"Cette action réinitialisera le téléphone à ses valeurs d\'usine et effacera toutes les données et applications téléchargées !"</string>
+ <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 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>
+ <string name="media_format_desc">"Cette action effacera la carte SD du téléphone. TOUTES les données de la carte seront perdues !"</string>
+ <string name="media_format_button_text">"Formater la carte SD"</string>
+ <string name="media_format_final_desc">"Formater la carte SD en effaçant tout le contenu de la carte ? Impossible d\'annuler cette action !"</string>
+ <string name="media_format_final_button_text">"Tout effacer"</string>
+ <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, 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">"Sources pour Ma position"</string>
+ <string name="location_network_based">"Utiliser réseaux sans fil"</string>
+ <string name="location_networks_disabled">"Afficher la position géographique dans les applications (comme Google Maps) lors de l\'utilisation de réseaux sans fil"</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="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>
+ <string name="contributors_title">"Collaborateurs"</string>
+ <string name="copyright_title">"Copyright"</string>
+ <string name="license_title">"Licence"</string>
+ <string name="terms_title">"Conditions d\'utilisation"</string>
+ <string name="settings_license_activity_title">"Ouvrir licences 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">"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 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">"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">"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 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 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><b></b>"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>
+ <string name="applications_settings_summary">"Gérer les applications, configurer des raccourcis de lancement rapide"</string>
+ <string name="applications_settings_header">"Paramètres de l\'application"</string>
+ <string name="install_applications">"Sources inconnues"</string>
+ <string name="install_unknown_applications">"Autoriser l\'installation d\'applications ne provenant pas d\'Android Market"</string>
+ <string name="install_all_warning">"Votre téléphone et vos données personnelles sont très vulnérables face à des applications provenant de sources inconnues. Vous acceptez d\'être le seul responsable de tout dommage causé à votre téléphone ou de toute perte de données pouvant découler de l\'utilisation de telles applications."</string>
+ <string name="application_info_label">"Informations sur l\'application"</string>
+ <string name="storage_label">"Mémoire"</string>
+ <string name="auto_launch_label">"Lancer par défaut"</string>
+ <string name="permissions_label">"Autorisations"</string>
+ <string name="cache_header_label">"Cache"</string>
+ <string name="clear_cache_btn_text">"Effacer le cache"</string>
+ <string name="cache_size_label">"Cache"</string>
+ <string name="controls_label">"Commandes"</string>
+ <string name="force_stop">"Forcer l\'arrêt"</string>
+ <string name="total_size_label">"Total"</string>
+ <string name="application_size_label">"Application"</string>
+ <string name="data_size_label">"Données"</string>
+ <string name="uninstall_text">"Désinstaller"</string>
+ <string name="clear_user_data_text">"Effacer les données"</string>
+ <string name="auto_launch_enable_text">"Vous avez choisi de lancer cette application par défaut pour certaines actions."</string>
+ <string name="auto_launch_disable_text">"Aucun paramètre par défaut défini."</string>
+ <string name="clear_activities">"Effacer les actions par défaut"</string>
+ <string name="unknown">"Inconnu"</string>
+ <string name="sort_order_alpha">"Trier"</string>
+ <string name="sort_order_size">"Trier par taille"</string>
+ <string name="manage_space_text">"Gérer l\'espace"</string>
+ <string name="filter">"Filtrer"</string>
+ <string name="filter_dlg_title">"Options du filtre"</string>
+ <string name="filter_apps_all">"Tous"</string>
+ <string name="filter_apps_third_party">"Tiers"</string>
+ <string name="filter_apps_running">"En cours d\'exécution"</string>
+ <string name="loading">"Chargement..."</string>
+ <string name="recompute_size">"Calcul de la taille..."</string>
+ <string name="clear_data_dlg_title">"Supprimer"</string>
+ <string name="clear_data_dlg_text">"Toutes les informations enregistrées dans cette application seront définitivement supprimées."</string>
+ <string name="dlg_ok">"OK"</string>
+ <string name="dlg_cancel">"Annuler"</string>
+ <string name="app_not_found_dlg_title">"L\'application n\'a pas été trouvée."</string>
+ <string name="app_not_found_dlg_text">"L\'application n\'a pas été trouvée dans la liste des applications installées."</string>
+ <string name="clear_data_failed">"Impossible d\'effacer les données de l\'application."</string>
+ <string name="security_settings_desc">"Cette application peut accéder aux applications suivantes de votre téléphone :"</string>
+ <string name="computing_size">"Traitement..."</string>
+ <string name="invalid_size_value">"Impossible de calculer la taille du paquet."</string>
+ <string name="empty_list_msg">"Aucune application tierce n\'est installée sur votre téléphone."</string>
+ <string name="language_settings">"Par. régionaux et texte"</string>
+ <string name="language_settings_summary">"Définir la langue et la région, la saisie de texte et la correction automatique"</string>
+ <string name="language_category">"Paramètres régionaux"</string>
+ <string name="text_category">"Paramètres du texte"</string>
+ <string name="phone_language">"Langue et région"</string>
+ <string name="phone_language_summary">"Sélectionner une langue et un pays"</string>
+ <string name="auto_replace">"Remplacement auto"</string>
+ <string name="auto_replace_summary">"Corriger les mots mal saisis"</string>
+ <string name="auto_caps">"Majuscule auto"</string>
+ <string name="auto_caps_summary">"Mettre une majuscule en début de phrase"</string>
+ <string name="auto_punctuate">"Ponctuation auto"</string>
+ <string name="hardkeyboard_category">"Paramètres du clavier physique"</string>
+ <string name="auto_punctuate_summary">"Appuyez deux fois sur la touche Espace pour insérer \".\""</string>
+ <string name="show_password">"Mots de passe visibles"</string>
+ <string name="show_password_summary">"Afficher le mot de passe lors de la saisie"</string>
+ <string name="user_dict_settings_titlebar">"Dictionnaire personnel"</string>
+ <string name="user_dict_settings_title">"Dictionnaire personnel"</string>
+ <string name="user_dict_settings_summary">"Ajouter et retirer des mots du dictionnaire personnel"</string>
+ <string name="user_dict_settings_add_menu_title">"Ajouter"</string>
+ <string name="user_dict_settings_add_dialog_title">"Ajouter au dictionnaire"</string>
+ <string name="user_dict_settings_context_menu_edit_title">"Modifier"</string>
+ <string name="user_dict_settings_context_menu_delete_title">"Supprimer"</string>
+ <string name="user_dict_settings_empty_text">"Votre dictionnaire personnel ne contient aucun mot. Vous pouvez ajouter un mot via le menu."</string>
+ <string name="testing">"Test"</string>
+ <string name="testing_phone_info">"Informations sur le téléphone"</string>
+ <string name="testing_battery_info">"Informations sur la batterie"</string>
+ <string name="testing_battery_history">"Historique de la batterie"</string>
+ <string name="quick_launch_title">"Lancement rapide"</string>
+ <string name="quick_launch_summary">"Configurer des raccourcis clavier pour lancer des applications"</string>
+ <string name="quick_launch_assign_application">"Affecter une application"</string>
+ <string name="quick_launch_no_shortcut">"Aucun raccourci"</string>
+ <string name="quick_launch_shortcut">"Rechercher + <xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g>"</string>
+ <string name="quick_launch_clear_dialog_title">"Effacer"</string>
+ <string name="quick_launch_clear_dialog_message">"Vos raccourcis pour <xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g> (<xliff:g id="APPLICATION_NAME">%2$s</xliff:g>) vont être effacés."</string>
+ <string name="quick_launch_clear_ok_button">"OK"</string>
+ <string name="quick_launch_clear_cancel_button">"Annuler"</string>
+ <string name="quick_launch_display_mode_applications">"Applications"</string>
+ <string name="quick_launch_display_mode_shortcuts">"Raccourcis"</string>
+ <string name="input_methods_settings_title">"Saisie de texte"</string>
+ <string name="input_methods_settings_summary">"Gérer les options de saisie de texte"</string>
+ <string name="input_methods_settings_label_format">"Paramètres %s"</string>
+ <string name="development_settings_title">"Développement"</string>
+ <string name="development_settings_summary">"Définir les options pour le développement de l\'application"</string>
+ <string name="enable_adb">"Débogage USB"</string>
+ <string name="enable_adb_summary">"Mode débogage lorsqu\'un câble USB est connecté"</string>
+ <string name="keep_screen_on">"Rester activé"</string>
+ <string name="keep_screen_on_summary">"L\'écran ne se met jamais en veille lors du chargement"</string>
+ <string name="allow_mock_location">"Autoriser les positions géographiques fictives"</string>
+ <string name="allow_mock_location_summary">"Positions fictives"</string>
+ <!-- no translation found for gadget_picker_title (98374951396755811) -->
+ <skip />
+ <!-- no translation found for widget_picker_title (9130684134213467557) -->
+ <skip />
+ <string name="battery_history_details_for">"Détails de l\'UID %d"</string>
+ <string name="battery_history_uid">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
+ <string name="battery_history_network_usage">"Données d\'utilisation du réseau pour <xliff:g id="APP_NAME">%1$s</xliff:g> :"</string>
+ <string name="battery_history_bytes_received">"Octets reçus : <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_sent">"Octets envoyés :<xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_total">"Octets au total :<xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_cpu_usage">"Données d\'utilisation de l\'UC pour <xliff:g id="APP_NAME">%1$s</xliff:g> :"</string>
+ <string name="battery_history_user_time">"Heure utilisateur :"</string>
+ <string name="battery_history_system_time">"Heure système :"</string>
+ <string name="battery_history_total_time">"Temps total :"</string>
+ <string name="battery_history_starts">"Démarrages : <xliff:g id="STARTS">%1$d</xliff:g>"</string>
+ <string name="battery_history_days">"<xliff:g id="DAYS">%1$d</xliff:g> jours, <xliff:g id="HOURS">%2$d</xliff:g> heures, <xliff:g id="MINUTES">%3$d</xliff:g> minutes, <xliff:g id="SECONDS">%4$d</xliff:g> secondes"</string>
+ <string name="battery_history_hours">"<xliff:g id="HOURS">%1$d</xliff:g> heures, <xliff:g id="MINUTES">%2$d</xliff:g> minutes, <xliff:g id="SECONDS">%3$d</xliff:g> secondes"</string>
+ <string name="battery_history_minutes">"<xliff:g id="MINUTES">%1$d</xliff:g> minutes, <xliff:g id="SECONDS">%2$d</xliff:g> secondes"</string>
+ <string name="battery_history_seconds">"<xliff:g id="SECONDS">%1$d</xliff:g> secondes"</string>
+ <string name="battery_history_packages_sharing_this_uid">"Paquets partageant cet UID :"</string>
+ <string name="battery_history_no_data">"Aucune donnée sur l\'utilisation de la batterie disponible"</string>
+ <string name="battery_history_sensor">"Capteur :"</string>
+ <!-- no translation found for battery_history_wakelock (608683447522396293) -->
+ <skip />
+ <string name="battery_history_used_by_packages">"Capteur utilisé par les kits :"</string>
+ <string name="battery_history_sensor_usage">"Utilisé <xliff:g id="COUNT">%1$d</xliff:g> fois par <xliff:g id="PACKAGE">%2$s</xliff:g>"</string>
+ <string name="battery_history_sensor_usage_multi">"Utilisé <xliff:g id="COUNT">%1$d</xliff:g> fois par l\'une des applications suivantes :"</string>
+ <!-- no translation found for battery_history_awake_label (8449792868990080882) -->
+ <skip />
+ <!-- no translation found for battery_history_screen_on_label (1848936521786339362) -->
+ <skip />
+ <!-- no translation found for battery_history_phone_on_label (700191958853142297) -->
+ <skip />
+ <!-- no translation found for battery_history_awake (4350886665719031057) -->
+ <skip />
+ <string name="battery_history_screen_on">"Temps utilisé avec l\'écran activé :"</string>
+ <!-- no translation found for battery_history_phone_on (4891504401623839532) -->
+ <skip />
+ <string name="battery_history_screen_on_battery">"Sur la batterie :"</string>
+ <string name="battery_history_screen_on_plugged">"Branchée :"</string>
+ <string name="usage_stats_label">"Données statistiques"</string>
+ <string name="testing_usage_stats">"Données statistiques"</string>
+ <string name="display_order_text">"Trier par :"</string>
+ <string name="app_name_label">"Application"</string>
+ <string name="launch_count_label">"Nombre"</string>
+ <string name="usage_time_label">"Temps d\'utilisation"</string>
+</resources>
diff --git a/res/values-it-nokeys/strings.xml b/res/values-it-nokeys/strings.xml
new file mode 100644
index 0000000..c056f02
--- /dev/null
+++ b/res/values-it-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">"Gestisci applicazioni"</string>
+</resources>
diff --git a/res/values-it/arrays.xml b/res/values-it/arrays.xml
new file mode 100644
index 0000000..b27d0c6
--- /dev/null
+++ b/res/values-it/arrays.xml
@@ -0,0 +1,72 @@
+<?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>"America"</item>
+ <item>"Europa"</item>
+ <item>"Africa"</item>
+ <item>"Asia"</item>
+ <item>"Australia"</item>
+ <item>"Pacifico"</item>
+ <item>"Tutte"</item>
+ </string-array>
+ <string-array name="screen_timeout_entries">
+ <item>"15 secondi"</item>
+ <item>"30 secondi"</item>
+ <item>"1 minuto"</item>
+ <item>"2 minuti"</item>
+ <item>"10 minuti"</item>
+ <item>"Mai timeout"</item>
+ </string-array>
+ <string-array name="wifi_security_entries">
+ <item>"Automatico"</item>
+ <item>"Nessuna"</item>
+ <item>"WEP"</item>
+ <item>"WPA Personal"</item>
+ <item>"WPA2 Personal"</item>
+ </string-array>
+ <string-array name="wifi_security_without_auto_entries">
+ <item>"Nessuna"</item>
+ <item>"WEP"</item>
+ <item>"WPA Personal"</item>
+ <item>"WPA2 Personal"</item>
+ </string-array>
+ <string-array name="wifi_wep_type">
+ <item>"Automatico"</item>
+ <item>"WEP ASCII"</item>
+ <item>"WEP esadecimale"</item>
+ </string-array>
+ <string-array name="wifi_sleep_policy_entries">
+ <item>"Quando lo schermo si disattiva"</item>
+ <item>"Mai quando collegato"</item>
+ <item>"Mai"</item>
+ </string-array>
+ <!-- no translation found for battery_history_type_spinner:0 (2193799199027871385) -->
+ <!-- no translation found for battery_history_type_spinner:1 (6401018715947316517) -->
+ <!-- no translation found for battery_history_type_spinner:2 (188092590354892392) -->
+ <!-- no translation found for battery_history_type_spinner:3 (8414109131222049141) -->
+ <!-- no translation found for battery_history_type_spinner:4 (1327904325081257093) -->
+ <!-- no translation found for battery_history_type_spinner:5 (4832254146664706277) -->
+ <!-- no translation found for battery_history_which_spinner:0 (3451981114763440074) -->
+ <!-- no translation found for battery_history_which_spinner:1 (166936313535197598) -->
+ <!-- no translation found for battery_history_which_spinner:2 (4793941382744963893) -->
+ <string-array name="usage_stats_display_order_types">
+ <item>"Tempo di utilizzo"</item>
+ <item>"Conteggio avvii"</item>
+ <item>"Nome applicazione"</item>
+ </string-array>
+</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
new file mode 100644
index 0000000..24efd38
--- /dev/null
+++ b/res/values-it/strings.xml
@@ -0,0 +1,671 @@
+<?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">"Sconosciuto"</string>
+ <string name="turn_on_radio">"Attiva segnale cellulare"</string>
+ <string name="turn_off_radio">"Disattiva segnale cellulare"</string>
+ <string name="turn_on_qxdm">"Attiva log SD QXDM"</string>
+ <string name="turn_off_qxdm">"Disattiva log SD QXDM"</string>
+ <string name="radioInfo_menu_viewADN">"Visualizza rubrica SIM"</string>
+ <string name="radioInfo_menu_viewFDN">"Visualizza numeri selezione fissa"</string>
+ <string name="radioInfo_menu_viewSDN">"Visualizza numeri dell\'elenco dei numeri di servizio"</string>
+ <string name="radioInfo_menu_getPDP">"Ottieni elenco PDP"</string>
+ <string name="radioInfo_menu_enableData">"Attiva connessione dati"</string>
+ <string name="radioInfo_menu_disableData">"Disattiva connessione dati"</string>
+ <string name="radioInfo_menu_enableDataOnBoot">"Attiva dati all\'avvio"</string>
+ <string name="radioInfo_menu_disableDataOnBoot">"Disattiva dati all\'avvio"</string>
+ <string name="radioInfo_service_in">"In servizio"</string>
+ <string name="radioInfo_service_out">"Fuori servizio"</string>
+ <string name="radioInfo_service_emergency">"Solo chiamate di emergenza"</string>
+ <string name="radioInfo_service_off">"Segnale cellulare disattivato"</string>
+ <string name="radioInfo_roaming_in">"Roaming"</string>
+ <string name="radioInfo_roaming_not">"Non roaming"</string>
+ <string name="radioInfo_phone_idle">"Inattivo"</string>
+ <string name="radioInfo_phone_ringing">"Chiamata in corso"</string>
+ <string name="radioInfo_phone_offhook">"Chiamata in corso"</string>
+ <string name="radioInfo_data_disconnected">"Disconnesso"</string>
+ <string name="radioInfo_data_connecting">"Connessione"</string>
+ <string name="radioInfo_data_connected">"Connesso"</string>
+ <string name="radioInfo_data_suspended">"Sospeso"</string>
+ <string name="radioInfo_unknown">"sconosciuto"</string>
+ <string name="radioInfo_display_packets">"pkt"</string>
+ <string name="radioInfo_display_bytes">"byte"</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">"Smonta scheda SD"</string>
+ <string name="sdcard_format">"Formatta scheda SD"</string>
+ <string name="small_font">"Piccole"</string>
+ <string name="medium_font">"Medie"</string>
+ <string name="large_font">"Grandi"</string>
+ <string name="font_size_save">"OK"</string>
+ <string name="sdcard_setting">"Scheda SD"</string>
+ <string name="battery_info_status_label">"Stato batteria:"</string>
+ <string name="battery_info_scale_label">"Scala batteria:"</string>
+ <string name="battery_info_level_label">"Livello batteria:"</string>
+ <string name="battery_info_health_label">"Condizioni batteria:"</string>
+ <string name="battery_info_technology_label">"Tecnologia batteria:"</string>
+ <string name="battery_info_voltage_label">"Voltaggio batteria:"</string>
+ <string name="battery_info_voltage_units">"mV"</string>
+ <string name="battery_info_temperature_label">"Temperatura batteria:"</string>
+ <string name="battery_info_temperature_units">"°C"</string>
+ <string name="battery_info_uptime">"Tempo dall\'avvio:"</string>
+ <string name="battery_info_awake_battery">"Tempo di attività con batteria:"</string>
+ <string name="battery_info_awake_plugged">"Tempo di attività sotto carica:"</string>
+ <string name="battery_info_screen_on">"Tempo accensione schermo:"</string>
+ <string name="battery_info_status_unknown">"Sconosciuta"</string>
+ <string name="battery_info_status_charging">"In carica"</string>
+ <string name="battery_info_status_charging_ac">"(CA)"</string>
+ <string name="battery_info_status_charging_usb">"(USB)"</string>
+ <string name="battery_info_status_discharging">"Quasi scarica"</string>
+ <string name="battery_info_status_not_charging">"Non in carica"</string>
+ <string name="battery_info_status_full">"Carica"</string>
+ <string name="battery_info_health_unknown">"Sconosciuto"</string>
+ <string name="battery_info_health_good">"Buono"</string>
+ <string name="battery_info_health_overheat">"Surriscaldamento"</string>
+ <string name="battery_info_health_dead">"Scarica"</string>
+ <string name="battery_info_health_over_voltage">"Sovratensione"</string>
+ <string name="battery_info_health_unspecified_failure">"Errore sconosciuto"</string>
+ <string name="bluetooth">"Bluetooth"</string>
+ <string name="bluetooth_visibility">"Rilevabile"</string>
+ <string name="bluetooth_is_discoverable">"Rilevabile per <xliff:g id="DISCOVERABLE_TIME_PERIOD">%1$s</xliff:g> secondi..."</string>
+ <string name="bluetooth_not_discoverable">"Rendi rilevabile il dispositivo"</string>
+ <string name="bluetooth_devices">"Dispositivi Bluetooth"</string>
+ <string name="bluetooth_device_name">"Nome dispositivo"</string>
+ <string name="bluetooth_name_not_set">"Nessun nome impostato, utilizzando il nome dell\'account"</string>
+ <string name="bluetooth_scan_for_devices">"Cerca dispositivi"</string>
+ <string name="bluetooth_disconnect_blank">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> verrà disconnesso."</string>
+ <string name="bluetooth_connected">"Connesso"</string>
+ <string name="bluetooth_disconnected">"Disconnesso"</string>
+ <string name="bluetooth_disconnecting">"Disconnessione..."</string>
+ <string name="bluetooth_connecting">"Connessione..."</string>
+ <!-- no translation found for bluetooth_unknown (1905151516611093010) -->
+ <skip />
+ <string name="bluetooth_not_connected">"Accoppia con il dispositivo"</string>
+ <string name="bluetooth_pairing">"Accoppiamento..."</string>
+ <string name="bluetooth_paired">"Accoppiati ma non connessi"</string>
+ <string name="bluetooth_device">"vivavoce/auricolare"</string>
+ <string name="progress_scanning">"Ricerca"</string>
+ <string name="bluetooth_notif_ticker">"Richiesta accoppiamento Bluetooth"</string>
+ <string name="bluetooth_notif_title">"Richiesta accoppiamento"</string>
+ <string name="bluetooth_notif_message">"Seleziona per accoppiare "</string>
+ <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="choose_timezone">"Seleziona fuso orario"</string>
+ <string name="display_preview_label">"Anteprima:"</string>
+ <string name="display_font_size_label">"Dimensioni carattere:"</string>
+ <!-- no translation found for intent_sender_data_label (8363026381459131554) -->
+ <skip />
+ <string name="intent_sender_sendbroadcast_text">"Invia <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">"Inizia <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">"Account:"</string>
+ <string name="proxy_clear_text">"Cancella"</string>
+ <string name="proxy_port_label">"Porta"</string>
+ <string name="proxy_defaultView_text">"Ripristina predefinite"</string>
+ <string name="proxy_action_text">"Salva"</string>
+ <string name="proxy_hostname_label">"Nome host"</string>
+ <string name="proxy_error">"Attenzione"</string>
+ <string name="proxy_error_dismiss">"OK"</string>
+ <string name="proxy_error_invalid_host">"Il nome host specificato non è valido."</string>
+ <string name="proxy_error_empty_port">"Inserisci un valore nel campo Porta."</string>
+ <string name="proxy_error_empty_host_set_port">"Il campo Porta deve essere vuoto se il campo Host è vuoto."</string>
+ <string name="proxy_error_invalid_port">"La porta specificata non è valida."</string>
+ <string name="radio_info_signal_location_label">"Posizione:"</string>
+ <string name="radio_info_neighboring_location_label">"CID adiacente:"</string>
+ <string name="radio_info_data_attempts_label">"Tentativi dati:"</string>
+ <string name="radio_info_gprs_service_label">"Servizio 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">"Reindirizzamento chiamate:"</string>
+ <string name="radio_info_ppp_resets_label">"Numero di PPP reimpostati dall\'avvio:"</string>
+ <string name="radio_info_gsm_disconnects_label">"Disconnessioni GSM:"</string>
+ <string name="radio_info_current_network_label">"Rete corrente:"</string>
+ <string name="radio_info_data_successes_label">"Dati riusciti:"</string>
+ <string name="radio_info_ppp_received_label">"PPP ricevuto:"</string>
+ <string name="radio_info_gsm_service_label">"Servizio GSM:"</string>
+ <string name="radio_info_signal_strength_label">"Intensità segnale:"</string>
+ <string name="radio_info_call_status_label">"Stato chiamata:"</string>
+ <string name="radio_info_ppp_sent_label">"PPP inviato:"</string>
+ <string name="radio_info_radio_resets_label">"Reimpostaz. segnale cellulare:"</string>
+ <string name="radio_info_message_waiting_label">"Messaggio in attesa:"</string>
+ <string name="radio_info_phone_number_label">"Numero di telefono:"</string>
+ <string name="radio_info_band_mode_label">"Seleziona banda radio"</string>
+ <string name="radio_info_network_type_label">"Tipo di rete:"</string>
+ <string name="radio_info_set_perferred_label">"Imposta tipo di rete preferito:"</string>
+ <string name="radio_info_ping_ipaddr">"Indir. IP ping:"</string>
+ <string name="radio_info_ping_hostname">"Nome host ping (www.google.com):"</string>
+ <string name="radio_info_http_client_test">"Test client HTTP:"</string>
+ <string name="radio_info_toggle_ciph_label">"Attiva/disattiva cifratura"</string>
+ <string name="ping_test_label">"Esegui test ping"</string>
+ <string name="radio_info_smsc_label">"SMSC:"</string>
+ <string name="radio_info_smsc_update_label">"Aggiorna"</string>
+ <string name="radio_info_smsc_refresh_label">"Aggiorna"</string>
+ <string name="radio_info_toggle_dns_check_label">"Attiva o disattiva verifica DNS"</string>
+ <string name="band_mode_title">"Imposta banda GSM/UMTS"</string>
+ <string name="band_mode_loading">"Caricamento lista bande..."</string>
+ <string name="band_mode_set">"Imposta"</string>
+ <string name="band_mode_failed">"Non riuscita"</string>
+ <string name="band_mode_succeeded">"Riuscita"</string>
+ <string name="sdcard_changes_instructions">"Le modifiche saranno effettive alla riconnessione del cavo USB"</string>
+ <string name="sdcard_settings_screen_mass_storage_text">"Attiva archiviazione di massa USB"</string>
+ <string name="sdcard_settings_total_bytes_label">"Byte totali:"</string>
+ <string name="sdcard_settings_not_present_status">"Nessuna scheda SD"</string>
+ <string name="sdcard_settings_available_bytes_label">"Byte disponibili:"</string>
+ <string name="sdcard_settings_mass_storage_status">"Scheda SD in uso come dispositivo di archiviazione di massa"</string>
+ <string name="sdcard_settings_unmounted_status">"È ora possibile rimuovere la scheda SD"</string>
+ <string name="sdcard_settings_bad_removal_status">"La scheda SD è stata rimossa quando ancora in uso."</string>
+ <string name="sdcard_settings_used_bytes_label">"Byte utilizzati:"</string>
+ <string name="sdcard_settings_scanning_status">"Ricerca di media nella scheda SD..."</string>
+ <string name="sdcard_settings_read_only_status">"La scheda SD montata è di sola lettura"</string>
+ <string name="next_label">"Avanti"</string>
+ <string name="language_picker_title">"Impostazioni internazionali"</string>
+ <string name="select_your_language">"Seleziona la lingua"</string>
+ <string name="activity_picker_label">"Seleziona attività"</string>
+ <string name="device_info_label">"Info dispositivo"</string>
+ <string name="battery_info_label">"Info batteria"</string>
+ <string name="battery_history_label">"Cronologia batteria"</string>
+ <string name="display_label">"Display"</string>
+ <string name="phone_info_label">"Info telefono"</string>
+ <string name="sd_card_settings_label">"Scheda SD"</string>
+ <string name="proxy_settings_label">"Impostazioni proxy"</string>
+ <string name="cancel">"Annulla"</string>
+ <string name="settings_label">"Impostazioni"</string>
+ <string name="airplane_mode">"Modalità aereo"</string>
+ <string name="airplane_mode_summary">"Disattiva tutte le connessioni wireless"</string>
+ <string name="airplane_mode_turning_on">"Disattivazione connessioni wireless..."</string>
+ <string name="airplane_mode_turning_off">"Attivazione connessioni wireless..."</string>
+ <string name="radio_controls_title">"Controlli wireless"</string>
+ <string name="radio_controls_summary">"Gestisci Wi-Fi, Bluetooth, modalità aereo e reti mobili"</string>
+ <string name="date_and_time_settings_title">"Data e ora"</string>
+ <string name="date_and_time_settings_summary">"Imposta data, ora, fuso orario e formati"</string>
+ <string name="date_time_auto">"Automatiche"</string>
+ <string name="date_time_auto_summaryOn">"Usa valori della rete"</string>
+ <string name="date_time_auto_summaryOff">"Usa valori della rete"</string>
+ <string name="date_time_24hour">"Usa formato 24 ore"</string>
+ <string name="date_time_set_time">"Imposta ora"</string>
+ <string name="date_time_set_timezone">"Seleziona fuso orario"</string>
+ <string name="date_time_set_date">"Imposta data"</string>
+ <string name="date_time_date_format">"Seleziona formato data"</string>
+ <string name="zone_list_menu_sort_alphabetically">"Ordine alfabetico"</string>
+ <string name="zone_list_menu_sort_by_timezone">"Ordina per fuso orario"</string>
+ <string name="security_settings_title">"Protezione e posizione"</string>
+ <string name="security_settings_summary">"Imposta posizione, sblocco schermo, blocco della SIM"</string>
+ <string name="security_passwords_title">"Password"</string>
+ <string name="bluetooth_quick_toggle_title">"Bluetooth"</string>
+ <string name="bluetooth_quick_toggle_summary">"Attiva Bluetooth"</string>
+ <string name="bluetooth_settings">"Impostazioni Bluetooth"</string>
+ <string name="bluetooth_settings_title">"Impostazioni Bluetooth"</string>
+ <string name="bluetooth_settings_summary">"Gestisci le connessioni, imposta il nome e la rilevabilità del dispositivo"</string>
+ <string name="bluetooth_pin_entry">"Richiesta accoppiamento Bluetooth"</string>
+ <string name="bluetooth_device_info">"Info dispositivo Bluetooth"</string>
+ <string name="bluetooth_enter_pin_msg">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"\n\n"Digita il PIN per l\'accoppiamento."\n"Prova a usare 0000 o 1234."</string>
+ <string name="bluetooth_error_title">"Attenzione"</string>
+ <string name="bluetooth_pairing_error_message">"Errore durante l\'accoppiamento con <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+ <string name="bluetooth_pairing_pin_error_message">"Errore durante l\'accoppiamento con <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Il PIN digitato è errato."</string>
+ <string name="bluetooth_connecting_error_message">"Errore durante la connessione a <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+ <string name="bluetooth_preference_scan_title">"Cerca dispositivi"</string>
+ <string name="bluetooth_device_context_connect">"Connetti"</string>
+ <string name="bluetooth_device_context_disconnect">"Disconnetti"</string>
+ <string name="bluetooth_device_context_pair_connect">"Accoppia e connetti"</string>
+ <string name="bluetooth_device_context_unpair">"Disaccoppia"</string>
+ <string name="bluetooth_device_context_disconnect_unpair">"Disconnetti e disaccoppia"</string>
+ <string name="bluetooth_device_context_connect_advanced">"Opzioni..."</string>
+ <string name="bluetooth_connect_specific_profiles_title">"Connessione a…"</string>
+ <string name="bluetooth_profile_a2dp">"Media"</string>
+ <string name="bluetooth_profile_headset">"Telefono"</string>
+ <string name="bluetooth_summary_connected_to_a2dp">"Collegato ad audio media"</string>
+ <string name="bluetooth_summary_connected_to_headset">"Collegato ad audio telefono"</string>
+ <string name="bluetooth_summary_connected_to_a2dp_headset">"Collegato ad audio telefono e media"</string>
+ <string name="bluetooth_device_advanced_title">"Opzioni <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_device_advanced_online_mode_title">"Connetti"</string>
+ <string name="bluetooth_device_advanced_online_mode_summary">"Connessione a dispositivo Bluetooth"</string>
+ <string name="bluetooth_device_advanced_profile_header_title">"Profili"</string>
+ <string name="bluetooth_a2dp_profile_summary_connected">"Collegato ad audio media"</string>
+ <string name="bluetooth_headset_profile_summary_connected">"Collegato ad audio telefono"</string>
+ <string name="bluetooth_a2dp_profile_summary_use_for">"Usa per audio media"</string>
+ <string name="bluetooth_headset_profile_summary_use_for">"Usa per audio telefono"</string>
+ <string name="wifi">"Wi-Fi"</string>
+ <string name="wifi_quick_toggle_title">"Wi-Fi"</string>
+ <string name="wifi_quick_toggle_summary">"Attiva Wi-Fi"</string>
+ <string name="wifi_settings">"Impostazioni Wi-Fi"</string>
+ <string name="wifi_settings_category">"Impostazioni Wi-Fi"</string>
+ <string name="wifi_settings_summary">"Configura e gestisci punti di accesso wireless"</string>
+ <string name="forget_network">"Elimina"</string>
+ <string name="wifi_status">"Stato"</string>
+ <string name="wifi_link_speed">"Velocità"</string>
+ <string name="wifi_signal_3">"Eccellente"</string>
+ <string name="wifi_signal_2">"Buona"</string>
+ <string name="wifi_signal_1">"Discreta"</string>
+ <string name="wifi_signal_0">"Scarsa"</string>
+ <string name="security">"Protezione"</string>
+ <string name="wifi_security_open">"Apri"</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">"Sconosciuta"</string>
+ <string name="wifi_security_verbose_open">"Rete aperta"</string>
+ <string name="wifi_security_verbose_wep">"Protetta con WEP"</string>
+ <string name="wifi_security_verbose_wpa">"Protetta con WPA"</string>
+ <string name="wifi_security_verbose_wpa2">"Protetta con WPA2"</string>
+ <string name="ip_address">"Indirizzo IP"</string>
+ <string name="signal">"Intensità segnale"</string>
+ <string name="wifi_starting">"Attivazione..."</string>
+ <string name="wifi_stopping">"Spegnimento..."</string>
+ <string name="wifi_error">"Errore"</string>
+ <string name="error_starting">"Impossibile avviare Wi-Fi"</string>
+ <string name="error_stopping">"Impossibile interrompere Wi-Fi"</string>
+ <string name="error_scanning">"Impossibile cercare le reti"</string>
+ <string name="error_connecting">"Impossibile connettersi alla rete"</string>
+ <string name="error_saving">"Impossibile salvare la rete"</string>
+ <string name="connect">"Connetti"</string>
+ <string name="connect_to_blank">"Connessione a <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+ <string name="please_type_passphrase">"Password wireless"</string>
+ <string name="please_type_hex_key">"Chiave esadecimale WEP (0-9, A-F)"</string>
+ <string name="wifi_show_password">"Mostra password."</string>
+ <string name="scan_wifi">"Scansione"</string>
+ <string name="summary_not_in_range">"Fuori portata"</string>
+ <string name="summary_remembered">"Memorizzata"</string>
+ <string name="summary_connection_failed">"Connessione non riuscita. Seleziona per riprovare"</string>
+ <string name="wifi_access_points">"Reti Wi-Fi"</string>
+ <string name="wifi_type_ssid">"SSID rete"</string>
+ <string name="wifi_security">"Protezione"</string>
+ <string name="wifi_save_config">"Salva"</string>
+ <string name="wifi_password_unchanged">"(invariato)"</string>
+ <string name="wifi_add_other_network">"Aggiungi rete Wi-Fi"</string>
+ <string name="wifi_notify_open_networks">"Notifica rete"</string>
+ <string name="wifi_notify_open_networks_summary">"Avvisa quando è disponibile una rete aperta"</string>
+ <string name="wifi_password_incorrect_error">"La password di rete digitata è errata. Riprova."</string>
+ <string name="wifi_generic_connection_error">"Errore durante la connessione alla rete. Riprova."</string>
+ <string name="wifi_menu_advanced">"Avanzate"</string>
+ <string name="wifi_ip_settings_titlebar">"Impostazioni IP"</string>
+ <string name="wifi_ip_settings_menu_save">"Salva"</string>
+ <string name="wifi_ip_settings_menu_cancel">"Annulla"</string>
+ <string name="wifi_ip_settings_invalid_ip">"Digita un indirizzo IP valido."</string>
+ <string name="wifi_use_static_ip">"Usa IP statico"</string>
+ <string name="wifi_ip_address">"Indirizzo IP"</string>
+ <string name="wifi_dns1">"DNS 1"</string>
+ <string name="wifi_dns2">"DNS 2"</string>
+ <string name="wifi_gateway">"Gateway"</string>
+ <string name="wifi_netmask">"Maschera di rete"</string>
+ <string name="wifi_context_menu_connect">"Connetti a rete"</string>
+ <string name="wifi_context_menu_forget">"Elimina rete"</string>
+ <string name="wifi_context_menu_change_password">"Cambia password"</string>
+ <string name="wifi_advanced_titlebar">"Avanzate"</string>
+ <string name="wifi_setting_num_channels_title">"Dominio regolatore"</string>
+ <string name="wifi_setting_num_channels_summary">"Imposta il numero di canali da usare"</string>
+ <string name="wifi_setting_num_channels_error">"Errore durante l\'impostazione del dominio regolatore."</string>
+ <string name="wifi_setting_num_channels_channel_phrase">"<xliff:g id="NUM_CHANNELS">%1$d</xliff:g> canali"</string>
+ <string name="wifi_setting_sleep_policy_title">"Criteri di sospensione Wi-Fi"</string>
+ <string name="wifi_setting_sleep_policy_summary">"Specifica quando passare da Wi-Fi a dati cellulare"</string>
+ <string name="wifi_setting_sleep_policy_error">"Errore durante l\'impostazione dei criteri di sospensione."</string>
+ <string name="wifi_advanced_mac_address_title">"Indirizzo MAC"</string>
+ <string name="fragment_status_scanning">"Ricerca..."</string>
+ <string name="fragment_status_connecting">"Connessione a <xliff:g id="NETWORK_NAME">%1$s</xliff:g>..."</string>
+ <string name="fragment_status_authenticating">"Autenticazione con <xliff:g id="NETWORK_NAME">%1$s</xliff:g>..."</string>
+ <string name="fragment_status_obtaining_ip">"Acquisizione indirizzo IP da <xliff:g id="NETWORK_NAME">%1$s</xliff:g>..."</string>
+ <string name="fragment_status_connected">"Connesso a <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+ <string name="fragment_status_disconnecting">"Disconnessione da <xliff:g id="NETWORK_NAME">%1$s</xliff:g>..."</string>
+ <string name="fragment_status_disconnected">"Disconnesso"</string>
+ <string name="fragment_status_failed">"Non riuscita"</string>
+ <string name="status_scanning">"Ricerca..."</string>
+ <string name="status_connecting">"Connessione..."</string>
+ <string name="status_authenticating">"Autenticazione..."</string>
+ <string name="status_obtaining_ip">"Acquisizione indirizzo..."</string>
+ <string name="status_connected">"Connesso"</string>
+ <string name="status_disconnecting">"Disconnessione..."</string>
+ <string name="status_disconnected">"Disconnesso"</string>
+ <string name="status_failed">"Non riuscita"</string>
+ <string name="sound_and_display_settings">"Audio e display"</string>
+ <string name="sound_settings">"Impostazioni audio"</string>
+ <string name="sound_and_display_settings_summary">"Imposta suonerie, notifiche e luminosità dello schermo"</string>
+ <string name="silent_mode_title">"Modalità silenziosa"</string>
+ <string name="silent_mode_summary">"Tutti i suoni eccetto quelli multimediali verranno disattivati"</string>
+ <string name="ringtone_title">"Suoneria telefono"</string>
+ <string name="ringtone_summary">"Imposta la suoneria predefinita delle chiamate in entrata"</string>
+ <string name="ring_volume_title">"Volume suoneria"</string>
+ <string name="ring_volume_summary">"Imposta il volume delle chiamate in entrata e delle notifiche"</string>
+ <string name="vibrate_title">"Vibrazione telefono"</string>
+ <string name="vibrate_summary">"Vibrazione per chiamate in entrata"</string>
+ <string name="notification_sound_title">"Suoneria notifiche"</string>
+ <string name="notification_sound_summary">"Imposta la suoneria di notifica predefinita"</string>
+ <string name="incoming_call_volume_title">"Volume chiamate in entrata"</string>
+ <string name="notification_volume_title">"Volume notifiche"</string>
+ <string name="checkbox_notification_same_as_incoming_call">"Usa volume chiamate in entrata per le notifiche"</string>
+ <string name="notification_sound_dialog_title">"Seleziona suoneria notifica"</string>
+ <string name="media_volume_title">"Volume app. multimediali"</string>
+ <string name="media_volume_summary">"Imposta il volume di musica e video"</string>
+ <string name="dtmf_tone_enable_title">"Toni udibili al tocco"</string>
+ <string name="dtmf_tone_enable_summary_on">"Riproduci toni durante la composizione"</string>
+ <string name="dtmf_tone_enable_summary_off">"Riproduci toni durante la composizione"</string>
+ <string name="sound_effects_enable_title">"Selezione sonora"</string>
+ <string name="sound_effects_enable_summary_on">"Riproduci toni durante una selezione sullo schermo"</string>
+ <string name="sound_effects_enable_summary_off">"Riproduci toni durante una selezione sullo schermo"</string>
+ <string name="play_media_notification_sounds_enable_title">"Notifiche scheda SD"</string>
+ <string name="play_media_notification_sounds_enable_summary_on">"Disattiva i suoni di notifica della scheda SD"</string>
+ <string name="play_media_notification_sounds_enable_summary_off">"Attiva suoni di notifica della scheda SD"</string>
+ <string name="sync_settings">"Sincronizzazione dati"</string>
+ <string name="sync_settings_summary">"Seleziona le applicazioni da sincronizzare"</string>
+ <string name="display_settings">"Impostazioni display"</string>
+ <string name="animations_title">"Animazione"</string>
+ <string name="animations_summary_on">"Mostra animazioni durante apertura/chiusura di finestre"</string>
+ <string name="animations_summary_off">"Mostra animazioni durante apertura/chiusura di finestre"</string>
+ <string name="brightness">"Luminosità"</string>
+ <string name="brightness_summary">"Regola la luminosità dello schermo"</string>
+ <string name="screen_timeout">"Timeout schermo"</string>
+ <string name="screen_timeout_summary">"Regola il tempo che deve trascorrere prima che lo schermo si spenga automaticamente"</string>
+ <string name="sim_lock_settings">"Impostazioni blocco SIM"</string>
+ <string name="sim_lock_settings_category">"Impostazioni blocco SIM"</string>
+ <string name="sim_lock_settings_title">"Blocco della SIM"</string>
+ <string name="sim_pin_toggle">"Blocca SIM"</string>
+ <string name="sim_lock_on">"Richiedi il PIN per l\'uso del telefono"</string>
+ <string name="sim_lock_off">"Richiedi il PIN per l\'uso del telefono"</string>
+ <string name="sim_pin_change">"Cambia PIN SIM"</string>
+ <string name="sim_enter_pin">"PIN della SIM"</string>
+ <string name="sim_enable_sim_lock">"Blocca la SIM"</string>
+ <string name="sim_disable_sim_lock">"Sblocca la SIM"</string>
+ <string name="sim_enter_old">"PIN della SIM attuale"</string>
+ <string name="sim_enter_new">"Nuovo PIN della SIM"</string>
+ <string name="sim_reenter_new">"Ridigita nuovo PIN"</string>
+ <string name="sim_change_pin">"PIN della SIM"</string>
+ <string name="sim_bad_pin">"PIN errato."</string>
+ <string name="sim_pins_dont_match">"I PIN non corrispondono."</string>
+ <string name="sim_change_failed">"Impossibile cambiare il PIN."\n"Il PIN potrebbe essere errato."</string>
+ <string name="sim_change_succeeded">"PIN della SIM modificato"</string>
+ <string name="sim_lock_failed">"Impossibile modificare lo stato di blocco della SIM."\n"Il PIN potrebbe essere errato."</string>
+ <string name="sim_enter_ok">"OK"</string>
+ <string name="sim_enter_cancel">"Annulla"</string>
+ <string name="device_info_settings">"Stato telefono"</string>
+ <string name="system_update_settings_list_item_title">"Aggiornamenti sistema"</string>
+ <string name="system_update_settings_list_item_summary">"Verifica aggiornamenti di sistema"</string>
+ <string name="firmware_version">"Versione firmware"</string>
+ <string name="model_number">"Numero modello"</string>
+ <string name="baseband_version">"Versione banda di base"</string>
+ <string name="kernel_version">"Versione kernel"</string>
+ <string name="build_number">"Numero build"</string>
+ <string name="device_info_not_available">"Non disponibile"</string>
+ <string name="device_status_activity_title">"Stato"</string>
+ <string name="device_status">"Stato"</string>
+ <string name="device_status_summary">"IMEI, numero di telefono, segnale ecc."</string>
+ <string name="storage_settings_title">"Scheda SD e memoria"</string>
+ <string name="storage_settings_summary">"Smonta la scheda SD, visualizza spazio di archiviazione disponibile"</string>
+ <string name="status_number">"Numero di telefono"</string>
+ <string name="status_network_type">"Tipo di rete cellulare"</string>
+ <string name="status_data_state">"Stato rete cellulare"</string>
+ <string name="status_service_state">"Stato servizio"</string>
+ <string name="status_signal_strength">"Intensità segnale"</string>
+ <string name="status_roaming">"Roaming"</string>
+ <string name="status_operator">"Rete"</string>
+ <string name="status_wifi_mac_address">"Indirizzo MAC Wi-Fi"</string>
+ <string name="status_bt_address">"Indirizzo Bluetooth"</string>
+ <string name="status_unavailable">"Non disponibile"</string>
+ <string name="status_network_traffic_stats">"Utilizzo della rete"</string>
+ <string name="status_network_traffic_summary">"Inviati: <xliff:g id="NETWORK_TRAFFIC_0">%1$d packets, %2$d bytes%n</xliff:g>Ricevuti: <xliff:g id="NETWORK_TRAFFIC_1">%3$d packets, %4$d bytes</xliff:g>"</string>
+ <string name="status_up_time">"Tempo di attività"</string>
+ <string name="status_awake_time">"Tempo di attività"</string>
+ <string name="internal_memory">"Archiviazione interna telefono"</string>
+ <string name="sd_memory">"Scheda SD"</string>
+ <string name="memory_available">"Spazio disponibile"</string>
+ <string name="memory_size">"Spazio totale"</string>
+ <string name="sd_eject">"Smonta scheda SD"</string>
+ <string name="sd_eject_summary">"Smonta la scheda SD per una rimozione sicura"</string>
+ <string name="sd_format">"Formatta scheda SD"</string>
+ <string name="sd_format_summary">"Formatta (cancella) la scheda SD"</string>
+ <string name="sd_unavailable">"Non disponibile"</string>
+ <string name="read_only">" (Sola lettura)"</string>
+ <string name="battery_status_title">"Stato batteria"</string>
+ <string name="battery_level_title">"Livello batteria"</string>
+ <string name="apn_settings">"APN"</string>
+ <string name="apn_edit">"Modifica punto di accesso"</string>
+ <string name="apn_not_set">"&lt;Non impostato&gt;"</string>
+ <string name="apn_name">"Nome"</string>
+ <string name="apn_apn">"APN"</string>
+ <string name="apn_http_proxy">"Proxy"</string>
+ <string name="apn_http_port">"Porta"</string>
+ <string name="apn_user">"Nome utente"</string>
+ <string name="apn_password">"Password"</string>
+ <string name="apn_server">"Server"</string>
+ <string name="apn_mmsc">"MMSC"</string>
+ <string name="apn_mms_proxy">"Proxy MMS"</string>
+ <string name="apn_mms_port">"Porta MMS"</string>
+ <string name="apn_mcc">"MCC"</string>
+ <string name="apn_mnc">"MNC"</string>
+ <string name="apn_type">"Tipo APN"</string>
+ <string name="menu_delete">"Elimina APN"</string>
+ <string name="menu_new">"Nuovo APN"</string>
+ <string name="menu_save">"Salva"</string>
+ <string name="menu_cancel">"Ignora"</string>
+ <string name="error_title">"Attenzione"</string>
+ <string name="error_name_empty">"Il campo Nome non può essere vuoto."</string>
+ <string name="error_apn_empty">"Il campo APN non può essere vuoto."</string>
+ <string name="error_mcc_not3">"Il campo MCC deve contenere 3 cifre."</string>
+ <string name="error_mnc_not23">"Il campo MNC deve contenere 2 o 3 cifre."</string>
+ <string name="master_clear_title">"Ripristino dati di fabbrica"</string>
+ <string name="master_clear_summary">"Cancella tutti i dati sul telefono"</string>
+ <string name="master_clear_desc">"Questa azione consente di ripristinare i valori di fabbrica del telefono, cancellando tutti i dati e le applicazioni scaricate."</string>
+ <string name="master_clear_button_text">"Ripristina telefono"</string>
+ <string name="master_clear_final_desc">"Ripristinare il telefono, cancellando tutti i dati e le applicazioni? Questa azione è irreversibile."</string>
+ <string name="master_clear_final_button_text">"Cancella tutto"</string>
+ <string name="master_clear_gesture_prompt">"Inserisci la sequenza di sblocco"</string>
+ <string name="master_clear_gesture_explanation">"Per confermare un ripristino del telefono occorre inserire la sequenza di sblocco."</string>
+ <string name="master_clear_failed">"Nessun ripristino eseguito perché il servizio System Clear non è disponibile."</string>
+ <string name="media_format_title">"Formatta scheda SD."</string>
+ <string name="media_format_summary">"Cancella tutti i dati sulla scheda SD"</string>
+ <string name="media_format_desc">"Questa azione cancellerà TUTTI i dati della scheda SD del telefono, che andranno persi."</string>
+ <string name="media_format_button_text">"Formatta scheda SD"</string>
+ <string name="media_format_final_desc">"Formattare la scheda SD, cancellando tutti i media? Questa azione è irreversibile."</string>
+ <string name="media_format_final_button_text">"Cancella tutto"</string>
+ <string name="media_format_gesture_prompt">"Inserisci la sequenza di sblocco"</string>
+ <string name="media_format_gesture_explanation">"Per confermare la formattazione della scheda SD devi inserire la sequenza di sblocco."</string>
+ <string name="call_settings_title">"Impostazioni chiamate"</string>
+ <string name="call_settings_summary">"Imposta segreteria, deviazione chiamate, avviso di chiamata, ID chiamante"</string>
+ <string name="network_settings_title">"Reti mobili"</string>
+ <string name="network_settings_summary">"Imposta le opzioni per roaming, reti e APN"</string>
+ <string name="location_title">"Fonti localizzazione personali"</string>
+ <string name="location_network_based">"Usa reti wireless"</string>
+ <string name="location_networks_disabled">"Visualizza la posizione nelle applicazioni (ad esempio Maps) utilizzando le reti wireless"</string>
+ <string name="location_neighborhood_level">"Posizione determinata dalle reti mobili e/o Wi-Fi"</string>
+ <string name="location_gps">"Attiva satelliti GPS"</string>
+ <string name="location_street_level">"Durante localizzazione, accuratezza a livello stradale (deselezionare per risparmiare batteria)"</string>
+ <string name="location_gps_disabled">"Localizza a livello stradale (richiede più batteria e la vista del cielo)"</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>
+ <string name="contributors_title">"Collaboratori"</string>
+ <string name="copyright_title">"Copyright"</string>
+ <string name="license_title">"Licenza"</string>
+ <string name="terms_title">"Termini e condizioni"</string>
+ <string name="settings_license_activity_title">"Licenze open source"</string>
+ <string name="settings_license_activity_unavailable">"Errore durante il caricamento delle licenze."</string>
+ <string name="settings_license_activity_loading">"Caricamento..."</string>
+ <string name="lock_settings_title">"Sequenza di sblocco schermo"</string>
+ <string name="lockpattern_change_lock_pattern_label">"Cambia sequenza di sblocco"</string>
+ <string name="lockpattern_need_to_unlock">"Conferma sequenza salvata"</string>
+ <string name="lockpattern_need_to_unlock_wrong">"Riprova:"</string>
+ <string name="lockpattern_recording_intro_header">"Inserisci una sequenza di sblocco"</string>
+ <string name="lockpattern_recording_intro_footer">"Premi Menu per visualizzare la guida."</string>
+ <string name="lockpattern_recording_inprogress">"Allontana il dito al termine."</string>
+ <string name="lockpattern_recording_incorrect_too_short">"Collega almeno <xliff:g id="NUMBER">%d</xliff:g> punti. Riprova:"</string>
+ <string name="lockpattern_pattern_entered_header">"Sequenza registrata."</string>
+ <string name="lockpattern_need_to_confirm">"Inserisci di nuovo la sequenza per confermare:"</string>
+ <string name="lockpattern_pattern_confirmed_header">"Nuova sequenza di sblocco:"</string>
+ <string name="lockpattern_confirm_button_text">"Conferma"</string>
+ <string name="lockpattern_restart_button_text">"Ricrea"</string>
+ <string name="lockpattern_retry_button_text">"Riprova"</string>
+ <string name="lockpattern_continue_button_text">"Continua"</string>
+ <string name="lockpattern_settings_title">"Sequenza di sblocco"</string>
+ <string name="lockpattern_settings_enable_title">"Richiedi sequenza"</string>
+ <string name="lockpattern_settings_enable_summary">"Devi inserire la sequenza per sbloccare lo schermo"</string>
+ <string name="lockpattern_settings_enable_visible_pattern_title">"Usa sequenza visibile"</string>
+ <string name="lockpattern_settings_enable_tactile_feedback_title">"Usa reazione tattile"</string>
+ <string name="lockpattern_settings_choose_lock_pattern">"Imposta sequenza"</string>
+ <string name="lockpattern_settings_change_lock_pattern">"Cambia sequenza di sblocco"</string>
+ <string name="lockpattern_settings_help_how_to_record">"Procedura per l\'impostazione di una sequenza di sblocco"</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_header">"Troppi tentativi errati."</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_footer">"Riprova fra <xliff:g id="NUMBER">%d</xliff:g> secondi."</string>
+ <string name="skip_button_label">"Annulla"</string>
+ <string name="next_button_label">"Avanti"</string>
+ <string name="lock_title">"Protezione del telefono"</string>
+ <string name="lock_intro_message"><font size="17">"Proteggi il telefono dall\'uso non autorizzato creando una sequenza di sblocco dello schermo personale. "\n<font height="17">\n</font><b>"1"</b>"  Nella prossima schermata, osserva la creazione di una sequenza di esempio. "\n<font height="17">\n</font><b>"2"</b>"  Quando sei pronto, crea la tua sequenza di sblocco personale. Prova diverse sequenze collegando sempre almeno quattro punti. "\n<font height="17">\n</font><b>"3"</b>"  Inserisci di nuovo la sequenza per confermare. "\n<font height="17">\n</font><b>"Pronto per iniziare? Seleziona “Avanti”"</b>". "\n<font height="3">\n</font>"Se non desideri proteggere il telefono, seleziona “Annulla”."</font></string>
+ <string name="lock_example_title">"Sequenza di esempio"</string>
+ <string name="lock_example_message">"Collega almeno quattro punti."\n" "\n"Seleziona \"Avanti\" quando sei pronto a creare la tua sequenza."</string>
+ <string name="manageapplications_settings_title">"Gestisci applicazioni"</string>
+ <string name="manageapplications_settings_summary">"Gestisci e rimuovi applicazioni installate"</string>
+ <string name="applications_settings">"Applicazioni"</string>
+ <string name="applications_settings_summary">"Gestisci le applicazioni, imposta le scorciatoie di avvio rapido"</string>
+ <string name="applications_settings_header">"Impostazioni applicazione"</string>
+ <string name="install_applications">"Origini sconosciute"</string>
+ <string name="install_unknown_applications">"Consenti l\'installazione di applicazioni non commerciali"</string>
+ <string name="install_all_warning">"Il telefono e i dati personali sono più vulnerabili agli attacchi da parte di applicazioni\n di origini sconosciute. L\'utente accetta di essere il solo responsabile degli eventuali\n danni al telefono o della perdita dei dati che potrebbero derivare dall\'utilizzo di\n queste applicazioni."</string>
+ <string name="application_info_label">"Info applicazione"</string>
+ <string name="storage_label">"Archiviazione"</string>
+ <string name="auto_launch_label">"Avvia per impostazione predefinita"</string>
+ <string name="permissions_label">"Autorizzazioni"</string>
+ <string name="cache_header_label">"Cache"</string>
+ <string name="clear_cache_btn_text">"Cancella cache"</string>
+ <string name="cache_size_label">"Cache"</string>
+ <string name="controls_label">"Controlli"</string>
+ <string name="force_stop">"Termina"</string>
+ <string name="total_size_label">"Totale"</string>
+ <string name="application_size_label">"Applicazione"</string>
+ <string name="data_size_label">"Dati"</string>
+ <string name="uninstall_text">"Disinstalla"</string>
+ <string name="clear_user_data_text">"Cancella dati"</string>
+ <string name="auto_launch_enable_text">"Hai scelto di avviare per impostazione predefinita questa applicazione per alcune azioni."</string>
+ <string name="auto_launch_disable_text">"Nessuna applicazione predefinita impostata."</string>
+ <string name="clear_activities">"Cancella predefinite"</string>
+ <string name="unknown">"Sconosciuta"</string>
+ <string name="sort_order_alpha">"Ordina"</string>
+ <string name="sort_order_size">"Ordina per dimensioni"</string>
+ <string name="manage_space_text">"Gestisci spazio"</string>
+ <string name="filter">"Filtra"</string>
+ <string name="filter_dlg_title">"Seleziona opzioni di filtro"</string>
+ <string name="filter_apps_all">"Tutte"</string>
+ <string name="filter_apps_third_party">"Terze parti"</string>
+ <string name="filter_apps_running">"In esecuzione"</string>
+ <string name="loading">"Caricamento..."</string>
+ <string name="recompute_size">"Ricalcolo dimensioni..."</string>
+ <string name="clear_data_dlg_title">"Elimina"</string>
+ <string name="clear_data_dlg_text">"Tutte le informazioni salvate nell\'applicazione verranno eliminate definitivamente."</string>
+ <string name="dlg_ok">"OK"</string>
+ <string name="dlg_cancel">"Annulla"</string>
+ <string name="app_not_found_dlg_title">"Applicazione non trovata"</string>
+ <string name="app_not_found_dlg_text">"Impossibile trovare l\'applicazione \nnell\'elenco di applicazioni installate."</string>
+ <string name="clear_data_failed">"Impossibile cancellare i dati dell\'applicazione."</string>
+ <string name="security_settings_desc">"Contenuti a cui può accedere l\'applicazione sul telefono:"</string>
+ <string name="computing_size">"Elaborazione..."</string>
+ <string name="invalid_size_value">"Impossibile stabilire le dimensioni del pacchetto"</string>
+ <string name="empty_list_msg">"Nessuna applicazione di terze parti installata."</string>
+ <string name="language_settings">"Lingua e testo"</string>
+ <string name="language_settings_summary">"Impostazioni internazionali (lingua e regione), di inserimento e correzione automatica del testo"</string>
+ <string name="language_category">"Impostazioni lingua"</string>
+ <string name="text_category">"Impostazioni testo"</string>
+ <string name="phone_language">"Seleziona lingua"</string>
+ <string name="phone_language_summary">"Seleziona lingua e regione"</string>
+ <string name="auto_replace">"Sostituzione automatica"</string>
+ <string name="auto_replace_summary">"Corregge le parole con errori di ortografia"</string>
+ <string name="auto_caps">"Maiuscola automatica"</string>
+ <string name="auto_caps_summary">"Usa la maiuscola a inizio frase"</string>
+ <string name="auto_punctuate">"Punteggiatura automatica"</string>
+ <string name="hardkeyboard_category">"Impostazioni tastiera fisica"</string>
+ <string name="auto_punctuate_summary">"Premi due volte la barra spaziatrice per inserire \".\""</string>
+ <string name="show_password">"Password visibili"</string>
+ <string name="show_password_summary">"Mostra la password durante la digitazione"</string>
+ <string name="user_dict_settings_titlebar">"Dizionario utente"</string>
+ <string name="user_dict_settings_title">"Dizionario utente"</string>
+ <string name="user_dict_settings_summary">"Aggiungi e rimuovi parole dal dizionario utente"</string>
+ <string name="user_dict_settings_add_menu_title">"Aggiungi"</string>
+ <string name="user_dict_settings_add_dialog_title">"Aggiungi al dizionario"</string>
+ <string name="user_dict_settings_context_menu_edit_title">"Modifica"</string>
+ <string name="user_dict_settings_context_menu_delete_title">"Elimina"</string>
+ <string name="user_dict_settings_empty_text">"Non sono presenti parole nel dizionario utente. Puoi aggiungere una parola mediante il menu."</string>
+ <string name="testing">"Verifica in corso"</string>
+ <string name="testing_phone_info">"Informazioni telefono"</string>
+ <string name="testing_battery_info">"Informazioni batteria"</string>
+ <string name="testing_battery_history">"Cronologia batteria"</string>
+ <string name="quick_launch_title">"Avvio rapido"</string>
+ <string name="quick_launch_summary">"Imposta scorciatoie da tastiera per avviare le applicazioni"</string>
+ <string name="quick_launch_assign_application">"Assegna applicazione"</string>
+ <string name="quick_launch_no_shortcut">"Nessuna scorciatoia"</string>
+ <string name="quick_launch_shortcut">"Cerca + <xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g>"</string>
+ <string name="quick_launch_clear_dialog_title">"Cancella"</string>
+ <string name="quick_launch_clear_dialog_message">"La scorciatoia per <xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g> (<xliff:g id="APPLICATION_NAME">%2$s</xliff:g>) verrà cancellata."</string>
+ <string name="quick_launch_clear_ok_button">"OK"</string>
+ <string name="quick_launch_clear_cancel_button">"Annulla"</string>
+ <string name="quick_launch_display_mode_applications">"Applicazioni"</string>
+ <string name="quick_launch_display_mode_shortcuts">"Scorciatoie"</string>
+ <string name="input_methods_settings_title">"Inserimento testo"</string>
+ <string name="input_methods_settings_summary">"Gestisci opzioni inserimento testo"</string>
+ <string name="input_methods_settings_label_format">"Impostazioni %s"</string>
+ <string name="development_settings_title">"Sviluppo"</string>
+ <string name="development_settings_summary">"Imposta opzioni per lo sviluppo di applicazioni"</string>
+ <string name="enable_adb">"Debug USB"</string>
+ <string name="enable_adb_summary">"Modalità debug quando è connesso USB"</string>
+ <string name="keep_screen_on">"Rimani attivo"</string>
+ <string name="keep_screen_on_summary">"Lo schermo non va mai in stand-by se sotto carica"</string>
+ <string name="allow_mock_location">"Posizioni fittizie"</string>
+ <string name="allow_mock_location_summary">"Consenti posizioni fittizie"</string>
+ <!-- no translation found for gadget_picker_title (98374951396755811) -->
+ <skip />
+ <!-- no translation found for widget_picker_title (9130684134213467557) -->
+ <skip />
+ <string name="battery_history_details_for">"Dettagli per UID %d"</string>
+ <string name="battery_history_uid">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
+ <string name="battery_history_network_usage">"Dettagli di utilizzo della rete per <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
+ <string name="battery_history_bytes_received">"Byte ricevuti: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_sent">"Byte inviati: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_total">"Byte totali: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_cpu_usage">"Dettagli di utilizzo della CPU per <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
+ <string name="battery_history_user_time">"Tempo utente:"</string>
+ <string name="battery_history_system_time">"Tempo sistema:"</string>
+ <string name="battery_history_total_time">"Tempo totale:"</string>
+ <string name="battery_history_starts">"Avvii: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
+ <string name="battery_history_days">"<xliff:g id="DAYS">%1$d</xliff:g> giorni, <xliff:g id="HOURS">%2$d</xliff:g> ore, <xliff:g id="MINUTES">%3$d</xliff:g> minuti, <xliff:g id="SECONDS">%4$d</xliff:g> secondi"</string>
+ <string name="battery_history_hours">"<xliff:g id="HOURS">%1$d</xliff:g> ore, <xliff:g id="MINUTES">%2$d</xliff:g> minuti, <xliff:g id="SECONDS">%3$d</xliff:g> secondi"</string>
+ <string name="battery_history_minutes">"<xliff:g id="MINUTES">%1$d</xliff:g> minuti, <xliff:g id="SECONDS">%2$d</xliff:g> secondi"</string>
+ <string name="battery_history_seconds">"<xliff:g id="SECONDS">%1$d</xliff:g> secondi"</string>
+ <string name="battery_history_packages_sharing_this_uid">"Pacchetti che condividono questo UID:"</string>
+ <string name="battery_history_no_data">"Dati sull\'utilizzo della batteria non disponibili"</string>
+ <string name="battery_history_sensor">"Sensore:"</string>
+ <!-- no translation found for battery_history_wakelock (608683447522396293) -->
+ <skip />
+ <string name="battery_history_used_by_packages">"Sensore usato dai pacchetti:"</string>
+ <string name="battery_history_sensor_usage">"Usato <xliff:g id="COUNT">%1$d</xliff:g> volte da <xliff:g id="PACKAGE">%2$s</xliff:g>"</string>
+ <string name="battery_history_sensor_usage_multi">"Usato <xliff:g id="COUNT">%1$d</xliff:g> volte da uno di:"</string>
+ <!-- no translation found for battery_history_awake_label (8449792868990080882) -->
+ <skip />
+ <!-- no translation found for battery_history_screen_on_label (1848936521786339362) -->
+ <skip />
+ <!-- no translation found for battery_history_phone_on_label (700191958853142297) -->
+ <skip />
+ <!-- no translation found for battery_history_awake (4350886665719031057) -->
+ <skip />
+ <string name="battery_history_screen_on">"Tempo trascorso con schermo acceso:"</string>
+ <!-- no translation found for battery_history_phone_on (4891504401623839532) -->
+ <skip />
+ <string name="battery_history_screen_on_battery">"A batteria:"</string>
+ <string name="battery_history_screen_on_plugged">"Collegato:"</string>
+ <string name="usage_stats_label">"Statistiche di utilizzo"</string>
+ <string name="testing_usage_stats">"Statistiche di utilizzo"</string>
+ <string name="display_order_text">"Ordina per:"</string>
+ <string name="app_name_label">"Applicazione"</string>
+ <string name="launch_count_label">"Conteggio"</string>
+ <string name="usage_time_label">"Tempo di utilizzo"</string>
+</resources>
diff --git a/res/values-ja-nokeys/strings.xml b/res/values-ja-nokeys/strings.xml
new file mode 100644
index 0000000..7428f92
--- /dev/null
+++ b/res/values-ja-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">"アプリケーションを管理"</string>
+</resources>
diff --git a/res/values-ja/arrays.xml b/res/values-ja/arrays.xml
new file mode 100644
index 0000000..d73a3d7
--- /dev/null
+++ b/res/values-ja/arrays.xml
@@ -0,0 +1,72 @@
+<?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>"アメリカ"</item>
+ <item>"ヨーロッパ"</item>
+ <item>"アフリカ"</item>
+ <item>"アジア"</item>
+ <item>"オーストラリア"</item>
+ <item>"太平洋"</item>
+ <item>"すべて"</item>
+ </string-array>
+ <string-array name="screen_timeout_entries">
+ <item>"15秒"</item>
+ <item>"30秒"</item>
+ <item>"1分"</item>
+ <item>"2分"</item>
+ <item>"10分"</item>
+ <item>"タイムアウトなし"</item>
+ </string-array>
+ <string-array name="wifi_security_entries">
+ <item>"自動"</item>
+ <item>"なし"</item>
+ <item>"WEP"</item>
+ <item>"WPA Personal"</item>
+ <item>"WPA2 Personal"</item>
+ </string-array>
+ <string-array name="wifi_security_without_auto_entries">
+ <item>"なし"</item>
+ <item>"WEP"</item>
+ <item>"WPA Personal"</item>
+ <item>"WPA2 Personal"</item>
+ </string-array>
+ <string-array name="wifi_wep_type">
+ <item>"自動"</item>
+ <item>"WEP ASCII"</item>
+ <item>"16進のWEP"</item>
+ </string-array>
+ <string-array name="wifi_sleep_policy_entries">
+ <item>"画面がOFFになったとき"</item>
+ <item>"電源接続時はスリープしない"</item>
+ <item>"スリープしない"</item>
+ </string-array>
+ <!-- no translation found for battery_history_type_spinner:0 (2193799199027871385) -->
+ <!-- no translation found for battery_history_type_spinner:1 (6401018715947316517) -->
+ <!-- no translation found for battery_history_type_spinner:2 (188092590354892392) -->
+ <!-- no translation found for battery_history_type_spinner:3 (8414109131222049141) -->
+ <!-- no translation found for battery_history_type_spinner:4 (1327904325081257093) -->
+ <!-- no translation found for battery_history_type_spinner:5 (4832254146664706277) -->
+ <!-- no translation found for battery_history_which_spinner:0 (3451981114763440074) -->
+ <!-- no translation found for battery_history_which_spinner:1 (166936313535197598) -->
+ <!-- no translation found for battery_history_which_spinner:2 (4793941382744963893) -->
+ <string-array name="usage_stats_display_order_types">
+ <item>"使用時間"</item>
+ <item>"起動回数"</item>
+ <item>"アプリケーション名"</item>
+ </string-array>
+</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
new file mode 100644
index 0000000..f1c2414
--- /dev/null
+++ b/res/values-ja/strings.xml
@@ -0,0 +1,672 @@
+<?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">"不明"</string>
+ <string name="turn_on_radio">"無線通信をオン"</string>
+ <string name="turn_off_radio">"無線通信をオフ"</string>
+ <string name="turn_on_qxdm">"QXDM SDログを有効にする"</string>
+ <string name="turn_off_qxdm">"QXDM SDログを無効にする"</string>
+ <string name="radioInfo_menu_viewADN">"SIMのアドレス帳を表示"</string>
+ <string name="radioInfo_menu_viewFDN">"発信番号制限を表示"</string>
+ <string name="radioInfo_menu_viewSDN">"サービス電話番号を表示"</string>
+ <string name="radioInfo_menu_getPDP">"PDPリストを取得"</string>
+ <string name="radioInfo_menu_enableData">"データ接続を有効にする"</string>
+ <string name="radioInfo_menu_disableData">"データ接続を無効にする"</string>
+ <string name="radioInfo_menu_enableDataOnBoot">"起動時にデータを有効にする"</string>
+ <string name="radioInfo_menu_disableDataOnBoot">"起動時にデータを無効にする"</string>
+ <string name="radioInfo_service_in">"使用中"</string>
+ <string name="radioInfo_service_out">"休止中または使用不可"</string>
+ <string name="radioInfo_service_emergency">"緊急呼のみ"</string>
+ <string name="radioInfo_service_off">"無線通信をオフ"</string>
+ <string name="radioInfo_roaming_in">"ローミング"</string>
+ <string name="radioInfo_roaming_not">"ローミングなし"</string>
+ <string name="radioInfo_phone_idle">"アイドル"</string>
+ <string name="radioInfo_phone_ringing">"着信中"</string>
+ <string name="radioInfo_phone_offhook">"通話中"</string>
+ <string name="radioInfo_data_disconnected">"切断"</string>
+ <string name="radioInfo_data_connecting">"接続中"</string>
+ <string name="radioInfo_data_connected">"接続"</string>
+ <string name="radioInfo_data_suspended">"強制停止"</string>
+ <string name="radioInfo_unknown">"不明"</string>
+ <string name="radioInfo_display_packets">"pkts"</string>
+ <string name="radioInfo_display_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">"SDカードのマウント解除"</string>
+ <string name="sdcard_format">"SDカードをフォーマット"</string>
+ <string name="small_font">"小"</string>
+ <string name="medium_font">"中"</string>
+ <string name="large_font">"大"</string>
+ <string name="font_size_save">"OK"</string>
+ <string name="sdcard_setting">"SDカード"</string>
+ <string name="battery_info_status_label">"充電状況"</string>
+ <string name="battery_info_scale_label">"電池の残量表示:"</string>
+ <string name="battery_info_level_label">"電池残量:"</string>
+ <string name="battery_info_health_label">"電池の状態:"</string>
+ <string name="battery_info_technology_label">"電池技術:"</string>
+ <string name="battery_info_voltage_label">"蓄電池電圧:"</string>
+ <string name="battery_info_voltage_units">"mV"</string>
+ <string name="battery_info_temperature_label">"電池温度:"</string>
+ <string name="battery_info_temperature_units">"°C"</string>
+ <string name="battery_info_uptime">"起動してからの時間:"</string>
+ <string name="battery_info_awake_battery">"非節電時間"</string>
+ <string name="battery_info_awake_plugged">"充電時の非節電時間:"</string>
+ <string name="battery_info_screen_on">"画面ONの時間:"</string>
+ <string name="battery_info_status_unknown">"不明"</string>
+ <string name="battery_info_status_charging">"充電中"</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">"放電中"</string>
+ <string name="battery_info_status_not_charging">"充電していません"</string>
+ <string name="battery_info_status_full">"満充電"</string>
+ <string name="battery_info_health_unknown">"不明"</string>
+ <string name="battery_info_health_good">"半分以上残っています"</string>
+ <string name="battery_info_health_overheat">"加熱状態"</string>
+ <string name="battery_info_health_dead">"残量なし"</string>
+ <string name="battery_info_health_over_voltage">"過電圧"</string>
+ <string name="battery_info_health_unspecified_failure">"不明なエラー"</string>
+ <string name="bluetooth">"Bluetooth"</string>
+ <string name="bluetooth_visibility">"検出可能"</string>
+ <string name="bluetooth_is_discoverable">"<xliff:g id="DISCOVERABLE_TIME_PERIOD">%1$s</xliff:g>秒間検出可能..."</string>
+ <string name="bluetooth_not_discoverable">"この端末が検出されることを許可する"</string>
+ <string name="bluetooth_devices">"Bluetooth端末"</string>
+ <string name="bluetooth_device_name">"端末名"</string>
+ <string name="bluetooth_name_not_set">"名前が設定されていない場合、アカウント名を使用する"</string>
+ <string name="bluetooth_scan_for_devices">"端末をスキャン"</string>
+ <string name="bluetooth_disconnect_blank">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>の接続を解除します"</string>
+ <string name="bluetooth_connected">"接続"</string>
+ <string name="bluetooth_disconnected">"切断"</string>
+ <string name="bluetooth_disconnecting">"切断中..."</string>
+ <string name="bluetooth_connecting">"接続中..."</string>
+ <!-- no translation found for bluetooth_unknown (1905151516611093010) -->
+ <skip />
+ <string name="bluetooth_not_connected">"この端末をペアに設定する"</string>
+ <string name="bluetooth_pairing">"ペアとして設定中..."</string>
+ <!-- no translation found for bluetooth_paired (1247541089000057726) -->
+ <skip />
+ <string name="bluetooth_device">"ハンズフリー/ヘッドセット"</string>
+ <string name="progress_scanning">"スキャン中"</string>
+ <string name="bluetooth_notif_ticker">"Bluetoothペア設定リクエスト"</string>
+ <string name="bluetooth_notif_title">"ペア設定リクエスト"</string>
+ <string name="bluetooth_notif_message">"ペアとして設定 "</string>
+ <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>
+ <string name="choose_timezone">"タイムゾーンの選択"</string>
+ <string name="display_preview_label">"プレビュー:"</string>
+ <string name="display_font_size_label">"フォントサイズ:"</string>
+ <!-- no translation found for intent_sender_data_label (8363026381459131554) -->
+ <skip />
+ <string name="intent_sender_sendbroadcast_text">"<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">"<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">"アカウント:"</string>
+ <string name="proxy_clear_text">"消去"</string>
+ <string name="proxy_port_label">"ポート"</string>
+ <string name="proxy_defaultView_text">"初期設定に戻す"</string>
+ <string name="proxy_action_text">"保存"</string>
+ <string name="proxy_hostname_label">"ホスト名"</string>
+ <string name="proxy_error">"注意"</string>
+ <string name="proxy_error_dismiss">"OK"</string>
+ <string name="proxy_error_invalid_host">"入力したホスト名は無効です。"</string>
+ <string name="proxy_error_empty_port">"[ポート]フィールドに入力してください。"</string>
+ <string name="proxy_error_empty_host_set_port">"[ホスト]フィールドが空の場合は、[ポート]フィールドも空にしてください。"</string>
+ <string name="proxy_error_invalid_port">"入力したポートは無効です。"</string>
+ <string name="radio_info_signal_location_label">"ロケーション:"</string>
+ <string name="radio_info_neighboring_location_label">"近くのCID:"</string>
+ <string name="radio_info_data_attempts_label">"データの試行:"</string>
+ <string name="radio_info_gprs_service_label">"GPRSサービス:"</string>
+ <string name="radio_info_roaming_label">"ローミング:"</string>
+ <string name="radio_info_imei_label">"IMEI:"</string>
+ <string name="radio_info_call_redirect_label">"通話のリダイレクト:"</string>
+ <string name="radio_info_ppp_resets_label">"ブート後のPPPリセット回数:"</string>
+ <string name="radio_info_gsm_disconnects_label">"GSM切断:"</string>
+ <string name="radio_info_current_network_label">"現在のネットワーク:"</string>
+ <string name="radio_info_data_successes_label">"データ成功:"</string>
+ <string name="radio_info_ppp_received_label">"PPP受信:"</string>
+ <string name="radio_info_gsm_service_label">"GSMサービス:"</string>
+ <string name="radio_info_signal_strength_label">"電波強度:"</string>
+ <string name="radio_info_call_status_label">"通話状況:"</string>
+ <string name="radio_info_ppp_sent_label">"PPP送信:"</string>
+ <string name="radio_info_radio_resets_label">"無線通信のリセット:"</string>
+ <string name="radio_info_message_waiting_label">"メッセージ待機中:"</string>
+ <string name="radio_info_phone_number_label">"電話番号:"</string>
+ <string name="radio_info_band_mode_label">"無線バンドを選択"</string>
+ <string name="radio_info_network_type_label">"ネットワークの種類"</string>
+ <string name="radio_info_set_perferred_label">"優先ネットワークを設定"</string>
+ <string name="radio_info_ping_ipaddr">"IPアドレスのPing:"</string>
+ <string name="radio_info_ping_hostname">"ホスト名 (www.google.co.jp) のPing:"</string>
+ <string name="radio_info_http_client_test">"HTTPクライアントテスト:"</string>
+ <string name="radio_info_toggle_ciph_label">"暗号化の切り替え"</string>
+ <string name="ping_test_label">"pingテストの実行"</string>
+ <string name="radio_info_smsc_label">"SMSC:"</string>
+ <string name="radio_info_smsc_update_label">"更新"</string>
+ <string name="radio_info_smsc_refresh_label">"更新"</string>
+ <string name="radio_info_toggle_dns_check_label">"DNSチェックを切り替え"</string>
+ <string name="band_mode_title">"GSM/UMTSバンドの設定"</string>
+ <string name="band_mode_loading">"バンドリストを読み込み中..."</string>
+ <string name="band_mode_set">"設定"</string>
+ <string name="band_mode_failed">"失敗"</string>
+ <string name="band_mode_succeeded">"成功"</string>
+ <string name="sdcard_changes_instructions">"USBケーブルの再接続時に変更が有効になります"</string>
+ <string name="sdcard_settings_screen_mass_storage_text">"USBマスストレージを有効にする"</string>
+ <string name="sdcard_settings_total_bytes_label">"合計バイト数:"</string>
+ <string name="sdcard_settings_not_present_status">"SDカードがありません"</string>
+ <string name="sdcard_settings_available_bytes_label">"利用可能バイト数:"</string>
+ <string name="sdcard_settings_mass_storage_status">"SDカードをマスストレージデバイスとして使用中"</string>
+ <string name="sdcard_settings_unmounted_status">"SDカードを安全に取り外せます"</string>
+ <string name="sdcard_settings_bad_removal_status">"SDカードが使用中に取り外されました。"</string>
+ <string name="sdcard_settings_used_bytes_label">"使用済みバイト数:"</string>
+ <string name="sdcard_settings_scanning_status">"メディア用のSDカードをスキャン中..."</string>
+ <string name="sdcard_settings_read_only_status">"読み取り専用としてSDカードをマウントしました"</string>
+ <string name="next_label">"次へ"</string>
+ <string name="language_picker_title">"地域/言語"</string>
+ <string name="select_your_language">"言語を選択"</string>
+ <string name="activity_picker_label">"操作の選択"</string>
+ <string name="device_info_label">"端末情報"</string>
+ <string name="battery_info_label">"電池情報"</string>
+ <string name="battery_history_label">"バッテリの履歴"</string>
+ <string name="display_label">"ディスプレイ"</string>
+ <string name="phone_info_label">"携帯電話情報"</string>
+ <string name="sd_card_settings_label">"SDカード"</string>
+ <string name="proxy_settings_label">"プロキシ設定"</string>
+ <string name="cancel">"キャンセル"</string>
+ <string name="settings_label">"設定"</string>
+ <string name="airplane_mode">"機内モード"</string>
+ <string name="airplane_mode_summary">"ワイヤレス接続をすべて無効にする"</string>
+ <string name="airplane_mode_turning_on">"ワイヤレス接続を無効にしています..."</string>
+ <string name="airplane_mode_turning_off">"ワイヤレス接続を有効にしています..."</string>
+ <string name="radio_controls_title">"ワイヤレス設定"</string>
+ <string name="radio_controls_summary">"Wi-Fi、Bluetooth、機内モード、モバイルネットワークの管理"</string>
+ <string name="date_and_time_settings_title">"日付と時刻"</string>
+ <string name="date_and_time_settings_summary">"日付、時刻、タイムゾーンの設定"</string>
+ <string name="date_time_auto">"自動"</string>
+ <string name="date_time_auto_summaryOn">"ネットワーク自動設定"</string>
+ <string name="date_time_auto_summaryOff">"ネットワーク自動設定"</string>
+ <string name="date_time_24hour">"24時間表示"</string>
+ <string name="date_time_set_time">"時刻設定"</string>
+ <string name="date_time_set_timezone">"タイムゾーンの選択"</string>
+ <string name="date_time_set_date">"日付設定"</string>
+ <string name="date_time_date_format">"日付形式"</string>
+ <string name="zone_list_menu_sort_alphabetically">"アルファベット順に並べ替え"</string>
+ <string name="zone_list_menu_sort_by_timezone">"タイムゾーン順に並べ替え"</string>
+ <string name="security_settings_title">"セキュリティ &amp; 位置情報"</string>
+ <string name="security_settings_summary">"現在地情報、画面ロック、SIMカードロック"</string>
+ <string name="security_passwords_title">"パスワード"</string>
+ <string name="bluetooth_quick_toggle_title">"Bluetooth"</string>
+ <string name="bluetooth_quick_toggle_summary">"Bluetoothをオン"</string>
+ <string name="bluetooth_settings">"Bluetooth設定"</string>
+ <string name="bluetooth_settings_title">"Bluetooth設定"</string>
+ <string name="bluetooth_settings_summary">"端末の名前、接続や検出設定"</string>
+ <string name="bluetooth_pin_entry">"Bluetoothペア設定リクエスト"</string>
+ <string name="bluetooth_device_info">"Bluetooth端末情報"</string>
+ <string name="bluetooth_enter_pin_msg">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"\n\n"ペアにするPINを入力してください。"\n"(0000か1234を試してください)"</string>
+ <string name="bluetooth_error_title">"注意"</string>
+ <string name="bluetooth_pairing_error_message">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>とのペアリングで問題が発生しました。"</string>
+ <string name="bluetooth_pairing_pin_error_message">"入力されたPINが正しくないため、<xliff:g id="DEVICE_NAME">%1$s</xliff:g>とのペアリングで問題が発生しました。"</string>
+ <string name="bluetooth_connecting_error_message">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>への接続で問題が発生しました。"</string>
+ <string name="bluetooth_preference_scan_title">"デバイスのスキャン"</string>
+ <string name="bluetooth_device_context_connect">"接続"</string>
+ <string name="bluetooth_device_context_disconnect">"接続を解除"</string>
+ <string name="bluetooth_device_context_pair_connect">"ペアに設定して接続"</string>
+ <string name="bluetooth_device_context_unpair">"ペアを解除"</string>
+ <string name="bluetooth_device_context_disconnect_unpair">"切断してペアを解除"</string>
+ <string name="bluetooth_device_context_connect_advanced">"オプション..."</string>
+ <string name="bluetooth_connect_specific_profiles_title">"接続先..."</string>
+ <string name="bluetooth_profile_a2dp">"メディア"</string>
+ <string name="bluetooth_profile_headset">"電話"</string>
+ <string name="bluetooth_summary_connected_to_a2dp">"メディアの音声に接続"</string>
+ <string name="bluetooth_summary_connected_to_headset">"携帯電話の音声に接続"</string>
+ <string name="bluetooth_summary_connected_to_a2dp_headset">"携帯電話とメディアの音声に接続"</string>
+ <string name="bluetooth_device_advanced_title">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>オプション"</string>
+ <string name="bluetooth_device_advanced_online_mode_title">"接続"</string>
+ <string name="bluetooth_device_advanced_online_mode_summary">"Bluetoothデバイスに接続"</string>
+ <string name="bluetooth_device_advanced_profile_header_title">"プロフィール"</string>
+ <string name="bluetooth_a2dp_profile_summary_connected">"メディアの音声に接続"</string>
+ <string name="bluetooth_headset_profile_summary_connected">"携帯電話の音声に接続"</string>
+ <string name="bluetooth_a2dp_profile_summary_use_for">"メディアの音声に使用"</string>
+ <string name="bluetooth_headset_profile_summary_use_for">"携帯電話の音声に使用"</string>
+ <string name="wifi">"Wi-Fi"</string>
+ <string name="wifi_quick_toggle_title">"Wi-Fi"</string>
+ <string name="wifi_quick_toggle_summary">"Wi-Fiをオン"</string>
+ <string name="wifi_settings">"Wi-Fi設定"</string>
+ <string name="wifi_settings_category">"Wi-Fi設定"</string>
+ <string name="wifi_settings_summary">"ワイヤレスアクセスポイントの設定"</string>
+ <string name="forget_network">"切断"</string>
+ <string name="wifi_status">"接続状況"</string>
+ <string name="wifi_link_speed">"速度"</string>
+ <string name="wifi_signal_3">"非常に強い"</string>
+ <string name="wifi_signal_2">"強"</string>
+ <string name="wifi_signal_1">"中"</string>
+ <string name="wifi_signal_0">"弱"</string>
+ <string name="security">"セキュリティ"</string>
+ <string name="wifi_security_open">"オープン"</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">"不明"</string>
+ <string name="wifi_security_verbose_open">"オープンネットワーク"</string>
+ <string name="wifi_security_verbose_wep">"WEPにより保護"</string>
+ <string name="wifi_security_verbose_wpa">"WPAにより保護"</string>
+ <string name="wifi_security_verbose_wpa2">"WPA2により保護"</string>
+ <string name="ip_address">"IPアドレス"</string>
+ <string name="signal">"電波強度"</string>
+ <string name="wifi_starting">"オンにしています..."</string>
+ <string name="wifi_stopping">"オフにしています..."</string>
+ <string name="wifi_error">"エラー"</string>
+ <string name="error_starting">"Wi-Fiを開始できません"</string>
+ <string name="error_stopping">"Wi-Fiを停止できません"</string>
+ <string name="error_scanning">"ネットワークをスキャンできません"</string>
+ <string name="error_connecting">"ネットワークに接続できません"</string>
+ <string name="error_saving">"ネットワークを保存できません"</string>
+ <string name="connect">"接続"</string>
+ <string name="connect_to_blank">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>に接続"</string>
+ <string name="please_type_passphrase">"ワイヤレス接続パスワード"</string>
+ <string name="please_type_hex_key">"WEPの16進キー (0~9、A~F)"</string>
+ <string name="wifi_show_password">"パスワードを表示"</string>
+ <string name="scan_wifi">"スキャン"</string>
+ <string name="summary_not_in_range">"圏外"</string>
+ <string name="summary_remembered">"これまでの設定"</string>
+ <string name="summary_connection_failed">"接続できませんでした。選択すると再試行します。"</string>
+ <string name="wifi_access_points">"Wi-Fiネットワーク"</string>
+ <string name="wifi_type_ssid">"ネットワークSSID"</string>
+ <string name="wifi_security">"セキュリティ"</string>
+ <string name="wifi_save_config">"保存"</string>
+ <string name="wifi_password_unchanged">"(変更なし)"</string>
+ <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_generic_connection_error">"ネットワーク接続に問題があります。やり直してください。"</string>
+ <string name="wifi_menu_advanced">"詳細設定"</string>
+ <string name="wifi_ip_settings_titlebar">"IP設定"</string>
+ <string name="wifi_ip_settings_menu_save">"保存"</string>
+ <string name="wifi_ip_settings_menu_cancel">"キャンセル"</string>
+ <string name="wifi_ip_settings_invalid_ip">"正しいIPアドレスを入力してください。"</string>
+ <string name="wifi_use_static_ip">"静的IPを使用"</string>
+ <string name="wifi_ip_address">"IPアドレス"</string>
+ <string name="wifi_dns1">"DNS 1"</string>
+ <string name="wifi_dns2">"DNS 2"</string>
+ <string name="wifi_gateway">"ゲートウェイ"</string>
+ <string name="wifi_netmask">"ネットマスク"</string>
+ <string name="wifi_context_menu_connect">"ネットワークに接続"</string>
+ <string name="wifi_context_menu_forget">"ネットワークへの接続を解除"</string>
+ <string name="wifi_context_menu_change_password">"パスワードを変更"</string>
+ <string name="wifi_advanced_titlebar">"詳細設定"</string>
+ <string name="wifi_setting_num_channels_title">"規制領域"</string>
+ <string name="wifi_setting_num_channels_summary">"使用するチャンネルの番号を設定する"</string>
+ <string name="wifi_setting_num_channels_error">"規制領域の設定で問題が発生しました。"</string>
+ <string name="wifi_setting_num_channels_channel_phrase">"チャンネル数<xliff:g id="NUM_CHANNELS">%1$d</xliff:g>件"</string>
+ <string name="wifi_setting_sleep_policy_title">"Wi-Fiスリープポリシー"</string>
+ <string name="wifi_setting_sleep_policy_summary">"Wi-Fiからモバイルデータに切り替えるタイミングを指定する"</string>
+ <string name="wifi_setting_sleep_policy_error">"スリープポリシーの設定で問題が発生しました。"</string>
+ <string name="wifi_advanced_mac_address_title">"MACアドレス"</string>
+ <string name="fragment_status_scanning">"スキャン中..."</string>
+ <string name="fragment_status_connecting">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>に接続中..."</string>
+ <string name="fragment_status_authenticating">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>による認証中..."</string>
+ <string name="fragment_status_obtaining_ip">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>からIPアドレスを取得中..."</string>
+ <string name="fragment_status_connected">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>に接続しました"</string>
+ <string name="fragment_status_disconnecting">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>から切断中..."</string>
+ <string name="fragment_status_disconnected">"切断"</string>
+ <string name="fragment_status_failed">"失敗"</string>
+ <string name="status_scanning">"スキャン中..."</string>
+ <string name="status_connecting">"接続中..."</string>
+ <string name="status_authenticating">"認証中..."</string>
+ <string name="status_obtaining_ip">"アドレスを取得中..."</string>
+ <string name="status_connected">"接続"</string>
+ <string name="status_disconnecting">"切断中..."</string>
+ <string name="status_disconnected">"切断"</string>
+ <string name="status_failed">"失敗"</string>
+ <string name="sound_and_display_settings">"サウンド &amp; 画面設定"</string>
+ <string name="sound_settings">"音の設定"</string>
+ <string name="sound_and_display_settings_summary">"着信音、操作音、画面の明るさなど"</string>
+ <string name="silent_mode_title">"マナーモード"</string>
+ <string name="silent_mode_summary">"メディア(音楽や動画)、アラーム以外は無音にします"</string>
+ <string name="ringtone_title">"着信音"</string>
+ <string name="ringtone_summary">"端末既定の着信音設定"</string>
+ <string name="ring_volume_title">"着信音の音量"</string>
+ <string name="ring_volume_summary">"着信音と通知音の音量を設定する"</string>
+ <string name="vibrate_title">"バイブレーション"</string>
+ <string name="vibrate_summary">"着信時のバイブレーションON"</string>
+ <string name="notification_sound_title">"通知音"</string>
+ <string name="notification_sound_summary">"端末既定の通知音設定"</string>
+ <string name="incoming_call_volume_title">"着信音量"</string>
+ <string name="notification_volume_title">"通知音量"</string>
+ <string name="checkbox_notification_same_as_incoming_call">"通知音にも着信音量を適用"</string>
+ <string name="notification_sound_dialog_title">"通知音を選択"</string>
+ <string name="media_volume_title">"メディア再生音量"</string>
+ <string name="media_volume_summary">"音楽や動画の再生音量"</string>
+ <string name="dtmf_tone_enable_title">"タッチ操作音"</string>
+ <string name="dtmf_tone_enable_summary_on">"ダイヤルパッドの操作音をONにする"</string>
+ <string name="dtmf_tone_enable_summary_off">"ダイヤルパッドの操作音をONにする"</string>
+ <string name="sound_effects_enable_title">"選択時の操作音"</string>
+ <string name="sound_effects_enable_summary_on">"メニュー選択時に音を鳴らす"</string>
+ <string name="sound_effects_enable_summary_off">"メニュー選択時に音を鳴らす"</string>
+ <string name="play_media_notification_sounds_enable_title">"SDカードの通知"</string>
+ <string name="play_media_notification_sounds_enable_summary_on">"SDカードの通知音を無効にする"</string>
+ <string name="play_media_notification_sounds_enable_summary_off">"SDカードの通知音を有効にします"</string>
+ <string name="sync_settings">"データの同期"</string>
+ <string name="sync_settings_summary">"同期するアプリケーションを選択する"</string>
+ <string name="display_settings">"画面設定"</string>
+ <string name="animations_title">"アニメーション表示"</string>
+ <string name="animations_summary_on">"ウィンドウの開閉をアニメーションで表示する"</string>
+ <string name="animations_summary_off">"ウィンドウの開閉をアニメーションで表示する"</string>
+ <string name="brightness">"画面の明るさ"</string>
+ <string name="brightness_summary">"画面の明るさを調整します"</string>
+ <string name="screen_timeout">"画面のタイムアウト"</string>
+ <string name="screen_timeout_summary">"画面が自動的にOFFになるまでの時間を調整します"</string>
+ <string name="sim_lock_settings">"SIMカードロック設定"</string>
+ <string name="sim_lock_settings_category">"SIMカードロック設定"</string>
+ <string name="sim_lock_settings_title">"SIMカードロック"</string>
+ <string name="sim_pin_toggle">"SIMカードをロック"</string>
+ <string name="sim_lock_on">"端末使用時にPIN入力が必要になります"</string>
+ <string name="sim_lock_off">"端末使用時にPIN入力が必要になります"</string>
+ <string name="sim_pin_change">"SIM PINの変更"</string>
+ <string name="sim_enter_pin">"SIM PIN"</string>
+ <string name="sim_enable_sim_lock">"SIMカードをロック"</string>
+ <string name="sim_disable_sim_lock">"SIMカードのロックを解除"</string>
+ <string name="sim_enter_old">"古いSIM PIN"</string>
+ <string name="sim_enter_new">"新しいSIM PIN"</string>
+ <string name="sim_reenter_new">"新しいPINを再入力"</string>
+ <string name="sim_change_pin">"SIM PIN"</string>
+ <string name="sim_bad_pin">"PINが正しくありません。"</string>
+ <string name="sim_pins_dont_match">"PINが一致しません。"</string>
+ <string name="sim_change_failed">"PINを変更できません。"\n"PINが正しくない可能性があります。"</string>
+ <string name="sim_change_succeeded">"SIM PINが変更されました"</string>
+ <string name="sim_lock_failed">"SIMカードのロック状態を変更できません。"\n"PINが正しくない可能性があります。"</string>
+ <string name="sim_enter_ok">"OK"</string>
+ <string name="sim_enter_cancel">"キャンセル"</string>
+ <string name="device_info_settings">"端末の状態"</string>
+ <string name="system_update_settings_list_item_title">"システムアップデート"</string>
+ <string name="system_update_settings_list_item_summary">"システムの更新を確認する"</string>
+ <string name="firmware_version">"ファームウェアバージョン"</string>
+ <string name="model_number">"モデル番号"</string>
+ <string name="baseband_version">"ベースバンドバージョン"</string>
+ <string name="kernel_version">"カーネルバージョン"</string>
+ <string name="build_number">"ビルド番号"</string>
+ <string name="device_info_not_available">"該当なし"</string>
+ <string name="device_status_activity_title">"端末の状態"</string>
+ <string name="device_status">"端末の状態"</string>
+ <string name="device_status_summary">"電話番号、端末識別番号、電波状態など"</string>
+ <string name="storage_settings_title">"SDカード &amp; 端末容量"</string>
+ <string name="storage_settings_summary">"SDカードの取り外し、空き容量の表示など"</string>
+ <string name="status_number">"電話番号"</string>
+ <string name="status_network_type">"モバイルネットワークのタイプ"</string>
+ <string name="status_data_state">"モバイルネットワークの状態"</string>
+ <string name="status_service_state">"サービスの状態"</string>
+ <string name="status_signal_strength">"電波強度"</string>
+ <string name="status_roaming">"ローミング"</string>
+ <string name="status_operator">"ネットワーク"</string>
+ <string name="status_wifi_mac_address">"Wi-Fi MACアドレス"</string>
+ <string name="status_bt_address">"Bluetoothアドレス"</string>
+ <string name="status_unavailable">"不明"</string>
+ <string name="status_network_traffic_stats">"ネットワーク使用状況"</string>
+ <string name="status_network_traffic_summary">"送信: <xliff:g id="NETWORK_TRAFFIC_0">%1$d packets, %2$d bytes%n</xliff:g>受信: <xliff:g id="NETWORK_TRAFFIC_1">%3$d packets, %4$d bytes</xliff:g>"</string>
+ <string name="status_up_time">"稼働時間"</string>
+ <string name="status_awake_time">"端末使用時間"</string>
+ <string name="internal_memory">"端末内部メモリ"</string>
+ <string name="sd_memory">"SDカード"</string>
+ <string name="memory_available">"空き容量"</string>
+ <string name="memory_size">"合計容量"</string>
+ <string name="sd_eject">"SDカードのマウント解除"</string>
+ <string name="sd_eject_summary">"SDカードの安全な取り外しのためマウント解除します"</string>
+ <string name="sd_format">"SDカードをフォーマット"</string>
+ <string name="sd_format_summary">"SDカードをフォーマット(消去)"</string>
+ <string name="sd_unavailable">"使用不可"</string>
+ <string name="read_only">" (読み取り専用)"</string>
+ <string name="battery_status_title">"電池の状態:"</string>
+ <string name="battery_level_title">"電池残量"</string>
+ <string name="apn_settings">"APN"</string>
+ <string name="apn_edit">"アクセスポイントの編集"</string>
+ <string name="apn_not_set">"&lt;未設定&gt;"</string>
+ <string name="apn_name">"名前"</string>
+ <string name="apn_apn">"APN"</string>
+ <string name="apn_http_proxy">"プロキシ"</string>
+ <string name="apn_http_port">"ポート"</string>
+ <string name="apn_user">"ユーザー名"</string>
+ <string name="apn_password">"パスワード"</string>
+ <string name="apn_server">"サーバー"</string>
+ <string name="apn_mmsc">"MMSC"</string>
+ <string name="apn_mms_proxy">"MMSプロキシ"</string>
+ <string name="apn_mms_port">"MMSポート"</string>
+ <string name="apn_mcc">"MCC"</string>
+ <string name="apn_mnc">"MNC"</string>
+ <string name="apn_type">"APNタイプ"</string>
+ <string name="menu_delete">"APNを削除"</string>
+ <string name="menu_new">"新しいAPN"</string>
+ <string name="menu_save">"保存"</string>
+ <string name="menu_cancel">"破棄"</string>
+ <string name="error_title">"注意"</string>
+ <string name="error_name_empty">"[名前]フィールドは空白にできません。"</string>
+ <string name="error_apn_empty">"APNを空にできません。"</string>
+ <string name="error_mcc_not3">"MCCのフィールドには3桁で指定してください。"</string>
+ <string name="error_mnc_not23">"MNCのフィールドには2桁か3桁で指定してください。"</string>
+ <string name="master_clear_title">"データの初期化"</string>
+ <string name="master_clear_summary">"携帯電話内のすべてのデータを消去"</string>
+ <string name="master_clear_desc">"この操作は携帯電話を出荷時の初期状態にリセットし、データとダウンロードしたアプリケーションをすべて消去します。"</string>
+ <string name="master_clear_button_text">"携帯電話をリセット"</string>
+ <string name="master_clear_final_desc">"データやアプリケーションをすべて消去して携帯電話をリセットしますか?この操作は元に戻せません。"</string>
+ <string name="master_clear_final_button_text">"すべて消去"</string>
+ <string name="master_clear_gesture_prompt">"ロック解除パターンを入力してください"</string>
+ <string name="master_clear_gesture_explanation">"携帯電話をリセットするには、ロック解除パターンを入力する必要があります。"</string>
+ <string name="master_clear_failed">"System Clearサービスが利用できないため、リセットされませんでした。"</string>
+ <string name="media_format_title">"SDカードをフォーマットします。"</string>
+ <string name="media_format_summary">"SDカードのすべてのデータを消去します"</string>
+ <string name="media_format_desc">"この操作を実行すると端末のSDカードが消去されます。カード内のすべてのデータが失われます。"</string>
+ <string name="media_format_button_text">"SDカードをフォーマット"</string>
+ <string name="media_format_final_desc">"メディアをすべて消去してSDカードをフォーマットしますか?この操作は元に戻せません。"</string>
+ <string name="media_format_final_button_text">"すべて消去"</string>
+ <string name="media_format_gesture_prompt">"ロック解除パターンを入力してください"</string>
+ <string name="media_format_gesture_explanation">"ロック解除パターンを入力してSDカードのフォーマット実行を確認する必要があります。"</string>
+ <string name="call_settings_title">"通話設定"</string>
+ <string name="call_settings_summary">"ボイスメール、電話転送、発信者番号などの設定"</string>
+ <string name="network_settings_title">"モバイルネットワーク"</string>
+ <string name="network_settings_summary">"ローミング、ネットワーク、APNの設定"</string>
+ <string name="location_title">"現在地情報"</string>
+ <string name="location_network_based">"ワイヤレスネットワークを使用"</string>
+ <string name="location_networks_disabled">"ワイヤレスネットワークを使用するアプリケーション(地図など)で位置を表示する"</string>
+ <string name="location_neighborhood_level">"Wi-Fi/モバイルネットワークで位置を検出する"</string>
+ <string name="location_gps">"GPS機能を有効にする"</string>
+ <string name="location_street_level">"高精度測位(電池を節約する場合はOFFを選択)"</string>
+ <string name="location_gps_disabled">"高精度測位(電池消費大、電波が良好な野外使用)"</string>
+ <string name="about_settings">"端末情報"</string>
+ <string name="about_settings_summary">"端末情報、法的情報、バージョン情報など"</string>
+ <string name="legal_information">"法的情報"</string>
+ <string name="contributors_title">"貢献者/連携パートナー"</string>
+ <string name="copyright_title">"著作権"</string>
+ <string name="license_title">"ライセンス"</string>
+ <string name="terms_title">"利用規約"</string>
+ <string name="settings_license_activity_title">"オープンソースライセンス"</string>
+ <string name="settings_license_activity_unavailable">"ライセンスの読み込み中に問題が発生しました。"</string>
+ <string name="settings_license_activity_loading">"読み込み中..."</string>
+ <string name="lock_settings_title">"画面ロックの解除パターン"</string>
+ <string name="lockpattern_change_lock_pattern_label">"パターンを変更する"</string>
+ <string name="lockpattern_need_to_unlock">"現在のパターンを入力"</string>
+ <string name="lockpattern_need_to_unlock_wrong">"やり直してください"</string>
+ <string name="lockpattern_recording_intro_header">"ロック解除パターンを入力"</string>
+ <string name="lockpattern_recording_intro_footer">"MENUキーでヘルプ表示"</string>
+ <string name="lockpattern_recording_inprogress">"描き終わりの点で指を離します。"</string>
+ <string name="lockpattern_recording_incorrect_too_short">"少なくとも<xliff:g id="NUMBER">%d</xliff:g>つの点を結んでください。"</string>
+ <string name="lockpattern_pattern_entered_header">"パターンが記録されました。"</string>
+ <string name="lockpattern_need_to_confirm">"確認のため、もう一度パターンを入力してください"</string>
+ <string name="lockpattern_pattern_confirmed_header">"新しいロック解除パターン:"</string>
+ <string name="lockpattern_confirm_button_text">"確認"</string>
+ <string name="lockpattern_restart_button_text">"再入力"</string>
+ <string name="lockpattern_retry_button_text">"やり直す"</string>
+ <string name="lockpattern_continue_button_text">"次へ"</string>
+ <string name="lockpattern_settings_title">"ロック解除パターン"</string>
+ <string name="lockpattern_settings_enable_title">"パターン入力必須"</string>
+ <string name="lockpattern_settings_enable_summary">"パターンを入力しないと画面ロックを解除しない"</string>
+ <string name="lockpattern_settings_enable_visible_pattern_title">"指の軌跡を線で表示する"</string>
+ <string name="lockpattern_settings_enable_tactile_feedback_title">"パターンをなぞる操作音"</string>
+ <string name="lockpattern_settings_choose_lock_pattern">"ロック解除パターン設定"</string>
+ <string name="lockpattern_settings_change_lock_pattern">"パターンを変更する"</string>
+ <string name="lockpattern_settings_help_how_to_record">"ロック解除パターンの描き方"</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_header">"誤った回数が多すぎます。"</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_footer">"<xliff:g id="NUMBER">%d</xliff:g>秒後にやり直してください。"</string>
+ <string name="skip_button_label">"キャンセル"</string>
+ <string name="next_button_label">"次へ"</string>
+ <string name="lock_title">"携帯電話の保護"</string>
+ <string name="lock_intro_message"><font size="17">"画面ロックの解除パターンを作成して携帯電話の不正使用を防ぐことができます。"\n<font height="17">\n</font><b>"1"</b>"  次の画面でパターン作成の例を参考にしてください。"\n<font height="17">\n</font><b>"2"</b>"  ロック解除パターンを決めたら、そのパターンを指でなぞって描きます。さまざまなパターンを作成できますが、最低4つの点を結んでください。"\n<font height="17">\n</font><b>"3"</b>"  確認のためもう一度そのパターンを入力します。"\n<font height="17">\n</font><b>"[次へ]を押すと次に進みます"</b>"。"\n<font height="3">\n</font>"パターンロックを設定しない場合は[キャンセル]を選択してください。"</font></string>
+ <string name="lock_example_title">"パターン例"</string>
+ <string name="lock_example_message">"少なくとも4つの点を結んで下さい。"\n" "\n"独自のパターンを決めたら[次へ]を選択します。"</string>
+ <string name="manageapplications_settings_title">"アプリケーションの管理"</string>
+ <string name="manageapplications_settings_summary">"インストール済みアプリケーションを管理/削除します"</string>
+ <string name="applications_settings">"アプリケーション"</string>
+ <string name="applications_settings_summary">"アプリケーションの管理やクイック起動ショートカットの設定"</string>
+ <string name="applications_settings_header">"アプリケーション設定"</string>
+ <string name="install_applications">"提供元不明のアプリ"</string>
+ <string name="install_unknown_applications">"サードパーティアプリケーションのインストールを許可する"</string>
+ <string name="install_all_warning">"提供元不明のアプリケーションから携帯電話や個人情報データが攻撃を受ける可能性が高くなります。このようなアプリケーションの使用により生じうる携帯電話への損害やデータの損失について、お客様がすべての責任を負うことに同意するものとします。"</string>
+ <string name="application_info_label">"アプリケーション情報"</string>
+ <string name="storage_label">"メモリ"</string>
+ <string name="auto_launch_label">"いつも起動"</string>
+ <string name="permissions_label">"許可"</string>
+ <string name="cache_header_label">"キャッシュ"</string>
+ <string name="clear_cache_btn_text">"キャッシュをクリア"</string>
+ <string name="cache_size_label">"キャッシュ"</string>
+ <string name="controls_label">"コントロール"</string>
+ <string name="force_stop">"強制停止"</string>
+ <string name="total_size_label">"合計"</string>
+ <string name="application_size_label">"アプリケーション"</string>
+ <string name="data_size_label">"データ"</string>
+ <string name="uninstall_text">"アンインストール"</string>
+ <string name="clear_user_data_text">"データを消去"</string>
+ <string name="auto_launch_enable_text">"このアプリケーションはある操作で常に起動するように設定されています。"</string>
+ <string name="auto_launch_disable_text">"端末既定の設定なし"</string>
+ <string name="clear_activities">"既定操作を消去"</string>
+ <string name="unknown">"不明"</string>
+ <string name="sort_order_alpha">"並べ替え"</string>
+ <string name="sort_order_size">"サイズ順に並べ替え"</string>
+ <string name="manage_space_text">"容量を管理"</string>
+ <string name="filter">"フィルタ"</string>
+ <string name="filter_dlg_title">"フィルタオプションを選択"</string>
+ <string name="filter_apps_all">"すべて"</string>
+ <string name="filter_apps_third_party">"サードパーティ"</string>
+ <string name="filter_apps_running">"実行中"</string>
+ <string name="loading">"読み込み中..."</string>
+ <string name="recompute_size">"サイズを再計算中..."</string>
+ <string name="clear_data_dlg_title">"削除"</string>
+ <string name="clear_data_dlg_text">"このアプリケーションで保存したすべての情報が完全に削除されます。"</string>
+ <string name="dlg_ok">"OK"</string>
+ <string name="dlg_cancel">"キャンセル"</string>
+ <string name="app_not_found_dlg_title">"アプリケーションが見つかりません"</string>
+ <string name="app_not_found_dlg_text">"インストール済みアプリケーションのリストに、このアプリケーションはありません。"</string>
+ <string name="clear_data_failed">"アプリケーションデータを消去できませんでした。"</string>
+ <string name="security_settings_desc">"このアプリケーションは下記にアクセスできます:"</string>
+ <string name="computing_size">"計算中..."</string>
+ <string name="invalid_size_value">"パッケージのサイズを計算できません"</string>
+ <string name="empty_list_msg">"サードパーティ製のアプリケーションはインストールされていません。"</string>
+ <string name="language_settings">"地域/言語 &amp; 文字入力"</string>
+ <string name="language_settings_summary">"地域と言語、文字入力、自動修正の設定"</string>
+ <string name="language_category">"地域/言語設定"</string>
+ <string name="text_category">"文字入力設定"</string>
+ <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_caps">"自動大文字変換"</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>
+ <string name="show_password">"パスワードを表示"</string>
+ <string name="show_password_summary">"入力中のパスワードを表示する"</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_add_menu_title">"追加"</string>
+ <string name="user_dict_settings_add_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">"ユーザー辞書に何も登録されていません。語句はメニューから登録できます。"</string>
+ <string name="testing">"テスト中"</string>
+ <string name="testing_phone_info">"携帯電話情報"</string>
+ <string name="testing_battery_info">"電池情報"</string>
+ <string name="testing_battery_history">"バッテリの履歴"</string>
+ <string name="quick_launch_title">"クイック起動"</string>
+ <string name="quick_launch_summary">"アプリケーションの起動にショートカットキーを割り当てる"</string>
+ <string name="quick_launch_assign_application">"アプリを選択"</string>
+ <string name="quick_launch_no_shortcut">"ショートカットなし"</string>
+ <string name="quick_launch_shortcut">"Search+<xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g>"</string>
+ <string name="quick_launch_clear_dialog_title">"消去"</string>
+ <string name="quick_launch_clear_dialog_message">"<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">"OK"</string>
+ <string name="quick_launch_clear_cancel_button">"キャンセル"</string>
+ <string name="quick_launch_display_mode_applications">"アプリケーション"</string>
+ <string name="quick_launch_display_mode_shortcuts">"ショートカット"</string>
+ <string name="input_methods_settings_title">"文字入力"</string>
+ <string name="input_methods_settings_summary">"テキスト入力オプションを管理"</string>
+ <string name="input_methods_settings_label_format">"%s設定"</string>
+ <string name="development_settings_title">"開発"</string>
+ <string name="development_settings_summary">"アプリケーション開発オプション"</string>
+ <string name="enable_adb">"USBデバッグ"</string>
+ <string name="enable_adb_summary">"USB接続時はデバッグモードにする"</string>
+ <string name="keep_screen_on">"スリープモードにしない"</string>
+ <string name="keep_screen_on_summary">"充電中に画面をスリープにしない"</string>
+ <string name="allow_mock_location">"擬似ロケーションを許可"</string>
+ <string name="allow_mock_location_summary">"擬似ロケーションを許可"</string>
+ <!-- no translation found for gadget_picker_title (98374951396755811) -->
+ <skip />
+ <!-- no translation found for widget_picker_title (9130684134213467557) -->
+ <skip />
+ <string name="battery_history_details_for">"UID %dの詳細"</string>
+ <string name="battery_history_uid">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
+ <string name="battery_history_network_usage">"<xliff:g id="APP_NAME">%1$s</xliff:g>のネットワーク使用状況の詳細:"</string>
+ <string name="battery_history_bytes_received">"受信バイト数:<xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_sent">"送信済みバイト数:<xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_total">"合計バイト数:<xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_cpu_usage">"<xliff:g id="APP_NAME">%1$s</xliff:g>のCPU使用状況の詳細:"</string>
+ <string name="battery_history_user_time">"ユーザー時間:"</string>
+ <string name="battery_history_system_time">"システム時間:"</string>
+ <string name="battery_history_total_time">"合計時間:"</string>
+ <string name="battery_history_starts">"開始:<xliff:g id="STARTS">%1$d</xliff:g>"</string>
+ <string name="battery_history_days">"<xliff:g id="DAYS">%1$d</xliff:g>日<xliff:g id="HOURS">%2$d</xliff:g>時間<xliff:g id="MINUTES">%3$d</xliff:g>分<xliff:g id="SECONDS">%4$d</xliff:g>秒"</string>
+ <string name="battery_history_hours">"<xliff:g id="HOURS">%1$d</xliff:g>時間<xliff:g id="MINUTES">%2$d</xliff:g>分<xliff:g id="SECONDS">%3$d</xliff:g>秒"</string>
+ <string name="battery_history_minutes">"<xliff:g id="MINUTES">%1$d</xliff:g>分<xliff:g id="SECONDS">%2$d</xliff:g>秒"</string>
+ <string name="battery_history_seconds">"<xliff:g id="SECONDS">%1$d</xliff:g>秒"</string>
+ <string name="battery_history_packages_sharing_this_uid">"このUIDを共有するパッケージ:"</string>
+ <string name="battery_history_no_data">"バッテリ使用状況のデータは利用できません"</string>
+ <string name="battery_history_sensor">"センサー:"</string>
+ <!-- no translation found for battery_history_wakelock (608683447522396293) -->
+ <skip />
+ <string name="battery_history_used_by_packages">"パッケージで使用されるセンサー:"</string>
+ <string name="battery_history_sensor_usage">"<xliff:g id="PACKAGE">%2$s</xliff:g>により<xliff:g id="COUNT">%1$d</xliff:g>回使用"</string>
+ <string name="battery_history_sensor_usage_multi">"次のいずれかにより<xliff:g id="COUNT">%1$d</xliff:g>回使用:"</string>
+ <!-- no translation found for battery_history_awake_label (8449792868990080882) -->
+ <skip />
+ <!-- no translation found for battery_history_screen_on_label (1848936521786339362) -->
+ <skip />
+ <!-- no translation found for battery_history_phone_on_label (700191958853142297) -->
+ <skip />
+ <!-- no translation found for battery_history_awake (4350886665719031057) -->
+ <skip />
+ <string name="battery_history_screen_on">"画面をONで使用した時間:"</string>
+ <!-- no translation found for battery_history_phone_on (4891504401623839532) -->
+ <skip />
+ <string name="battery_history_screen_on_battery">"バッテリ使用開始:"</string>
+ <string name="battery_history_screen_on_plugged">"電源に接続:"</string>
+ <string name="usage_stats_label">"使用統計情報"</string>
+ <string name="testing_usage_stats">"使用統計情報"</string>
+ <string name="display_order_text">"並べ替え:"</string>
+ <string name="app_name_label">"アプリケーション"</string>
+ <string name="launch_count_label">"回数"</string>
+ <string name="usage_time_label">"使用時間"</string>
+</resources>
diff --git a/res/values-ko-nokeys/strings.xml b/res/values-ko-nokeys/strings.xml
new file mode 100644
index 0000000..5017065
--- /dev/null
+++ b/res/values-ko-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">"응용프로그램 관리"</string>
+</resources>
diff --git a/res/values-ko/arrays.xml b/res/values-ko/arrays.xml
new file mode 100644
index 0000000..ac1c6e1
--- /dev/null
+++ b/res/values-ko/arrays.xml
@@ -0,0 +1,72 @@
+<?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>"미국"</item>
+ <item>"유럽"</item>
+ <item>"아프리카"</item>
+ <item>"아시아"</item>
+ <item>"오스트레일리아"</item>
+ <item>"태평양"</item>
+ <item>"모두"</item>
+ </string-array>
+ <string-array name="screen_timeout_entries">
+ <item>"15초"</item>
+ <item>"30초"</item>
+ <item>"1분"</item>
+ <item>"2분"</item>
+ <item>"10분"</item>
+ <item>"시간제한 없음"</item>
+ </string-array>
+ <string-array name="wifi_security_entries">
+ <item>"자동"</item>
+ <item>"없음"</item>
+ <item>"WEP"</item>
+ <item>"WPA 개인"</item>
+ <item>"WPA2 개인"</item>
+ </string-array>
+ <string-array name="wifi_security_without_auto_entries">
+ <item>"없음"</item>
+ <item>"WEP"</item>
+ <item>"WPA 개인"</item>
+ <item>"WPA2 개인"</item>
+ </string-array>
+ <string-array name="wifi_wep_type">
+ <item>"자동"</item>
+ <item>"WEP ASCII"</item>
+ <item>"WEP 16진수"</item>
+ </string-array>
+ <string-array name="wifi_sleep_policy_entries">
+ <item>"화면이 꺼질 때"</item>
+ <item>"전원에 연결되었을 때는 절전 모드로 전환되지 않음"</item>
+ <item>"전환 안 됨"</item>
+ </string-array>
+ <!-- no translation found for battery_history_type_spinner:0 (2193799199027871385) -->
+ <!-- no translation found for battery_history_type_spinner:1 (6401018715947316517) -->
+ <!-- no translation found for battery_history_type_spinner:2 (188092590354892392) -->
+ <!-- no translation found for battery_history_type_spinner:3 (8414109131222049141) -->
+ <!-- no translation found for battery_history_type_spinner:4 (1327904325081257093) -->
+ <!-- no translation found for battery_history_type_spinner:5 (4832254146664706277) -->
+ <!-- no translation found for battery_history_which_spinner:0 (3451981114763440074) -->
+ <!-- no translation found for battery_history_which_spinner:1 (166936313535197598) -->
+ <!-- no translation found for battery_history_which_spinner:2 (4793941382744963893) -->
+ <string-array name="usage_stats_display_order_types">
+ <item>"사용 시간"</item>
+ <item>"계수 시작"</item>
+ <item>"응용프로그램 이름"</item>
+ </string-array>
+</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
new file mode 100644
index 0000000..7d7590f
--- /dev/null
+++ b/res/values-ko/strings.xml
@@ -0,0 +1,672 @@
+<?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">"알 수 없음"</string>
+ <string name="turn_on_radio">"무선 켜기"</string>
+ <string name="turn_off_radio">"무선 끄기"</string>
+ <string name="turn_on_qxdm">"QXDM SD 로그 사용"</string>
+ <string name="turn_off_qxdm">"QXDM SD 로그 사용 안 함"</string>
+ <string name="radioInfo_menu_viewADN">"SIM 주소록 보기"</string>
+ <string name="radioInfo_menu_viewFDN">"FDN(전화걸 수 있는 번호) 보기"</string>
+ <string name="radioInfo_menu_viewSDN">"SDN(Service Dialing Numbers) 보기"</string>
+ <string name="radioInfo_menu_getPDP">"PDP 목록 가져오기"</string>
+ <string name="radioInfo_menu_enableData">"데이터 연결 사용"</string>
+ <string name="radioInfo_menu_disableData">"데이터 연결 사용 안 함"</string>
+ <string name="radioInfo_menu_enableDataOnBoot">"부팅할 때 데이터 사용"</string>
+ <string name="radioInfo_menu_disableDataOnBoot">"부팅할 때 데이터 사용 안 함"</string>
+ <string name="radioInfo_service_in">"서비스 상태"</string>
+ <string name="radioInfo_service_out">"서비스 지역 벗어남"</string>
+ <string name="radioInfo_service_emergency">"비상 전화만"</string>
+ <string name="radioInfo_service_off">"무선 연결 끊김"</string>
+ <string name="radioInfo_roaming_in">"로밍"</string>
+ <string name="radioInfo_roaming_not">"로밍 안 함"</string>
+ <string name="radioInfo_phone_idle">"유휴"</string>
+ <string name="radioInfo_phone_ringing">"벨이 울림"</string>
+ <string name="radioInfo_phone_offhook">"진행 중인 통화"</string>
+ <string name="radioInfo_data_disconnected">"연결끊김"</string>
+ <string name="radioInfo_data_connecting">"연결 중"</string>
+ <string name="radioInfo_data_connected">"연결됨"</string>
+ <string name="radioInfo_data_suspended">"일시정지됨"</string>
+ <string name="radioInfo_unknown">"알 수 없음"</string>
+ <string name="radioInfo_display_packets">"pkts"</string>
+ <string name="radioInfo_display_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">"SD 카드 마운트 해제"</string>
+ <string name="sdcard_format">"SD 카드가 포맷됩니다."</string>
+ <string name="small_font">"작게"</string>
+ <string name="medium_font">"보통"</string>
+ <string name="large_font">"크게"</string>
+ <string name="font_size_save">"확인"</string>
+ <string name="sdcard_setting">"SD 카드"</string>
+ <string name="battery_info_status_label">"배터리 상태:"</string>
+ <string name="battery_info_scale_label">"배터리 충전 상태:"</string>
+ <string name="battery_info_level_label">"배터리 수준:"</string>
+ <string name="battery_info_health_label">"배터리 상태:"</string>
+ <string name="battery_info_technology_label">"배터리 기술:"</string>
+ <string name="battery_info_voltage_label">"배터리 전압:"</string>
+ <string name="battery_info_voltage_units">"mV"</string>
+ <string name="battery_info_temperature_label">"배터리 온도:"</string>
+ <string name="battery_info_temperature_units">"° C"</string>
+ <string name="battery_info_uptime">"부팅 후 시간:"</string>
+ <string name="battery_info_awake_battery">"배터리 무중단 가동 시간:"</string>
+ <string name="battery_info_awake_plugged">"충전할 때 무중단 가동 시간:"</string>
+ <string name="battery_info_screen_on">"화면 켜짐:"</string>
+ <string name="battery_info_status_unknown">"알 수 없음"</string>
+ <string name="battery_info_status_charging">"충전 중"</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">"방전 중"</string>
+ <string name="battery_info_status_not_charging">"충전 안 함"</string>
+ <string name="battery_info_status_full">"충전 완료"</string>
+ <string name="battery_info_health_unknown">"알 수 없음"</string>
+ <string name="battery_info_health_good">"좋음"</string>
+ <string name="battery_info_health_overheat">"과열"</string>
+ <string name="battery_info_health_dead">"방전됨"</string>
+ <string name="battery_info_health_over_voltage">"과전압"</string>
+ <string name="battery_info_health_unspecified_failure">"알 수 없는 오류"</string>
+ <string name="bluetooth">"Bluetooth"</string>
+ <string name="bluetooth_visibility">"검색가능"</string>
+ <string name="bluetooth_is_discoverable">"<xliff:g id="DISCOVERABLE_TIME_PERIOD">%1$s</xliff:g>초 동안 검색가능..."</string>
+ <string name="bluetooth_not_discoverable">"장치를 검색가능하게 설정"</string>
+ <string name="bluetooth_devices">"Bluetooth 장치"</string>
+ <string name="bluetooth_device_name">"장치이름"</string>
+ <string name="bluetooth_name_not_set">"이름을 설정하지 않아 계정 이름 사용"</string>
+ <string name="bluetooth_scan_for_devices">"장치 검색"</string>
+ <string name="bluetooth_disconnect_blank">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> 연결이 끊어집니다."</string>
+ <string name="bluetooth_connected">"연결됨"</string>
+ <string name="bluetooth_disconnected">"연결끊김"</string>
+ <string name="bluetooth_disconnecting">"연결을 끊는 중..."</string>
+ <string name="bluetooth_connecting">"연결 중..."</string>
+ <!-- no translation found for bluetooth_unknown (1905151516611093010) -->
+ <skip />
+ <string name="bluetooth_not_connected">"이 장치와 페어링"</string>
+ <string name="bluetooth_pairing">"페어링 중..."</string>
+ <!-- no translation found for bluetooth_paired (1247541089000057726) -->
+ <skip />
+ <string name="bluetooth_device">"핸즈프리/헤드셋"</string>
+ <string name="progress_scanning">"검색 중"</string>
+ <string name="bluetooth_notif_ticker">"Bluetooth 페어링 요청"</string>
+ <string name="bluetooth_notif_title">"페어링 요청"</string>
+ <string name="bluetooth_notif_message">"페어링하려면 선택합니다. "</string>
+ <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>
+ <string name="choose_timezone">"표준시간대 선택"</string>
+ <string name="display_preview_label">"미리보기:"</string>
+ <string name="display_font_size_label">"글꼴 크기:"</string>
+ <!-- no translation found for intent_sender_data_label (8363026381459131554) -->
+ <skip />
+ <string name="intent_sender_sendbroadcast_text">"<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">"<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">"계정:"</string>
+ <string name="proxy_clear_text">"지우기"</string>
+ <string name="proxy_port_label">"포트"</string>
+ <string name="proxy_defaultView_text">"기본값 복원"</string>
+ <string name="proxy_action_text">"저장"</string>
+ <string name="proxy_hostname_label">"호스트 이름"</string>
+ <string name="proxy_error">"주의"</string>
+ <string name="proxy_error_dismiss">"확인"</string>
+ <string name="proxy_error_invalid_host">"입력한 호스트 이름이 잘못되었습니다."</string>
+ <string name="proxy_error_empty_port">"포트 필드를 입력해야 합니다."</string>
+ <string name="proxy_error_empty_host_set_port">"호스트 필드가 비어 있는 경우 포트 필드에 입력하면 안 됩니다."</string>
+ <string name="proxy_error_invalid_port">"입력한 포트가 올바르지 않습니다."</string>
+ <string name="radio_info_signal_location_label">"위치:"</string>
+ <string name="radio_info_neighboring_location_label">"인접한 CID:"</string>
+ <string name="radio_info_data_attempts_label">"데이터 시도:"</string>
+ <string name="radio_info_gprs_service_label">"GPRS 서비스:"</string>
+ <string name="radio_info_roaming_label">"로밍:"</string>
+ <string name="radio_info_imei_label">"IMEI:"</string>
+ <string name="radio_info_call_redirect_label">"통화 경로 재지정:"</string>
+ <string name="radio_info_ppp_resets_label">"부팅 후 PPP 재설정 횟수:"</string>
+ <string name="radio_info_gsm_disconnects_label">"GSM 연결끊기:"</string>
+ <string name="radio_info_current_network_label">"현재 네트워크:"</string>
+ <string name="radio_info_data_successes_label">"데이터 성공:"</string>
+ <string name="radio_info_ppp_received_label">"PPP 받음:"</string>
+ <string name="radio_info_gsm_service_label">"GSM 서비스:"</string>
+ <string name="radio_info_signal_strength_label">"신호 강도:"</string>
+ <string name="radio_info_call_status_label">"통화 상태:"</string>
+ <string name="radio_info_ppp_sent_label">"PPP 보냄:"</string>
+ <string name="radio_info_radio_resets_label">"무선 재설정:"</string>
+ <string name="radio_info_message_waiting_label">"메시지 대기 중:"</string>
+ <string name="radio_info_phone_number_label">"전화번호:"</string>
+ <string name="radio_info_band_mode_label">"무선 주파수 대역 선택"</string>
+ <string name="radio_info_network_type_label">"네트워크 유형:"</string>
+ <string name="radio_info_set_perferred_label">"기본 네트워크 유형 설정:"</string>
+ <string name="radio_info_ping_ipaddr">"IP 주소 Ping:"</string>
+ <string name="radio_info_ping_hostname">"호스트이름(www.google.com) Ping:"</string>
+ <string name="radio_info_http_client_test">"HTTP 클라이언트 테스트:"</string>
+ <string name="radio_info_toggle_ciph_label">"암호화 토글"</string>
+ <string name="ping_test_label">"Ping 테스트 실행"</string>
+ <string name="radio_info_smsc_label">"SMSC:"</string>
+ <string name="radio_info_smsc_update_label">"업데이트"</string>
+ <string name="radio_info_smsc_refresh_label">"새로고침"</string>
+ <string name="radio_info_toggle_dns_check_label">"DNS 확인 토글"</string>
+ <string name="band_mode_title">"GSM/UMTS 대역 설정"</string>
+ <string name="band_mode_loading">"대역 목록 로드 중..."</string>
+ <string name="band_mode_set">"설정"</string>
+ <string name="band_mode_failed">"실패"</string>
+ <string name="band_mode_succeeded">"성공"</string>
+ <string name="sdcard_changes_instructions">"변경사항을 적용하려면 USB 케이블을 다시 연결해야 합니다."</string>
+ <string name="sdcard_settings_screen_mass_storage_text">"USB 대용량 저장소 사용"</string>
+ <string name="sdcard_settings_total_bytes_label">"총 바이트 수:"</string>
+ <string name="sdcard_settings_not_present_status">"SD 카드 없음"</string>
+ <string name="sdcard_settings_available_bytes_label">"사용가능한 바이트:"</string>
+ <string name="sdcard_settings_mass_storage_status">"SD 카드를 대용량 저장장치로 사용 중"</string>
+ <string name="sdcard_settings_unmounted_status">"이제 SD 카드를 안전하게 제거할 수 있습니다."</string>
+ <string name="sdcard_settings_bad_removal_status">"SD 카드를 사용하는 중에 분리되었습니다."</string>
+ <string name="sdcard_settings_used_bytes_label">"사용 바이트 수:"</string>
+ <string name="sdcard_settings_scanning_status">"SD 카드에서 미디어 검색 중..."</string>
+ <string name="sdcard_settings_read_only_status">"SD 카드가 읽기전용으로 마운트됨"</string>
+ <string name="next_label">"다음"</string>
+ <string name="language_picker_title">"로케일"</string>
+ <string name="select_your_language">"언어 선택"</string>
+ <string name="activity_picker_label">"활동 선택"</string>
+ <string name="device_info_label">"장치정보"</string>
+ <string name="battery_info_label">"배터리 정보"</string>
+ <string name="battery_history_label">"배터리 기록"</string>
+ <string name="display_label">"디스플레이"</string>
+ <string name="phone_info_label">"전화기 정보"</string>
+ <string name="sd_card_settings_label">"SD 카드"</string>
+ <string name="proxy_settings_label">"프록시 설정"</string>
+ <string name="cancel">"취소"</string>
+ <string name="settings_label">"설정"</string>
+ <string name="airplane_mode">"에어플레인 모드"</string>
+ <string name="airplane_mode_summary">"모든 무선 연결 사용 안 함"</string>
+ <string name="airplane_mode_turning_on">"무선 연결을 끊는 중..."</string>
+ <string name="airplane_mode_turning_off">"무선 연결 사용 중..."</string>
+ <string name="radio_controls_title">"무선 제어"</string>
+ <string name="radio_controls_summary">"Wi-Fi, Bluetooth, 에어플레인 모드 및 모바일 네트워크 관리"</string>
+ <string name="date_and_time_settings_title">"날짜 및 시간"</string>
+ <string name="date_and_time_settings_summary">"날짜, 시간, 표준시간대 및 형식 설정"</string>
+ <string name="date_time_auto">"자동"</string>
+ <string name="date_time_auto_summaryOn">"네트워크 제공 값 사용"</string>
+ <string name="date_time_auto_summaryOff">"네트워크 제공 값 사용"</string>
+ <string name="date_time_24hour">"24시간 형식 사용"</string>
+ <string name="date_time_set_time">"시간 설정"</string>
+ <string name="date_time_set_timezone">"표준시간대 선택"</string>
+ <string name="date_time_set_date">"날짜 설정"</string>
+ <string name="date_time_date_format">"날짜형식 선택"</string>
+ <string name="zone_list_menu_sort_alphabetically">"사전순으로 정렬"</string>
+ <string name="zone_list_menu_sort_by_timezone">"시간대별 정렬"</string>
+ <string name="security_settings_title">"보안 및 위치"</string>
+ <string name="security_settings_summary">"내 위치, 화면 잠금해제, SIM 카드 잠금 설정"</string>
+ <string name="security_passwords_title">"비밀번호"</string>
+ <string name="bluetooth_quick_toggle_title">"Bluetooth"</string>
+ <string name="bluetooth_quick_toggle_summary">"Bluetooth 켜기"</string>
+ <string name="bluetooth_settings">"Bluetooth 설정"</string>
+ <string name="bluetooth_settings_title">"Bluetooth 설정"</string>
+ <string name="bluetooth_settings_summary">"연결 관리, 장치이름 및 검색가능 여부 설정"</string>
+ <string name="bluetooth_pin_entry">"Bluetooth 페어링 요청"</string>
+ <string name="bluetooth_device_info">"Bluetooth 장치 정보"</string>
+ <string name="bluetooth_enter_pin_msg">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"\n\n"페어링을 위해 PIN 입력"\n"(0000 또는 1234를 입력하세요.)"</string>
+ <string name="bluetooth_error_title">"주의"</string>
+ <string name="bluetooth_pairing_error_message">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>과(와) 페어링하는 동안 문제가 발생했습니다."</string>
+ <string name="bluetooth_pairing_pin_error_message">"입력한 PIN이 올바르지 않기 때문에 <xliff:g id="DEVICE_NAME">%1$s</xliff:g>과(와) 페어링하는 동안 문제가 발생했습니다."</string>
+ <string name="bluetooth_connecting_error_message">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>에 연결하는 동안 문제가 발생했습니다."</string>
+ <string name="bluetooth_preference_scan_title">"장치 검색"</string>
+ <string name="bluetooth_device_context_connect">"연결"</string>
+ <string name="bluetooth_device_context_disconnect">"연결끊기"</string>
+ <string name="bluetooth_device_context_pair_connect">"페어링 및 연결"</string>
+ <string name="bluetooth_device_context_unpair">"페어링 해제"</string>
+ <string name="bluetooth_device_context_disconnect_unpair">"연결끊기 및 페어링 끊기"</string>
+ <string name="bluetooth_device_context_connect_advanced">"옵션..."</string>
+ <string name="bluetooth_connect_specific_profiles_title">"연결..."</string>
+ <string name="bluetooth_profile_a2dp">"미디어"</string>
+ <string name="bluetooth_profile_headset">"전화"</string>
+ <string name="bluetooth_summary_connected_to_a2dp">"미디어 오디오에 연결됨"</string>
+ <string name="bluetooth_summary_connected_to_headset">"전화기 오디오에 연결됨"</string>
+ <string name="bluetooth_summary_connected_to_a2dp_headset">"전화기 및 미디어 오디오에 연결됨"</string>
+ <string name="bluetooth_device_advanced_title">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> 옵션"</string>
+ <string name="bluetooth_device_advanced_online_mode_title">"연결"</string>
+ <string name="bluetooth_device_advanced_online_mode_summary">"Bluetooth 장치에 연결"</string>
+ <string name="bluetooth_device_advanced_profile_header_title">"프로필"</string>
+ <string name="bluetooth_a2dp_profile_summary_connected">"미디어 오디오에 연결됨"</string>
+ <string name="bluetooth_headset_profile_summary_connected">"전화기 오디오에 연결됨"</string>
+ <string name="bluetooth_a2dp_profile_summary_use_for">"미디어 오디오에 사용"</string>
+ <string name="bluetooth_headset_profile_summary_use_for">"전화기 오디오에 사용"</string>
+ <string name="wifi">"Wi-Fi"</string>
+ <string name="wifi_quick_toggle_title">"Wi-Fi"</string>
+ <string name="wifi_quick_toggle_summary">"Wi-Fi 켜기"</string>
+ <string name="wifi_settings">"Wi-Fi 설정"</string>
+ <string name="wifi_settings_category">"Wi-Fi 설정"</string>
+ <string name="wifi_settings_summary">"무선 액세스포인트 설정 및 관리"</string>
+ <string name="forget_network">"저장 안 함"</string>
+ <string name="wifi_status">"상태"</string>
+ <string name="wifi_link_speed">"속도"</string>
+ <string name="wifi_signal_3">"우수"</string>
+ <string name="wifi_signal_2">"좋음"</string>
+ <string name="wifi_signal_1">"양호"</string>
+ <string name="wifi_signal_0">"나쁨"</string>
+ <string name="security">"보안"</string>
+ <string name="wifi_security_open">"개방"</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">"알 수 없음"</string>
+ <string name="wifi_security_verbose_open">"개방형 네트워크"</string>
+ <string name="wifi_security_verbose_wep">"WEP로 보안"</string>
+ <string name="wifi_security_verbose_wpa">"WPA로 보안"</string>
+ <string name="wifi_security_verbose_wpa2">"WPA2로 보안"</string>
+ <string name="ip_address">"IP 주소"</string>
+ <string name="signal">"신호 강도"</string>
+ <string name="wifi_starting">"켜는 중..."</string>
+ <string name="wifi_stopping">"끄는 중..."</string>
+ <string name="wifi_error">"오류"</string>
+ <string name="error_starting">"Wi-Fi를 시작할 수 없음"</string>
+ <string name="error_stopping">"Wi-Fi를 중지할 수 없음"</string>
+ <string name="error_scanning">"네트워크를 검색할 수 없음"</string>
+ <string name="error_connecting">"네트워크에 연결할 수 없음"</string>
+ <string name="error_saving">"네트워크를 저장할 수 없음"</string>
+ <string name="connect">"연결"</string>
+ <string name="connect_to_blank">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>에 연결"</string>
+ <string name="please_type_passphrase">"무선 비밀번호"</string>
+ <string name="please_type_hex_key">"WEP 16진수 키(0-9, A-F)"</string>
+ <string name="wifi_show_password">"비밀번호를 표시합니다."</string>
+ <string name="scan_wifi">"검색"</string>
+ <string name="summary_not_in_range">"범위 내에 없음"</string>
+ <string name="summary_remembered">"저장됨"</string>
+ <string name="summary_connection_failed">"연결하지 못했습니다. 다시 시도하세요."</string>
+ <string name="wifi_access_points">"Wi-Fi 네트워크"</string>
+ <string name="wifi_type_ssid">"네트워크 SSID"</string>
+ <string name="wifi_security">"보안"</string>
+ <string name="wifi_save_config">"저장"</string>
+ <string name="wifi_password_unchanged">"(변경 안 함)"</string>
+ <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_generic_connection_error">"네트워크에 연결하는 동안 문제가 발생했습니다. 다시 시도하세요."</string>
+ <string name="wifi_menu_advanced">"고급"</string>
+ <string name="wifi_ip_settings_titlebar">"IP 설정"</string>
+ <string name="wifi_ip_settings_menu_save">"저장"</string>
+ <string name="wifi_ip_settings_menu_cancel">"취소"</string>
+ <string name="wifi_ip_settings_invalid_ip">"올바른 IP 주소를 입력하세요."</string>
+ <string name="wifi_use_static_ip">"고정 IP 사용"</string>
+ <string name="wifi_ip_address">"IP 주소"</string>
+ <string name="wifi_dns1">"DNS 1"</string>
+ <string name="wifi_dns2">"DNS 2"</string>
+ <string name="wifi_gateway">"게이트웨이"</string>
+ <string name="wifi_netmask">"넷마스크"</string>
+ <string name="wifi_context_menu_connect">"네트워크 연결"</string>
+ <string name="wifi_context_menu_forget">"네트워크 저장 안 함"</string>
+ <string name="wifi_context_menu_change_password">"비밀번호 변경"</string>
+ <string name="wifi_advanced_titlebar">"고급"</string>
+ <string name="wifi_setting_num_channels_title">"규정 도메인"</string>
+ <string name="wifi_setting_num_channels_summary">"사용할 채널 수 설정"</string>
+ <string name="wifi_setting_num_channels_error">"규제 도메인을 설정하는 동안 문제가 발생했습니다."</string>
+ <string name="wifi_setting_num_channels_channel_phrase">"<xliff:g id="NUM_CHANNELS">%1$d</xliff:g>개 채널"</string>
+ <string name="wifi_setting_sleep_policy_title">"Wi-Fi 절전 정책"</string>
+ <string name="wifi_setting_sleep_policy_summary">"Wi-Fi에서 모바일 데이터로 전환될 때 표시"</string>
+ <string name="wifi_setting_sleep_policy_error">"절전 정책을 설정하는 동안 문제가 발행했습니다."</string>
+ <string name="wifi_advanced_mac_address_title">"MAC 주소"</string>
+ <string name="fragment_status_scanning">"검색 중..."</string>
+ <string name="fragment_status_connecting">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>에 연결 중..."</string>
+ <string name="fragment_status_authenticating">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>에서 인증하는 중..."</string>
+ <string name="fragment_status_obtaining_ip">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>에서 IP 주소를 가져오는 중..."</string>
+ <string name="fragment_status_connected">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>에 연결됨"</string>
+ <string name="fragment_status_disconnecting">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>에서 연결을 끊는 중..."</string>
+ <string name="fragment_status_disconnected">"연결끊김"</string>
+ <string name="fragment_status_failed">"실패"</string>
+ <string name="status_scanning">"검색 중..."</string>
+ <string name="status_connecting">"연결 중..."</string>
+ <string name="status_authenticating">"인증하는 중..."</string>
+ <string name="status_obtaining_ip">"주소를 가져오는 중..."</string>
+ <string name="status_connected">"연결됨"</string>
+ <string name="status_disconnecting">"연결을 끊는 중..."</string>
+ <string name="status_disconnected">"연결끊김"</string>
+ <string name="status_failed">"실패"</string>
+ <string name="sound_and_display_settings">"소리 및 디스플레이"</string>
+ <string name="sound_settings">"소리 설정"</string>
+ <string name="sound_and_display_settings_summary">"벨소리, 알림, 화면 밝기 설정"</string>
+ <string name="silent_mode_title">"무음 모드"</string>
+ <string name="silent_mode_summary">"미디어 및 알람 외의 모든 소리가 나지 않습니다."</string>
+ <string name="ringtone_title">"전화 벨소리"</string>
+ <string name="ringtone_summary">"수신전화 기본 벨소리 설정"</string>
+ <string name="ring_volume_title">"벨소리 볼륨"</string>
+ <string name="ring_volume_summary">"수신전화 및 알림에 대한 볼륨 설정"</string>
+ <string name="vibrate_title">"전화올 때 진동"</string>
+ <string name="vibrate_summary">"전화 올 때 진동"</string>
+ <string name="notification_sound_title">"알림 벨소리"</string>
+ <string name="notification_sound_summary">"기본 알림 벨소리 설정"</string>
+ <string name="incoming_call_volume_title">"수신전화 볼륨"</string>
+ <string name="notification_volume_title">"알림 볼륨"</string>
+ <string name="checkbox_notification_same_as_incoming_call">"알림을 위해 수신전화 볼륨 사용"</string>
+ <string name="notification_sound_dialog_title">"알림 벨소리 선택"</string>
+ <string name="media_volume_title">"미디어 볼륨"</string>
+ <string name="media_volume_summary">"음악 및 동영상에 대한 볼륨 설정"</string>
+ <string name="dtmf_tone_enable_title">"터치음 듣기"</string>
+ <string name="dtmf_tone_enable_summary_on">"다이얼패드를 사용할 때 신호음 재생"</string>
+ <string name="dtmf_tone_enable_summary_off">"다이얼패드를 사용할 때 신호음 재생"</string>
+ <string name="sound_effects_enable_title">"선택항목 듣기"</string>
+ <string name="sound_effects_enable_summary_on">"화면 선택 시 소리 재생"</string>
+ <string name="sound_effects_enable_summary_off">"화면 선택 시 소리 재생"</string>
+ <string name="play_media_notification_sounds_enable_title">"SD 카드 알림"</string>
+ <string name="play_media_notification_sounds_enable_summary_on">"SD 카드 알림 소리 사용 중지"</string>
+ <string name="play_media_notification_sounds_enable_summary_off">"SD 카드 알림 소리 사용"</string>
+ <string name="sync_settings">"데이터 동기화"</string>
+ <string name="sync_settings_summary">"동기화할 응용프로그램 선택"</string>
+ <string name="display_settings">"디스플레이 설정"</string>
+ <string name="animations_title">"애니메이션"</string>
+ <string name="animations_summary_on">"창을 열거나 닫을 때 애니메이션 표시"</string>
+ <string name="animations_summary_off">"창을 열거나 닫을 때 애니메이션 표시"</string>
+ <string name="brightness">"밝기"</string>
+ <string name="brightness_summary">"화면 밝기 조정"</string>
+ <string name="screen_timeout">"화면 시간제한"</string>
+ <string name="screen_timeout_summary">"화면 자동 꺼짐 시간 간격 조정"</string>
+ <string name="sim_lock_settings">"SIM 카드 잠금 설정"</string>
+ <string name="sim_lock_settings_category">"SIM 카드 잠금 설정"</string>
+ <string name="sim_lock_settings_title">"SIM 카드 잠금"</string>
+ <string name="sim_pin_toggle">"SIM 카드 잠금"</string>
+ <string name="sim_lock_on">"전화기를 사용하려면 PIN 필요"</string>
+ <string name="sim_lock_off">"전화기를 사용하려면 PIN 필요"</string>
+ <string name="sim_pin_change">"SIM PIN 변경"</string>
+ <string name="sim_enter_pin">"SIM PIN"</string>
+ <string name="sim_enable_sim_lock">"SIM 카드 잠금"</string>
+ <string name="sim_disable_sim_lock">"SIM 카드 잠금해제"</string>
+ <string name="sim_enter_old">"이전 SIM PIN"</string>
+ <string name="sim_enter_new">"새 SIM PIN"</string>
+ <string name="sim_reenter_new">"새 PIN 다시 입력"</string>
+ <string name="sim_change_pin">"SIM PIN"</string>
+ <string name="sim_bad_pin">"PIN이 잘못되었습니다."</string>
+ <string name="sim_pins_dont_match">"PIN이 일치하지 않습니다."</string>
+ <string name="sim_change_failed">"PIN을 변경할 수 없습니다."\n"PIN이 잘못된 것 같습니다."</string>
+ <string name="sim_change_succeeded">"SIM PIN 변경됨"</string>
+ <string name="sim_lock_failed">"SIM 카드 잠금 상태를 변경할 수 없습니다."\n"PIN이 잘못된 것 같습니다."</string>
+ <string name="sim_enter_ok">"확인"</string>
+ <string name="sim_enter_cancel">"취소"</string>
+ <string name="device_info_settings">"전화기 상태"</string>
+ <string name="system_update_settings_list_item_title">"시스템 업데이트"</string>
+ <string name="system_update_settings_list_item_summary">"시스템 업데이트 확인"</string>
+ <string name="firmware_version">"펌웨어 버전"</string>
+ <string name="model_number">"모델 번호"</string>
+ <string name="baseband_version">"기저대역 버전"</string>
+ <string name="kernel_version">"커널 버전"</string>
+ <string name="build_number">"빌드 번호"</string>
+ <string name="device_info_not_available">"표시할 수 없음"</string>
+ <string name="device_status_activity_title">"상태"</string>
+ <string name="device_status">"상태"</string>
+ <string name="device_status_summary">"IMEI, 전화번호, 신호 등"</string>
+ <string name="storage_settings_title">"SD 카드 및 전화기 저장공간"</string>
+ <string name="storage_settings_summary">"SD 카드 마운트 해제, 사용가능한 저장공간 보기"</string>
+ <string name="status_number">"전화번호"</string>
+ <string name="status_network_type">"모바일 네트워크 유형"</string>
+ <string name="status_data_state">"모바일 네트워크 상태"</string>
+ <string name="status_service_state">"서비스 상태"</string>
+ <string name="status_signal_strength">"신호 강도"</string>
+ <string name="status_roaming">"로밍"</string>
+ <string name="status_operator">"네트워크"</string>
+ <string name="status_wifi_mac_address">"Wi-Fi MAC 주소"</string>
+ <string name="status_bt_address">"Bluetooth 주소"</string>
+ <string name="status_unavailable">"사용할 수 없음"</string>
+ <string name="status_network_traffic_stats">"네트워크 사용량"</string>
+ <string name="status_network_traffic_summary">"전송: <xliff:g id="NETWORK_TRAFFIC_0">%1$d packets, %2$d bytes%n</xliff:g> 수신:<xliff:g id="NETWORK_TRAFFIC_1">%3$d packets, %4$d bytes</xliff:g>"</string>
+ <string name="status_up_time">"가동 시간"</string>
+ <string name="status_awake_time">"무중단 가동 시간"</string>
+ <string name="internal_memory">"전화기 내부 저장공간"</string>
+ <string name="sd_memory">"SD 카드"</string>
+ <string name="memory_available">"사용가능한 저장공간"</string>
+ <string name="memory_size">"총 공간"</string>
+ <string name="sd_eject">"SD 카드 마운트 해제"</string>
+ <string name="sd_eject_summary">"안전 제거를 위해 SD 카드 마운트 해제"</string>
+ <string name="sd_format">"SD 카드 포맷"</string>
+ <string name="sd_format_summary">"SD 카드 포맷(지우기)"</string>
+ <string name="sd_unavailable">"사용할 수 없음"</string>
+ <string name="read_only">" (읽기전용)"</string>
+ <string name="battery_status_title">"배터리 상태"</string>
+ <string name="battery_level_title">"배터리 수준"</string>
+ <string name="apn_settings">"APN"</string>
+ <string name="apn_edit">"액세스포인트 편집"</string>
+ <string name="apn_not_set">"&lt;설정 안 함&gt;"</string>
+ <string name="apn_name">"이름"</string>
+ <string name="apn_apn">"APN"</string>
+ <string name="apn_http_proxy">"프록시"</string>
+ <string name="apn_http_port">"포트"</string>
+ <string name="apn_user">"사용자 이름"</string>
+ <string name="apn_password">"비밀번호"</string>
+ <string name="apn_server">"서버"</string>
+ <string name="apn_mmsc">"MMSC"</string>
+ <string name="apn_mms_proxy">"MMS 프록시"</string>
+ <string name="apn_mms_port">"MMS 포트"</string>
+ <string name="apn_mcc">"MCC"</string>
+ <string name="apn_mnc">"MNC"</string>
+ <string name="apn_type">"APN 유형"</string>
+ <string name="menu_delete">"APN 삭제"</string>
+ <string name="menu_new">"새 APN"</string>
+ <string name="menu_save">"저장"</string>
+ <string name="menu_cancel">"삭제"</string>
+ <string name="error_title">"주의"</string>
+ <string name="error_name_empty">"이름 필드는 비워둘 수 없습니다."</string>
+ <string name="error_apn_empty">"APN을 비워둘 수 없습니다."</string>
+ <string name="error_mcc_not3">"MCC 필드는 3자리 숫자여야 합니다."</string>
+ <string name="error_mnc_not23">"MNC 필드는 2~3자리 숫자여야 합니다."</string>
+ <string name="master_clear_title">"공장 기본값 데이터 재설정"</string>
+ <string name="master_clear_summary">"전화기의 모든 데이터 지우기"</string>
+ <string name="master_clear_desc">"이 작업을 수행하면 전화기의 모든 데이터 및 다운로드한 응용프로그램이 지워지고 출고시 초기 상태로 재설정됩니다"</string>
+ <string name="master_clear_button_text">"전화기 재설정"</string>
+ <string name="master_clear_final_desc">"모든 데이터 및 응용프로그램을 지우고 전화기를 재설정하시겠습니까? 수행한 후에는 작업을 취소할 수 없습니다."</string>
+ <string name="master_clear_final_button_text">"모두 지우기"</string>
+ <string name="master_clear_gesture_prompt">"잠금해제 패턴 그리기"</string>
+ <string name="master_clear_gesture_explanation">"전화기 재설정을 확인하려면 잠금해제 패턴을 그려야 합니다."</string>
+ <string name="master_clear_failed">"시스템 지우기 서비스를 사용할 수 없어 재설정을 수행하지 못했습니다."</string>
+ <string name="media_format_title">"SD 카드를 포맷합니다."</string>
+ <string name="media_format_summary">"SD 카드의 모든 데이터 지우기"</string>
+ <string name="media_format_desc">"이 작업을 수행하면 전화기의 SD 카드에 저장된 모든 데이터를 잃게 됩니다."</string>
+ <string name="media_format_button_text">"SD 카드 포맷"</string>
+ <string name="media_format_final_desc">"SD 카드를 포맷하여 모든 미디어를 지우시겠습니까? 수행한 작업은 취소할 수 없습니다."</string>
+ <string name="media_format_final_button_text">"모두 지우기"</string>
+ <string name="media_format_gesture_prompt">"잠금해제 패턴을 그리세요."</string>
+ <string name="media_format_gesture_explanation">"SD 카드 포맷을 확인하려면 잠금해제 패턴을 그려야 합니다."</string>
+ <string name="call_settings_title">"통화 설정"</string>
+ <string name="call_settings_summary">"음성메일, 착신전환, 통화중 대기, 발신자 번호 설정"</string>
+ <string name="network_settings_title">"모바일 네트워크"</string>
+ <string name="network_settings_summary">"로밍, 네트워크, APN에 대한 옵션 설정"</string>
+ <string name="location_title">"내 위치 소스"</string>
+ <string name="location_network_based">"무선 네트워크 사용"</string>
+ <string name="location_networks_disabled">"무선 네트워크를 사용하는 응용프로그램(예: 지도)에서 위치 보기"</string>
+ <string name="location_neighborhood_level">"Wi-Fi 및/또는 모바일 네트워크에서 측정된 위치"</string>
+ <string name="location_gps">"GPS 위성 사용"</string>
+ <string name="location_street_level">"도로 수준으로 정확하게 탐색(배터리를 절약하려면 선택 취소)"</string>
+ <string name="location_gps_disabled">"도로 수준으로 탐색(항공사진이 더해져 배터리 추가로 필요)"</string>
+ <string name="about_settings">"전화기 정보"</string>
+ <string name="about_settings_summary">"법률 정보, 전화기 상태, 소프트웨어 버전 보기"</string>
+ <string name="legal_information">"법률정보"</string>
+ <string name="contributors_title">"조력자"</string>
+ <string name="copyright_title">"저작권"</string>
+ <string name="license_title">"라이센스"</string>
+ <string name="terms_title">"약관"</string>
+ <string name="settings_license_activity_title">"오픈소스 라이센스"</string>
+ <string name="settings_license_activity_unavailable">"라이센스를 로드하는 동안 문제가 발생했습니다."</string>
+ <string name="settings_license_activity_loading">"로드 중..."</string>
+ <string name="lock_settings_title">"화면 잠금해제 패턴"</string>
+ <string name="lockpattern_change_lock_pattern_label">"잠금해제 패턴 변경"</string>
+ <string name="lockpattern_need_to_unlock">"저장된 패턴 확인"</string>
+ <string name="lockpattern_need_to_unlock_wrong">"죄송합니다. 다시 시도하세요."</string>
+ <string name="lockpattern_recording_intro_header">"잠금해제 패턴 그리기"</string>
+ <string name="lockpattern_recording_intro_footer">"도움말을 보려면 메뉴를 누르세요."</string>
+ <string name="lockpattern_recording_inprogress">"완료되면 손가락을 뗍니다."</string>
+ <string name="lockpattern_recording_incorrect_too_short">"<xliff:g id="NUMBER">%d</xliff:g>개 이상의 점을 연결합니다. 다시 시도하세요."</string>
+ <string name="lockpattern_pattern_entered_header">"패턴이 기록되었습니다."</string>
+ <string name="lockpattern_need_to_confirm">"확인을 위해 패턴 다시 그리기:"</string>
+ <string name="lockpattern_pattern_confirmed_header">"새 잠금해제 패턴:"</string>
+ <string name="lockpattern_confirm_button_text">"확인"</string>
+ <string name="lockpattern_restart_button_text">"다시 그리기"</string>
+ <string name="lockpattern_retry_button_text">"다시 시도"</string>
+ <string name="lockpattern_continue_button_text">"계속"</string>
+ <string name="lockpattern_settings_title">"잠금해제 패턴"</string>
+ <string name="lockpattern_settings_enable_title">"패턴 필요"</string>
+ <string name="lockpattern_settings_enable_summary">"화면 잠금을 해제하려면 패턴을 그려야 함"</string>
+ <string name="lockpattern_settings_enable_visible_pattern_title">"패턴 표시"</string>
+ <string name="lockpattern_settings_enable_tactile_feedback_title">"촉각 피드백 사용"</string>
+ <string name="lockpattern_settings_choose_lock_pattern">"잠금해제 패턴 설정"</string>
+ <string name="lockpattern_settings_change_lock_pattern">"잠금해제 패턴 변경"</string>
+ <string name="lockpattern_settings_help_how_to_record">"잠금해제 패턴을 그리는 방법"</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_header">"잘못된 시도 횟수가 너무 많습니다."</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_footer">"<xliff:g id="NUMBER">%d</xliff:g>초 후에 다시 시도하세요."</string>
+ <string name="skip_button_label">"취소"</string>
+ <string name="next_button_label">"다음"</string>
+ <string name="lock_title">"전화기 보안 설정"</string>
+ <string name="lock_intro_message"><font size="17">"개인 화면 잠금해제 패턴을 만들어 전화기 무단 사용을 방지합니다. "\n<font height="17">\n</font><b>"1"</b>"  다음 화면에서 패턴을 예를 들어 그리는 동안 지켜봅니다. "\n<font height="17">\n</font><b>"2"</b>"  준비가 되면 사용자만의 개인 잠금해제 패턴을 그립니다. 여러 개의 패턴을 시험해 볼 수 있지만 4개 이상의 점을 연결해야 합니다. "\n<font height="17">\n</font><b>"3"</b>"  패턴을 다시 그려 확인합니다. "\n<font height="17">\n</font><b>"패턴 그리기를 시작하려면 \'다음\'을 선택하세요"</b>". "\n<font height="3">\n</font>"전화기 보호 화면을 설정하지 않으려면 \'취소\'를 선택하세요."</font></string>
+ <string name="lock_example_title">"패턴 예"</string>
+ <string name="lock_example_message">"4개 이상의 점을 연결합니다."\n\n"고유한 패턴을 그릴 준비가 되면 \'다음\'을 선택합니다."</string>
+ <string name="manageapplications_settings_title">"응용프로그램 관리"</string>
+ <string name="manageapplications_settings_summary">"설치된 응용프로그램 관리 및 제거"</string>
+ <string name="applications_settings">"응용프로그램"</string>
+ <string name="applications_settings_summary">"응용프로그램 관리, 빠른실행 바로가기 설정"</string>
+ <string name="applications_settings_header">"응용프로그램 설정"</string>
+ <string name="install_applications">"알 수 없는 소스"</string>
+ <string name="install_unknown_applications">"시판되지 않은 응용프로그램 설치 허용"</string>
+ <string name="install_all_warning">"전화기 및 개인 정보는 출처를 알 수 없는 응용프로그램의 공격에 더욱 취약합니다. 사용자는 이러한 응용프로그램을 사용하여 발생할 수 있는 전화기 손상이나 데이터 손실에 대해 사용자가 단독으로 책임이 있음을 동의합니다."</string>
+ <string name="application_info_label">"응용프로그램 정보"</string>
+ <string name="storage_label">"저장공간"</string>
+ <string name="auto_launch_label">"기본적으로 시작"</string>
+ <string name="permissions_label">"권한"</string>
+ <string name="cache_header_label">"캐시"</string>
+ <string name="clear_cache_btn_text">"캐시 지우기"</string>
+ <string name="cache_size_label">"캐시"</string>
+ <string name="controls_label">"제어"</string>
+ <string name="force_stop">"강제 종료"</string>
+ <string name="total_size_label">"총 용량"</string>
+ <string name="application_size_label">"응용프로그램"</string>
+ <string name="data_size_label">"데이터"</string>
+ <string name="uninstall_text">"제거"</string>
+ <string name="clear_user_data_text">"데이터 지우기"</string>
+ <string name="auto_launch_enable_text">"이 응용프로그램을 해당 작업에 대한 기본 프로그램으로 실행하도록 선택했습니다."</string>
+ <string name="auto_launch_disable_text">"기본값이 설정되지 않았습니다."</string>
+ <string name="clear_activities">"기본 작업 지우기"</string>
+ <string name="unknown">"알 수 없음"</string>
+ <string name="sort_order_alpha">"정렬"</string>
+ <string name="sort_order_size">"크기별 정렬"</string>
+ <string name="manage_space_text">"공간 관리"</string>
+ <string name="filter">"필터"</string>
+ <string name="filter_dlg_title">"필터 옵션 선택"</string>
+ <string name="filter_apps_all">"모두"</string>
+ <string name="filter_apps_third_party">"제3자"</string>
+ <string name="filter_apps_running">"실행 중인 패키지"</string>
+ <string name="loading">"로드 중..."</string>
+ <string name="recompute_size">"크기 다시 계산 중..."</string>
+ <string name="clear_data_dlg_title">"삭제"</string>
+ <string name="clear_data_dlg_text">"응용프로그램에 저장한 모든 정보가 영구적으로 삭제됩니다."</string>
+ <string name="dlg_ok">"확인"</string>
+ <string name="dlg_cancel">"취소"</string>
+ <string name="app_not_found_dlg_title">"응용프로그램 없음"</string>
+ <string name="app_not_found_dlg_text">"설치된 응용프로그램 목록에서 응용프로그램을 찾을 수 없습니다."</string>
+ <string name="clear_data_failed">"응용프로그램 데이터를 지울 수 없습니다."</string>
+ <string name="security_settings_desc">"이 응용프로그램은 전화기의 다음 항목에 액세스할 수 있습니다."</string>
+ <string name="computing_size">"계산 중..."</string>
+ <string name="invalid_size_value">"패키지 크기를 계산할 수 없습니다."</string>
+ <string name="empty_list_msg">"타사 응용프로그램이 설치되어 있지 않습니다."</string>
+ <string name="language_settings">"로케일 및 텍스트"</string>
+ <string name="language_settings_summary">"로케일(언어 및 지역), 텍스트 입력 및 자동 수정 옵션 설정"</string>
+ <string name="language_category">"로케일 설정"</string>
+ <string name="text_category">"텍스트 설정"</string>
+ <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_caps">"자동 대문자 입력"</string>
+ <string name="auto_caps_summary">"문장의 첫 글자를 대문자로"</string>
+ <string name="auto_punctuate">"자동 구두점 입력"</string>
+ <string name="hardkeyboard_category">"물리적 키보드 설정"</string>
+ <string name="auto_punctuate_summary">"스페이스바를 두 번 눌러 \'.\' 삽입"</string>
+ <string name="show_password">"비밀번호 표시"</string>
+ <string name="show_password_summary">"입력 시 비밀번호 표시"</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_add_menu_title">"추가"</string>
+ <string name="user_dict_settings_add_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">"사용자 사전에 단어가 없습니다. 메뉴를 통해 단어를 추가할 수 있습니다."</string>
+ <string name="testing">"테스트 중"</string>
+ <string name="testing_phone_info">"전화기 정보"</string>
+ <string name="testing_battery_info">"배터리 정보"</string>
+ <string name="testing_battery_history">"배터리 기록"</string>
+ <string name="quick_launch_title">"빠른실행"</string>
+ <string name="quick_launch_summary">"응용프로그램을 실행하는 바로가기키 설정"</string>
+ <string name="quick_launch_assign_application">"응용프로그램 할당"</string>
+ <string name="quick_launch_no_shortcut">"바로가기 없음"</string>
+ <string name="quick_launch_shortcut">"검색 + <xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g>"</string>
+ <string name="quick_launch_clear_dialog_title">"지우기"</string>
+ <string name="quick_launch_clear_dialog_message">"<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">"확인"</string>
+ <string name="quick_launch_clear_cancel_button">"취소"</string>
+ <string name="quick_launch_display_mode_applications">"응용프로그램"</string>
+ <string name="quick_launch_display_mode_shortcuts">"바로가기"</string>
+ <string name="input_methods_settings_title">"텍스트 입력"</string>
+ <string name="input_methods_settings_summary">"텍스트 입력 옵션 관리"</string>
+ <string name="input_methods_settings_label_format">"%s 설정"</string>
+ <string name="development_settings_title">"개발"</string>
+ <string name="development_settings_summary">"응용프로그램 개발 옵션 설정"</string>
+ <string name="enable_adb">"USB 디버깅"</string>
+ <string name="enable_adb_summary">"USB가 연결된 경우 디버그 모드"</string>
+ <string name="keep_screen_on">"켜진 상태로 유지"</string>
+ <string name="keep_screen_on_summary">"충전하는 동안 화면이 꺼지지 않음"</string>
+ <string name="allow_mock_location">"모의 위치 허용"</string>
+ <string name="allow_mock_location_summary">"모의 위치 허용"</string>
+ <!-- no translation found for gadget_picker_title (98374951396755811) -->
+ <skip />
+ <!-- no translation found for widget_picker_title (9130684134213467557) -->
+ <skip />
+ <string name="battery_history_details_for">"UID %d의 세부정보"</string>
+ <string name="battery_history_uid">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
+ <string name="battery_history_network_usage">"<xliff:g id="APP_NAME">%1$s</xliff:g>의 네트워크 사용 세부정보"</string>
+ <string name="battery_history_bytes_received">"받은 바이트 수: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_sent">"보낸 바이트 수: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_total">"총 바이트 수: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_cpu_usage">"<xliff:g id="APP_NAME">%1$s</xliff:g>의 CPU 사용 세부정보"</string>
+ <string name="battery_history_user_time">"사용자 시간:"</string>
+ <string name="battery_history_system_time">"시스템 시간:"</string>
+ <string name="battery_history_total_time">"시간 합계:"</string>
+ <string name="battery_history_starts">"시작: <xliff:g id="STARTS">%1$d</xliff:g>번"</string>
+ <string name="battery_history_days">"<xliff:g id="DAYS">%1$d</xliff:g>일, <xliff:g id="HOURS">%2$d</xliff:g>시간, <xliff:g id="MINUTES">%3$d</xliff:g>분, <xliff:g id="SECONDS">%4$d</xliff:g>초"</string>
+ <string name="battery_history_hours">"<xliff:g id="HOURS">%1$d</xliff:g>시간, <xliff:g id="MINUTES">%2$d</xliff:g>분, <xliff:g id="SECONDS">%3$d</xliff:g>초"</string>
+ <string name="battery_history_minutes">"<xliff:g id="MINUTES">%1$d</xliff:g>분, <xliff:g id="SECONDS">%2$d</xliff:g>초"</string>
+ <string name="battery_history_seconds">"<xliff:g id="SECONDS">%1$d</xliff:g>초"</string>
+ <string name="battery_history_packages_sharing_this_uid">"이 UID를 공유하는 패키지"</string>
+ <string name="battery_history_no_data">"배터리 사용 데이터가 없습니다."</string>
+ <string name="battery_history_sensor">"센서:"</string>
+ <!-- no translation found for battery_history_wakelock (608683447522396293) -->
+ <skip />
+ <string name="battery_history_used_by_packages">"패키지가 사용한 센서:"</string>
+ <string name="battery_history_sensor_usage">"<xliff:g id="PACKAGE">%2$s</xliff:g>에서 <xliff:g id="COUNT">%1$d</xliff:g>번 사용"</string>
+ <string name="battery_history_sensor_usage_multi">"다음 중 하나가 <xliff:g id="COUNT">%1$d</xliff:g>번 사용:"</string>
+ <!-- no translation found for battery_history_awake_label (8449792868990080882) -->
+ <skip />
+ <!-- no translation found for battery_history_screen_on_label (1848936521786339362) -->
+ <skip />
+ <!-- no translation found for battery_history_phone_on_label (700191958853142297) -->
+ <skip />
+ <!-- no translation found for battery_history_awake (4350886665719031057) -->
+ <skip />
+ <string name="battery_history_screen_on">"화면을 켠 상태에서 소비한 시간:"</string>
+ <!-- no translation found for battery_history_phone_on (4891504401623839532) -->
+ <skip />
+ <string name="battery_history_screen_on_battery">"배터리 켜짐 시간:"</string>
+ <string name="battery_history_screen_on_plugged">"연결됨:"</string>
+ <string name="usage_stats_label">"사용 통계"</string>
+ <string name="testing_usage_stats">"사용 통계"</string>
+ <string name="display_order_text">"정렬 기준:"</string>
+ <string name="app_name_label">"응용프로그램"</string>
+ <string name="launch_count_label">"계수"</string>
+ <string name="usage_time_label">"사용 시간"</string>
+</resources>
diff --git a/res/values-nb-nokeys/strings.xml b/res/values-nb-nokeys/strings.xml
new file mode 100644
index 0000000..0e080b4
--- /dev/null
+++ b/res/values-nb-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">"Installerte applikasjoner, hurtigtaster"</string>
+</resources>
diff --git a/res/values-nb/arrays.xml b/res/values-nb/arrays.xml
new file mode 100644
index 0000000..e219452
--- /dev/null
+++ b/res/values-nb/arrays.xml
@@ -0,0 +1,68 @@
+<?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>"Amerika"</item>
+ <item>"Europa"</item>
+ <item>"Afrika"</item>
+ <item>"Asia"</item>
+ <item>"Australia"</item>
+ <item>"Stillehavet"</item>
+ <item>"Alle"</item>
+ </string-array>
+ <string-array name="screen_timeout_entries">
+ <item>"15 sekunder"</item>
+ <item>"30 sekunder"</item>
+ <item>"1 minutt"</item>
+ <item>"2 minutter"</item>
+ <item>"10 minutter"</item>
+ <item>"Aldri slå av"</item>
+ </string-array>
+ <string-array name="wifi_security_entries">
+ <item>"Automatisk"</item>
+ <item>"Ingen"</item>
+ <item>"WEP"</item>
+ <item>"WPA personlig"</item>
+ <item>"WPA2 personlig"</item>
+ </string-array>
+ <string-array name="wifi_security_without_auto_entries">
+ <item>"Ingen"</item>
+ <item>"WEP"</item>
+ <item>"WPA personlig"</item>
+ <item>"WPA2 personlig"</item>
+ </string-array>
+ <string-array name="wifi_wep_type">
+ <item>"Automatisk"</item>
+ <item>"WEP ASCII"</item>
+ <item>"WEP heksadesimal"</item>
+ </string-array>
+ <!-- no translation found for wifi_sleep_policy_entries:0 (3804733751095821976) -->
+ <!-- no translation found for wifi_sleep_policy_entries:1 (1549288661423279207) -->
+ <!-- no translation found for wifi_sleep_policy_entries:2 (1986753720941888596) -->
+ <!-- no translation found for battery_history_type_spinner:0 (2193799199027871385) -->
+ <!-- no translation found for battery_history_type_spinner:1 (6401018715947316517) -->
+ <!-- no translation found for battery_history_type_spinner:2 (188092590354892392) -->
+ <!-- no translation found for battery_history_type_spinner:3 (8414109131222049141) -->
+ <!-- no translation found for battery_history_type_spinner:4 (1327904325081257093) -->
+ <!-- no translation found for battery_history_type_spinner:5 (4832254146664706277) -->
+ <!-- no translation found for battery_history_which_spinner:0 (3451981114763440074) -->
+ <!-- no translation found for battery_history_which_spinner:1 (166936313535197598) -->
+ <!-- no translation found for battery_history_which_spinner:2 (4793941382744963893) -->
+ <!-- no translation found for usage_stats_display_order_types:0 (9077371706468756228) -->
+ <!-- no translation found for usage_stats_display_order_types:1 (1908750532762193304) -->
+ <!-- no translation found for usage_stats_display_order_types:2 (1213951670006606353) -->
+</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
new file mode 100644
index 0000000..f111758
--- /dev/null
+++ b/res/values-nb/strings.xml
@@ -0,0 +1,670 @@
+<?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">"Ukjent"</string>
+ <string name="turn_on_radio">"Turn on radio"</string>
+ <string name="turn_off_radio">"Turn off radio"</string>
+ <string name="turn_on_qxdm">"Enable QXDM SD log"</string>
+ <string name="turn_off_qxdm">"Disable QXDM SD log"</string>
+ <string name="radioInfo_menu_viewADN">"View SIM address book"</string>
+ <string name="radioInfo_menu_viewFDN">"View Fixed Dialing Numbers"</string>
+ <string name="radioInfo_menu_viewSDN">"View Service Dialing Numbers"</string>
+ <string name="radioInfo_menu_getPDP">"Get PDP list"</string>
+ <string name="radioInfo_menu_enableData">"Enable data connection"</string>
+ <string name="radioInfo_menu_disableData">"Disable data connection"</string>
+ <string name="radioInfo_menu_enableDataOnBoot">"Enable data on boot"</string>
+ <string name="radioInfo_menu_disableDataOnBoot">"Disable data on boot"</string>
+ <string name="radioInfo_service_in">"In service"</string>
+ <string name="radioInfo_service_out">"Out of service"</string>
+ <string name="radioInfo_service_emergency">"Emergency calls only"</string>
+ <string name="radioInfo_service_off">"Radio off"</string>
+ <string name="radioInfo_roaming_in">"Roaming"</string>
+ <string name="radioInfo_roaming_not">"Not roaming"</string>
+ <string name="radioInfo_phone_idle">"Idle"</string>
+ <string name="radioInfo_phone_ringing">"Ringing"</string>
+ <string name="radioInfo_phone_offhook">"Call in progress"</string>
+ <string name="radioInfo_data_disconnected">"Disconnected"</string>
+ <string name="radioInfo_data_connecting">"Connecting"</string>
+ <string name="radioInfo_data_connected">"Connected"</string>
+ <string name="radioInfo_data_suspended">"Suspended"</string>
+ <string name="radioInfo_unknown">"unknown"</string>
+ <string name="radioInfo_display_packets">"pkts"</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">"Unmount SD card"</string>
+ <string name="sdcard_format">"Format SD card"</string>
+ <string name="small_font">"Liten"</string>
+ <string name="medium_font">"Middels"</string>
+ <string name="large_font">"Stor"</string>
+ <string name="font_size_save">"OK"</string>
+ <string name="sdcard_setting">"Minnekort"</string>
+ <string name="battery_info_status_label">"Battery status:"</string>
+ <string name="battery_info_scale_label">"Battery scale:"</string>
+ <string name="battery_info_level_label">"Battery level:"</string>
+ <string name="battery_info_health_label">"Battery health:"</string>
+ <string name="battery_info_technology_label">"Battery technology:"</string>
+ <string name="battery_info_voltage_label">"Battery voltage:"</string>
+ <string name="battery_info_voltage_units">"mV"</string>
+ <string name="battery_info_temperature_label">"Battery temperature:"</string>
+ <string name="battery_info_temperature_units">"° C"</string>
+ <string name="battery_info_uptime">"Time since boot:"</string>
+ <string name="battery_info_awake_battery">"Awake time on battery:"</string>
+ <string name="battery_info_awake_plugged">"Awake time when charging:"</string>
+ <string name="battery_info_screen_on">"Screen ON time:"</string>
+ <string name="battery_info_status_unknown">"Unknown"</string>
+ <string name="battery_info_status_charging">"Charging"</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">"Discharging"</string>
+ <string name="battery_info_status_not_charging">"Not charging"</string>
+ <string name="battery_info_status_full">"Full"</string>
+ <string name="battery_info_health_unknown">"Unknown"</string>
+ <string name="battery_info_health_good">"Good"</string>
+ <string name="battery_info_health_overheat">"Overheat"</string>
+ <string name="battery_info_health_dead">"Dead"</string>
+ <string name="battery_info_health_over_voltage">"Over voltage"</string>
+ <string name="battery_info_health_unspecified_failure">"Unknown error"</string>
+ <string name="bluetooth">"Bluetooth"</string>
+ <string name="bluetooth_visibility">"Synlig"</string>
+ <string name="bluetooth_is_discoverable">"Synlig i <xliff:g id="DISCOVERABLE_TIME_PERIOD">%1$s</xliff:g> sekunder…"</string>
+ <string name="bluetooth_not_discoverable">"Gjør enheten synlig"</string>
+ <string name="bluetooth_devices">"Bluetooth-enheter"</string>
+ <string name="bluetooth_device_name">"Enhetsnavn"</string>
+ <string name="bluetooth_name_not_set">"Ikke noe navn er valgt, bruker kontonavn"</string>
+ <string name="bluetooth_scan_for_devices">"Søk etter enheter"</string>
+ <string name="bluetooth_disconnect_blank">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> vil bli koblet fra."</string>
+ <string name="bluetooth_connected">"Tilkoblet"</string>
+ <string name="bluetooth_disconnected">"Frakoblet"</string>
+ <string name="bluetooth_disconnecting">"Kobler fra…"</string>
+ <string name="bluetooth_connecting">"Kobler til…"</string>
+ <!-- no translation found for bluetooth_unknown (1905151516611093010) -->
+ <skip />
+ <string name="bluetooth_not_connected">"Par med denne enheten"</string>
+ <string name="bluetooth_pairing">"Parer…"</string>
+ <string name="bluetooth_paired">"Paret"</string>
+ <string name="bluetooth_device">"handsfree/håndsett"</string>
+ <string name="progress_scanning">"Søker"</string>
+ <string name="bluetooth_notif_ticker">"Paringsforespørsel for Bluetooth"</string>
+ <string name="bluetooth_notif_title">"Paringsforespørsel"</string>
+ <string name="bluetooth_notif_message">"Velg å pare med "</string>
+ <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>
+ <string name="choose_timezone">"Velg tidssone"</string>
+ <string name="display_preview_label">"Forhåndsvisning:"</string>
+ <string name="display_font_size_label">"Skriftstørrelse:"</string>
+ <!-- no translation found for intent_sender_data_label (8363026381459131554) -->
+ <skip />
+ <string name="intent_sender_sendbroadcast_text">"Send <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">"Start <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">"Account:"</string>
+ <string name="proxy_clear_text">"Tøm"</string>
+ <string name="proxy_port_label">"Port"</string>
+ <string name="proxy_defaultView_text">"Gjenopprett standardinnstillinger"</string>
+ <string name="proxy_action_text">"Lagre"</string>
+ <string name="proxy_hostname_label">"Vertsnavn"</string>
+ <string name="proxy_error">"NB"</string>
+ <string name="proxy_error_dismiss">"OK"</string>
+ <string name="proxy_error_invalid_host">"Vertsnavnet er ikke gyldig."</string>
+ <string name="proxy_error_empty_port">"Du må skrive inn et portnummer."</string>
+ <string name="proxy_error_empty_host_set_port">"Feltet for portnummer må være tomt om feltet for vertsnavn er tomt."</string>
+ <string name="proxy_error_invalid_port">"Portnummeret er ikke gyldig."</string>
+ <string name="radio_info_signal_location_label">"Location:"</string>
+ <string name="radio_info_neighboring_location_label">"Neighboring CID:"</string>
+ <string name="radio_info_data_attempts_label">"Data attempts:"</string>
+ <string name="radio_info_gprs_service_label">"GPRS service:"</string>
+ <string name="radio_info_roaming_label">"Roaming:"</string>
+ <string name="radio_info_imei_label">"IMEI:"</string>
+ <string name="radio_info_call_redirect_label">"Call redirect:"</string>
+ <string name="radio_info_ppp_resets_label">"Number of PPP reset since boot:"</string>
+ <string name="radio_info_gsm_disconnects_label">"GSM disconnects:"</string>
+ <string name="radio_info_current_network_label">"Current network:"</string>
+ <string name="radio_info_data_successes_label">"Data successes:"</string>
+ <string name="radio_info_ppp_received_label">"PPP received:"</string>
+ <string name="radio_info_gsm_service_label">"GSM service:"</string>
+ <string name="radio_info_signal_strength_label">"Signal strength:"</string>
+ <string name="radio_info_call_status_label">"Call status:"</string>
+ <string name="radio_info_ppp_sent_label">"PPP sent:"</string>
+ <string name="radio_info_radio_resets_label">"Radio resets:"</string>
+ <string name="radio_info_message_waiting_label">"Message waiting:"</string>
+ <string name="radio_info_phone_number_label">"Phone number:"</string>
+ <string name="radio_info_band_mode_label">"Select radio band"</string>
+ <string name="radio_info_network_type_label">"Network type:"</string>
+ <string name="radio_info_set_perferred_label">"Set preferred network type:"</string>
+ <string name="radio_info_ping_ipaddr">"Ping IpAddr:"</string>
+ <string name="radio_info_ping_hostname">"Ping Hostname(www.google.com):"</string>
+ <string name="radio_info_http_client_test">"HTTP Client test:"</string>
+ <string name="radio_info_toggle_ciph_label">"Toggle ciphering"</string>
+ <string name="ping_test_label">"Run ping test"</string>
+ <string name="radio_info_smsc_label">"SMSC:"</string>
+ <string name="radio_info_smsc_update_label">"Update"</string>
+ <string name="radio_info_smsc_refresh_label">"Refresh"</string>
+ <string name="radio_info_toggle_dns_check_label">"Toggle DNS check"</string>
+ <string name="band_mode_title">"Velg GSM/UMTS-bånd"</string>
+ <string name="band_mode_loading">"Henter båndliste…"</string>
+ <string name="band_mode_set">"Velg"</string>
+ <string name="band_mode_failed">"Mislykket"</string>
+ <string name="band_mode_succeeded">"Vellykket"</string>
+ <string name="sdcard_changes_instructions">"Endringene vil tre i kraft når USB-kabelen kobles til på nytt"</string>
+ <string name="sdcard_settings_screen_mass_storage_text">"Skru på USB-masselagring"</string>
+ <string name="sdcard_settings_total_bytes_label">"Totalt antall byte:"</string>
+ <string name="sdcard_settings_not_present_status">"Minnekort mangler"</string>
+ <string name="sdcard_settings_available_bytes_label">"Tilgjengelig antall byte:"</string>
+ <string name="sdcard_settings_mass_storage_status">"Minnekortet blir brukt som en masselagringsenhet"</string>
+ <string name="sdcard_settings_unmounted_status">"Det er trygt å fjerne minnekortet"</string>
+ <string name="sdcard_settings_bad_removal_status">"Minnekortet ble fjernet mens det fortsatt var i bruk!"</string>
+ <string name="sdcard_settings_used_bytes_label">"Brukt antall byte:"</string>
+ <string name="sdcard_settings_scanning_status">"Leter etter media på minnekortet…"</string>
+ <string name="sdcard_settings_read_only_status">"Minnekortet ble montert skrivebeskyttet"</string>
+ <string name="next_label">"Neste"</string>
+ <string name="language_picker_title">"Regionsinnstillinger"</string>
+ <string name="select_your_language">"Språk"</string>
+ <string name="activity_picker_label">"Velg aktivitet"</string>
+ <string name="device_info_label">"Enhetsinformasjon"</string>
+ <string name="battery_info_label">"Batteriinformasjon"</string>
+ <string name="battery_history_label">"Batterihistorikk"</string>
+ <string name="display_label">"Skjerm"</string>
+ <string name="phone_info_label">"Telefoninformasjon"</string>
+ <string name="sd_card_settings_label">"Minnekort"</string>
+ <string name="proxy_settings_label">"Mellomtjener-innstillinger"</string>
+ <string name="cancel">"Avbryt"</string>
+ <string name="settings_label">"Innstillinger"</string>
+ <string name="airplane_mode">"Flymodus"</string>
+ <string name="airplane_mode_summary">"Slå av alle trådløse tilkoblinger"</string>
+ <string name="airplane_mode_turning_on">"Slår av trådløse tilkoblinger…"</string>
+ <string name="airplane_mode_turning_off">"Slår på trådløse tilkoblinger…"</string>
+ <string name="radio_controls_title">"Trådløse nett"</string>
+ <string name="radio_controls_summary">"Trådløse nett, Bluetooth, flymodus mobile nettverk"</string>
+ <string name="date_and_time_settings_title">"Dato og tid"</string>
+ <string name="date_and_time_settings_summary">"Sett dato, tid, tidssone og formater"</string>
+ <string name="date_time_auto">"Automatisk"</string>
+ <string name="date_time_auto_summaryOn">"Bruk verdier fra nettverket"</string>
+ <string name="date_time_auto_summaryOff">"Bruk verdier fra nettverket"</string>
+ <string name="date_time_24hour">"Bruk 24-timers format"</string>
+ <string name="date_time_set_time">"Still klokken"</string>
+ <string name="date_time_set_timezone">"Tidssone"</string>
+ <string name="date_time_set_date">"Sett dato"</string>
+ <string name="date_time_date_format">"Datoformat"</string>
+ <string name="zone_list_menu_sort_alphabetically">"Sorter alfabetisk"</string>
+ <string name="zone_list_menu_sort_by_timezone">"Sorter etter tidssone"</string>
+ <string name="security_settings_title">"Sikkerhet og plassering"</string>
+ <string name="security_settings_summary">"Plassering, skjermlås, SIM-kort-lås"</string>
+ <string name="security_passwords_title">"Passord"</string>
+ <string name="bluetooth_quick_toggle_title">"Bluetooth"</string>
+ <string name="bluetooth_quick_toggle_summary">"Slå på Bluetooth"</string>
+ <string name="bluetooth_settings">"Bluetooth-innstillinger"</string>
+ <string name="bluetooth_settings_title">"Bluetooth-innstillinger"</string>
+ <string name="bluetooth_settings_summary">"Tilkoblinger, enhetsnavn og synlighet"</string>
+ <string name="bluetooth_pin_entry">"Forespørsel om Bluetooth-paring"</string>
+ <string name="bluetooth_device_info">"Bluetooth-enhetsinformasjon"</string>
+ <string name="bluetooth_enter_pin_msg">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"\n\n"Skriv inn PIN-kode for å pare."\n"(Prøv 0000 eller 1234.)"</string>
+ <string name="bluetooth_error_title">"NB"</string>
+ <string name="bluetooth_pairing_error_message">"Det oppsto et problem under paring med <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+ <string name="bluetooth_pairing_pin_error_message">"Det oppsto et problem under paring med <xliff:g id="DEVICE_NAME">%1$s</xliff:g> fordi PIN-koden du oppga var feil."</string>
+ <string name="bluetooth_connecting_error_message">"Kunne ikke koble til <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+ <string name="bluetooth_preference_scan_title">"Let etter enheter"</string>
+ <string name="bluetooth_device_context_connect">"Koble til"</string>
+ <string name="bluetooth_device_context_disconnect">"Koble fra"</string>
+ <string name="bluetooth_device_context_pair_connect">"Par med og koble til"</string>
+ <string name="bluetooth_device_context_unpair">"Fjern paring"</string>
+ <string name="bluetooth_device_context_disconnect_unpair">"Koble fra og fjern paring"</string>
+ <string name="bluetooth_device_context_connect_advanced">"Innstillinger…"</string>
+ <string name="bluetooth_connect_specific_profiles_title">"Koble til…"</string>
+ <string name="bluetooth_profile_a2dp">"Media"</string>
+ <string name="bluetooth_profile_headset">"Telefon"</string>
+ <string name="bluetooth_summary_connected_to_a2dp">"Koblet til medielyd"</string>
+ <string name="bluetooth_summary_connected_to_headset">"Koblet til telefonlyd"</string>
+ <string name="bluetooth_summary_connected_to_a2dp_headset">"Koblet til medie- og telefonlyd"</string>
+ <string name="bluetooth_device_advanced_title">"Innstillinger for <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_device_advanced_online_mode_title">"Koble til"</string>
+ <string name="bluetooth_device_advanced_online_mode_summary">"Koble til Bluetooth-enhet"</string>
+ <string name="bluetooth_device_advanced_profile_header_title">"Profiler"</string>
+ <string name="bluetooth_a2dp_profile_summary_connected">"Koblet til medielyd"</string>
+ <string name="bluetooth_headset_profile_summary_connected">"Koblet til telefonlyd"</string>
+ <string name="bluetooth_a2dp_profile_summary_use_for">"Bruk for medielyd"</string>
+ <string name="bluetooth_headset_profile_summary_use_for">"Bruk for telefonlyd"</string>
+ <string name="wifi">"Trådløst nett"</string>
+ <string name="wifi_quick_toggle_title">"Trådløst nett"</string>
+ <string name="wifi_quick_toggle_summary">"Slå på trådløst nett"</string>
+ <string name="wifi_settings">"Trådløsinnstillinger"</string>
+ <string name="wifi_settings_category">"Innstillinger for trådløst nett"</string>
+ <string name="wifi_settings_summary">"Sett opp og styr trådløse aksesspunkt"</string>
+ <string name="forget_network">"Glem"</string>
+ <string name="wifi_status">"Status"</string>
+ <string name="wifi_link_speed">"Hastighet"</string>
+ <string name="wifi_signal_3">"Utmerket"</string>
+ <string name="wifi_signal_2">"God"</string>
+ <string name="wifi_signal_1">"OK"</string>
+ <string name="wifi_signal_0">"Dårlig"</string>
+ <string name="security">"Sikkerhet"</string>
+ <string name="wifi_security_open">"Åpen"</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">"Ukjent"</string>
+ <string name="wifi_security_verbose_open">"Åpent nettverk"</string>
+ <string name="wifi_security_verbose_wep">"Sikret med WEP"</string>
+ <string name="wifi_security_verbose_wpa">"Sikret med WPA"</string>
+ <string name="wifi_security_verbose_wpa2">"Sikret med WPA2"</string>
+ <string name="ip_address">"IP-adresse"</string>
+ <string name="signal">"Signalstyrke"</string>
+ <string name="wifi_starting">"Slår på…"</string>
+ <string name="wifi_stopping">"Slår av…"</string>
+ <string name="wifi_error">"Feil"</string>
+ <string name="error_starting">"Kunne ikke starte trådløsnett"</string>
+ <string name="error_stopping">"Kunne ikke slå av trådløsnett"</string>
+ <string name="error_scanning">"Kunne ikke søke etter trådløse nettverk"</string>
+ <string name="error_connecting">"Kunne ikke koble til nettverket"</string>
+ <string name="error_saving">"Kunne ikke lagre nettverket"</string>
+ <string name="connect">"Koble til"</string>
+ <string name="connect_to_blank">"Koble til <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+ <string name="please_type_passphrase">"Passord for trådløst nettverk"</string>
+ <string name="please_type_hex_key">"WEP-nøkkel i hex (0-9, A-F)"</string>
+ <string name="wifi_show_password">"Vis passord."</string>
+ <string name="scan_wifi">"Søk"</string>
+ <string name="summary_not_in_range">"Utenfor rekkevidde"</string>
+ <string name="summary_remembered">"Husket"</string>
+ <string name="summary_connection_failed">"Tilkoblingen mislyktes, velg for å prøve på nytt"</string>
+ <string name="wifi_access_points">"Trådløse nettverk"</string>
+ <string name="wifi_type_ssid">"Nettverks-SSID"</string>
+ <string name="wifi_security">"Sikkerhet"</string>
+ <string name="wifi_save_config">"Lagre"</string>
+ <string name="wifi_password_unchanged">"(uendret)"</string>
+ <string name="wifi_add_other_network">"Legg til trådløst nettverk"</string>
+ <string name="wifi_notify_open_networks">"Varsling om nettverk"</string>
+ <string name="wifi_notify_open_networks_summary">"Varsle når et åpent nettverk er tilgjengelig"</string>
+ <string name="wifi_password_incorrect_error">"Nettverkspassordet er ikke riktig. Prøv igjen."</string>
+ <string name="wifi_generic_connection_error">"Kunne ikke koble til nettverket. Prøv igjen."</string>
+ <string name="wifi_menu_advanced">"Avansert"</string>
+ <string name="wifi_ip_settings_titlebar">"IP-innstillinger"</string>
+ <string name="wifi_ip_settings_menu_save">"Lagre"</string>
+ <string name="wifi_ip_settings_menu_cancel">"Avbryt"</string>
+ <string name="wifi_ip_settings_invalid_ip">"Skriv inn en gyldig IP-adresse."</string>
+ <string name="wifi_use_static_ip">"Bruk statisk IP-adresse"</string>
+ <string name="wifi_ip_address">"IP-adresse"</string>
+ <string name="wifi_dns1">"DNS 1"</string>
+ <string name="wifi_dns2">"DNS 2"</string>
+ <string name="wifi_gateway">"Standardruter"</string>
+ <string name="wifi_netmask">"Nettmaske"</string>
+ <string name="wifi_context_menu_connect">"Koble til nettverk"</string>
+ <string name="wifi_context_menu_forget">"Glem nettverk"</string>
+ <string name="wifi_context_menu_change_password">"Endre passord"</string>
+ <string name="wifi_advanced_titlebar">"Avansert"</string>
+ <string name="wifi_setting_num_channels_title">"Juridisk område"</string>
+ <string name="wifi_setting_num_channels_summary">"Velg antall kanaler som skal brukes"</string>
+ <string name="wifi_setting_num_channels_error">"Kunne ikke velge juridisk område."</string>
+ <string name="wifi_setting_num_channels_channel_phrase">"<xliff:g id="NUM_CHANNELS">%1$d</xliff:g> kanaler"</string>
+ <string name="wifi_setting_sleep_policy_title">"Soveinnstillinger for trådløst nett"</string>
+ <string name="wifi_setting_sleep_policy_summary">"Spesifiser når telefonen skal bytte fra trådløsnett til mobiltelefonidata"</string>
+ <string name="wifi_setting_sleep_policy_error">"Det oppsto et problem under setting av soveinnstilling."</string>
+ <string name="wifi_advanced_mac_address_title">"MAC-adresse"</string>
+ <string name="fragment_status_scanning">"Søker…"</string>
+ <string name="fragment_status_connecting">"Kobler til <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</string>
+ <string name="fragment_status_authenticating">"Autentiserer mot <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</string>
+ <string name="fragment_status_obtaining_ip">"Henter IP-adresse fra <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</string>
+ <string name="fragment_status_connected">"Koblet til <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+ <string name="fragment_status_disconnecting">"Kobler fra <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</string>
+ <string name="fragment_status_disconnected">"Frakoblet"</string>
+ <string name="fragment_status_failed">"Mislykket"</string>
+ <string name="status_scanning">"Søker…"</string>
+ <string name="status_connecting">"Kobler til…"</string>
+ <string name="status_authenticating">"Autentiserer…"</string>
+ <string name="status_obtaining_ip">"Henter adresse…"</string>
+ <string name="status_connected">"Tilkoblet"</string>
+ <string name="status_disconnecting">"Kobler fra…"</string>
+ <string name="status_disconnected">"Frakoblet"</string>
+ <string name="status_failed">"Mislykket"</string>
+ <string name="sound_and_display_settings">"Lyd og skjerm"</string>
+ <string name="sound_settings">"Lydinnstillinger"</string>
+ <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="ringtone_title">"Ringetone"</string>
+ <string name="ringtone_summary">"Standard ringetone for innkommende anrop"</string>
+ <string name="ring_volume_title">"Ringevolum"</string>
+ <string name="ring_volume_summary">"Volum for innkommende anrop og varslinger"</string>
+ <string name="vibrate_title">"Vibrering"</string>
+ <string name="vibrate_summary">"Vibrer ved innkommende anrop"</string>
+ <string name="notification_sound_title">"Ringetone for varsling"</string>
+ <string name="notification_sound_summary">"Standard ringetone for varsling"</string>
+ <string name="incoming_call_volume_title">"Volum for innkommende anrop"</string>
+ <string name="notification_volume_title">"Varslingsvolum"</string>
+ <string name="checkbox_notification_same_as_incoming_call">"Bruk volum for innkommende anrop også for varslinger"</string>
+ <string name="notification_sound_dialog_title">"Velg ringetone for varsling"</string>
+ <string name="media_volume_title">"Medievolum"</string>
+ <string name="media_volume_summary">"Volum for musikk og video"</string>
+ <string name="dtmf_tone_enable_title">"Hørbare tastetoner"</string>
+ <string name="dtmf_tone_enable_summary_on">"Spill toner når talltastaturet benyttes"</string>
+ <string name="dtmf_tone_enable_summary_off">"Spill toner når talltastaturet benytes"</string>
+ <string name="sound_effects_enable_title">"Hørbart valg"</string>
+ <string name="sound_effects_enable_summary_on">"Lag lyd under skjermvalg"</string>
+ <string name="sound_effects_enable_summary_off">"Lag lyd under skjermvalg"</string>
+ <string name="play_media_notification_sounds_enable_title">"Varsling for minnekort"</string>
+ <string name="play_media_notification_sounds_enable_summary_on">"Deaktiver varslingslyder for minnekort"</string>
+ <string name="play_media_notification_sounds_enable_summary_off">"Aktiver varslingslyder for minnekort"</string>
+ <string name="sync_settings">"Datasynkronisering"</string>
+ <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 når vinduer åpnes/lukkes"</string>
+ <string name="animations_summary_off">"Vis animasjon når vinduer åpnes/lukkes"</string>
+ <string name="brightness">"Lysstyrke"</string>
+ <string name="brightness_summary">"Juster skjermens lysstyrke"</string>
+ <string name="screen_timeout">"Skjermsparer"</string>
+ <string name="screen_timeout_summary">"Juster hvor lang tid som skal gå før skjermen slås av automatisk"</string>
+ <string name="sim_lock_settings">"Innstillinger for SIM-kort-lås"</string>
+ <string name="sim_lock_settings_category">"Sett opp SIM-kort-lås"</string>
+ <string name="sim_lock_settings_title">"SIM-kort-lås"</string>
+ <string name="sim_pin_toggle">"Lås SIM-kortet"</string>
+ <string name="sim_lock_on">"Krev PIN-kode for å bruke telefonen"</string>
+ <string name="sim_lock_off">"Krev PIN-kode for å bruke telefonen"</string>
+ <string name="sim_pin_change">"Endre SIM-PIN-kode"</string>
+ <string name="sim_enter_pin">"PIN-kode for SIM-kort"</string>
+ <string name="sim_enable_sim_lock">"Lås SIM-kortet"</string>
+ <string name="sim_disable_sim_lock">"Lås opp SIM-kortet"</string>
+ <string name="sim_enter_old">"Gammel PIN-kode for SIM-kort"</string>
+ <string name="sim_enter_new">"Ny PIN-kode for SIM-kort"</string>
+ <string name="sim_reenter_new">"Skriv inn ny PIN-kode en gang til"</string>
+ <string name="sim_change_pin">"SIM-kode for PIN-kort"</string>
+ <string name="sim_bad_pin">"Feil PIN-kode!"</string>
+ <string name="sim_pins_dont_match">"De to PIN-kodene stemmer ikke overens!"</string>
+ <string name="sim_change_failed">"Kunne ikke endre PIN-kode."\n"Det er mulig PIN-koden var gal."</string>
+ <string name="sim_change_succeeded">"PIN-koden for SIM-kortet ble endret."</string>
+ <string name="sim_lock_failed">"Kunne ikke endre låsestatus for SIM-kortet."\n"Det er mulig PIN-koden var gal."</string>
+ <string name="sim_enter_ok">"OK"</string>
+ <string name="sim_enter_cancel">"Avbryt"</string>
+ <string name="device_info_settings">"Telefonstatus"</string>
+ <string name="system_update_settings_list_item_title">"Systemoppdateringer"</string>
+ <string name="system_update_settings_list_item_summary">"Se etter systemoppdateringer"</string>
+ <string name="firmware_version">"Firmware-versjon"</string>
+ <string name="model_number">"Modellnummer"</string>
+ <string name="baseband_version">"Versjon av radioprogramvare"</string>
+ <string name="kernel_version">"Kjerneversjon"</string>
+ <string name="build_number">"Byggenummer"</string>
+ <string name="device_info_not_available">"Ikke tilgjengelig"</string>
+ <string name="device_status_activity_title">"Status"</string>
+ <string name="device_status">"Status"</string>
+ <string name="device_status_summary">"IMEI, telefonnummer, signal, osv."</string>
+ <string name="storage_settings_title">"Minnekort og lagring"</string>
+ <string name="storage_settings_summary">"Avmonter minnekort, vis ledig plass"</string>
+ <string name="status_number">"Telefonnummer"</string>
+ <string name="status_network_type">"Nettverkstype"</string>
+ <string name="status_data_state">"Datatilgang"</string>
+ <string name="status_service_state">"Servicestatus"</string>
+ <string name="status_signal_strength">"Signalstyrke"</string>
+ <string name="status_roaming">"Roaming"</string>
+ <string name="status_operator">"Nettverk"</string>
+ <string name="status_wifi_mac_address">"MAC-adresse for WLAN"</string>
+ <string name="status_bt_address">"Bluetooth-adresse"</string>
+ <string name="status_unavailable">"Ikke tilgjengelig"</string>
+ <string name="status_network_traffic_stats">"Nettverksbruk"</string>
+ <string name="status_network_traffic_summary">"Sendt: <xliff:g id="NETWORK_TRAFFIC_0">%1$d packets, %2$d bytes%n</xliff:g>Mottatt: <xliff:g id="NETWORK_TRAFFIC_1">%3$d packets, %4$d bytes</xliff:g>"</string>
+ <string name="status_up_time">"Oppetid"</string>
+ <string name="status_awake_time">"Våken tid"</string>
+ <string name="internal_memory">"Intern lagringsplass"</string>
+ <string name="sd_memory">"Minnekort"</string>
+ <string name="memory_available">"Tilgjengelig plass"</string>
+ <string name="memory_size">"Total plass"</string>
+ <string name="sd_eject">"Avmonter/løs ut minnekort"</string>
+ <string name="sd_eject_summary">"Løs ut minnekortet for trygg fjerning"</string>
+ <string name="sd_format">"Formater minnekort"</string>
+ <string name="sd_format_summary">"Formater (fjern alt fra) minnekortet"</string>
+ <string name="sd_unavailable">"Ikke tilgjengelig"</string>
+ <string name="read_only">" (skrivebeskyttet)"</string>
+ <string name="battery_status_title">"Batteristatus"</string>
+ <string name="battery_level_title">"Batterinivå"</string>
+ <string name="apn_settings">"APN"</string>
+ <string name="apn_edit">"Rediger APN"</string>
+ <string name="apn_not_set">"&lt;Ikke satt&gt;"</string>
+ <string name="apn_name">"Navn"</string>
+ <string name="apn_apn">"APN-navn"</string>
+ <string name="apn_http_proxy">"Mellomtjener"</string>
+ <string name="apn_http_port">"Port"</string>
+ <string name="apn_user">"Brukernavn"</string>
+ <string name="apn_password">"Passord"</string>
+ <string name="apn_server">"Tjener"</string>
+ <string name="apn_mmsc">"MMSC"</string>
+ <string name="apn_mms_proxy">"MMS-mellomtjener"</string>
+ <string name="apn_mms_port">"MMS-port"</string>
+ <string name="apn_mcc">"MCC"</string>
+ <string name="apn_mnc">"MNC"</string>
+ <string name="apn_type">"APN-type"</string>
+ <string name="menu_delete">"Slett APN"</string>
+ <string name="menu_new">"Nytt APN"</string>
+ <string name="menu_save">"Lagre"</string>
+ <string name="menu_cancel">"Forkast"</string>
+ <string name="error_title">"NB"</string>
+ <string name="error_name_empty">"Feltet «navn» kan ikke være tomt."</string>
+ <string name="error_apn_empty">"APNet kan ikke være tomt."</string>
+ <string name="error_mcc_not3">"MCC-feltet må være på tre siffer."</string>
+ <string name="error_mnc_not23">"MNC-feltet må være på to eller tre siffer."</string>
+ <string name="master_clear_title">"Fabrikkinnstillinger"</string>
+ <string name="master_clear_summary">"Fjern alle data fra telefonen"</string>
+ <string name="master_clear_desc">"Dette vil nullstille telefonen til fabrikktilstanden, noe som fjerner alle data og nedlastede applikasjoner!"</string>
+ <string name="master_clear_button_text">"Nullstill telefonen"</string>
+ <string name="master_clear_final_desc">"Nullstill telefonen, noe som vil fjerne alle data og applikasjoner? Dette kan ikke gjøres om!"</string>
+ <string name="master_clear_final_button_text">"Fjern alt"</string>
+ <string name="master_clear_gesture_prompt">"Tegn opplåsingsmønsteret"</string>
+ <string name="master_clear_gesture_explanation">"Du må tegne opplåsingsmønsteret for å bekrefte nullstilling av telefonen."</string>
+ <string name="master_clear_failed">"Telefonen ble ikke nullstilt fordi nullstillingstjenesten ikke er tilgjengelig."</string>
+ <string name="media_format_title">"Formater minnekort"</string>
+ <string name="media_format_summary">"Sletter alle data fra minnekortet"</string>
+ <string name="media_format_desc">"Dette valget vil slette alle data fra minnekortet i telefonen. Du vil miste ALLE data på kortet!"</string>
+ <string name="media_format_button_text">"Formater minnekort"</string>
+ <string name="media_format_final_desc">"Formater minnekortet? Dette vil fjerne alle data, og kan ikke gjøres om!"</string>
+ <string name="media_format_final_button_text">"Slett alt"</string>
+ <string name="media_format_gesture_prompt">"Tegn opplåsingsmønsteret"</string>
+ <string name="media_format_gesture_explanation">"Du må tegne opplåsingsmønsteret for å bekrefte formatering av minnekortet."</string>
+ <string name="call_settings_title">"Samtaleinnstillinger"</string>
+ <string name="call_settings_summary">"Telefonsvarer, viderekobling, samtale venter, nummervisning"</string>
+ <string name="network_settings_title">"Mobile nettverk"</string>
+ <string name="network_settings_summary">"Innstillinger for roaming, nettverk, APN"</string>
+ <string name="location_title">"Kilder for min plassering"</string>
+ <string name="location_network_based">"Bruk trådløse nettverk"</string>
+ <string name="location_networks_disabled">"Se plassering i applikasjoner (som kart) ved hjelp av trådløse nettverk"</string>
+ <string name="location_neighborhood_level">"Plassering bestemmes ved hjelp av trådløse og/eller mobile nettverk"</string>
+ <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>
+ <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>
+ <string name="contributors_title">"Medvirkende"</string>
+ <string name="copyright_title">"Opphavsrett"</string>
+ <string name="license_title">"Lisens"</string>
+ <string name="terms_title">"Betingelser"</string>
+ <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>
+ <string name="lock_settings_title">"Opplåsingsmønster for skjerm"</string>
+ <string name="lockpattern_change_lock_pattern_label">"Opplåsingsmønster"</string>
+ <string name="lockpattern_need_to_unlock">"Bekreft lagret mønster"</string>
+ <string name="lockpattern_need_to_unlock_wrong">"Beklager, prøv igjen:"</string>
+ <string name="lockpattern_recording_intro_header">"Tegn et opplåsingsmønster"</string>
+ <string name="lockpattern_recording_intro_footer">"Trykk menyknappen for hjelp."</string>
+ <string name="lockpattern_recording_inprogress">"Slipp fingeren når du er ferdig."</string>
+ <string name="lockpattern_recording_incorrect_too_short">"Tegn et mønster over minst <xliff:g id="NUMBER">%d</xliff:g> prikker. Prøv igjen:"</string>
+ <string name="lockpattern_pattern_entered_header">"Mønster lagret!"</string>
+ <string name="lockpattern_need_to_confirm">"Tegn mønsteret igjen for å bekrefte:"</string>
+ <string name="lockpattern_pattern_confirmed_header">"Ditt nye opplåsingsmønster:"</string>
+ <string name="lockpattern_confirm_button_text">"Bekreft"</string>
+ <string name="lockpattern_restart_button_text">"Tegn på nytt"</string>
+ <string name="lockpattern_retry_button_text">"Prøv igjen"</string>
+ <string name="lockpattern_continue_button_text">"Continue"</string>
+ <string name="lockpattern_settings_title">"Opplåsingsmønster"</string>
+ <string name="lockpattern_settings_enable_title">"Krev mønster"</string>
+ <string name="lockpattern_settings_enable_summary">"Krev mønster for å låse opp skjermen"</string>
+ <string name="lockpattern_settings_enable_visible_pattern_title">"Synlig mønster"</string>
+ <string name="lockpattern_settings_enable_tactile_feedback_title">"Taktil tilbakemelding"</string>
+ <string name="lockpattern_settings_choose_lock_pattern">"Opplåsingsmønster"</string>
+ <string name="lockpattern_settings_change_lock_pattern">"Opplåsingsmønster"</string>
+ <string name="lockpattern_settings_help_how_to_record">"Hvordan tegne et opplåsingsmønster"</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_header">"For mange gale forsøk!"</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_footer">"Prøv igjen om <xliff:g id="NUMBER">%d</xliff:g> sekunder."</string>
+ <string name="skip_button_label">"Avbryt"</string>
+ <string name="next_button_label">"Neste"</string>
+ <string name="lock_title">"Sikring av telefonen"</string>
+ <string name="lock_intro_message"><font size="17">"Beskytt telefonen fra uautorisert bruk ved å lage et personlig opplåsingsmønster for skjermen. "\n<font height="17">\n</font><b>"1"</b>"  På den neste skjermen, se på mens et eksempelmønster blir tegnet. "\n<font height="17">\n</font><b>"2"</b>"  Når du er klar, tegn ditt eget personlige opplåsingsmønster. Prøv med forskjellige mønster, men tegn over minst fire prikker. "\n<font height="17">\n</font><b>"3"</b>"  Tegn mønsteret på nytt for å bekrefte. "\n<font height="17">\n</font><b>"Klar? Velg «neste»."</b>" "\n<font height="3">\n</font>"For å la telefonen forbli ubeskyttet, velg «Avbryt»."</font></string>
+ <string name="lock_example_title">"Eksempelmønster"</string>
+ <string name="lock_example_message">"Tegn over minst fire prikker."\n" "\n"Velg «Neste» når du er klar til å tegne ditt eget mønster."</string>
+ <string name="manageapplications_settings_title">"Installerte applikasjoner"</string>
+ <string name="manageapplications_settings_summary">"Hold orden på og fjern installerte applikasjoner"</string>
+ <string name="applications_settings">"Applikasjoner"</string>
+ <string name="applications_settings_summary">"Installerte applikasjoner, hurtigtaster"</string>
+ <string name="applications_settings_header">"Innstillinger for applikasjoner"</string>
+ <string name="install_applications">"Ukjente kilder"</string>
+ <string name="install_unknown_applications">"Tillat installasjon av applikasjoner som ikke kommer fra markedet"</string>
+ <string name="install_all_warning">"Telefonen og dine personlige data er mer sårbare mot angrep fra applikasjoner som kommer fra ukjente kilder. Du godtar at du selv er ansvarlig for enhver skade på telefonen eller tap av data som måtte oppstå fra bruk av slike applikasjoner."</string>
+ <string name="application_info_label">"Applikasjonsinformasjon"</string>
+ <string name="storage_label">"Lagring"</string>
+ <string name="auto_launch_label">"Start som standard"</string>
+ <string name="permissions_label">"Rettigheter"</string>
+ <string name="cache_header_label">"Hurtiglager"</string>
+ <string name="clear_cache_btn_text">"Fjern hurtiglager"</string>
+ <string name="cache_size_label">"Hurtiglager"</string>
+ <string name="controls_label">"Kontroller"</string>
+ <string name="force_stop">"Tving avslutning"</string>
+ <string name="total_size_label">"Totalt"</string>
+ <string name="application_size_label">"Applikasjon"</string>
+ <string name="data_size_label">"Data"</string>
+ <string name="uninstall_text">"Avinstaller"</string>
+ <string name="clear_user_data_text">"Fjern data"</string>
+ <string name="auto_launch_enable_text">"Du har valgt å starte denne applikasjonen som standard for noen handlinger."</string>
+ <string name="auto_launch_disable_text">"Ingen standardvalg satt."</string>
+ <string name="clear_activities">"Fjern standardvalg"</string>
+ <string name="unknown">"Ukjent"</string>
+ <string name="sort_order_alpha">"Sorter"</string>
+ <string name="sort_order_size">"Sorter etter størrelse"</string>
+ <string name="manage_space_text">"Styr plass"</string>
+ <string name="filter">"Filter"</string>
+ <string name="filter_dlg_title">"Velg filtreringsinnstillinger"</string>
+ <string name="filter_apps_all">"Alle"</string>
+ <string name="filter_apps_third_party">"Tredjeparts"</string>
+ <string name="filter_apps_running">"Kjører"</string>
+ <string name="loading">"Laster…"</string>
+ <string name="recompute_size">"Beregner størrelse på nytt…"</string>
+ <string name="clear_data_dlg_title">"Slett"</string>
+ <string name="clear_data_dlg_text">"All informasjon du har lagret i denne applikasjonen vil bli fjernet permanent."</string>
+ <string name="dlg_ok">"OK"</string>
+ <string name="dlg_cancel">"Avbryt"</string>
+ <string name="app_not_found_dlg_title">"Fant ikke applikasjonen"</string>
+ <string name="app_not_found_dlg_text">"Applikasjonen ble ikke funnet i listen av installerte applikasjoner."</string>
+ <string name="clear_data_failed">"Kunne ikke fjerne applikasjonadata."</string>
+ <string name="security_settings_desc">"Applikasjonen har disse rettighetene på telefonen:"</string>
+ <string name="computing_size">"Beregner fortsatt…"</string>
+ <string name="invalid_size_value">"Kunne ikke beregne pakkestørrelse"</string>
+ <string name="empty_list_msg">"Ingen tredjepartsapplikasjoner er installert."</string>
+ <string name="language_settings">"Språk og tekst"</string>
+ <string name="language_settings_summary">"Innstillinger for språk, region, skriving av tekst og feilretting"</string>
+ <string name="language_category">"Innstillinger for språk"</string>
+ <string name="text_category">"Tekstinnstillinger"</string>
+ <string name="phone_language">"Språk"</string>
+ <string name="phone_language_summary">"Velg språk og region"</string>
+ <string name="auto_replace">"Automatisk erstatting"</string>
+ <string name="auto_replace_summary">"Rett opp stavefeil"</string>
+ <string name="auto_caps">"Stor forbokstav"</string>
+ <string name="auto_caps_summary">"Start automatisk setninger med stor bokstav"</string>
+ <string name="auto_punctuate">"Autopunktum"</string>
+ <string name="hardkeyboard_category">"Innstillinger for fysisk tastatur"</string>
+ <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="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>
+ <string name="user_dict_settings_add_menu_title">"Legg til"</string>
+ <string name="user_dict_settings_add_dialog_title">"Legg til ordliste"</string>
+ <string name="user_dict_settings_context_menu_edit_title">"Rediger"</string>
+ <string name="user_dict_settings_context_menu_delete_title">"Slett"</string>
+ <string name="user_dict_settings_empty_text">"Ordlisten er tom. Du kan legge til ord i menyen."</string>
+ <string name="testing">"Testing"</string>
+ <string name="testing_phone_info">"Telefoninformasjon"</string>
+ <string name="testing_battery_info">"Batteriinformasjon"</string>
+ <string name="testing_battery_history">"Batterihistorikk"</string>
+ <string name="quick_launch_title">"Hurtigtaster"</string>
+ <string name="quick_launch_summary">"Tastatursnarveier for å starte applikasjoner"</string>
+ <string name="quick_launch_assign_application">"Tilordne applikasjon"</string>
+ <string name="quick_launch_no_shortcut">"Ingen snarvei"</string>
+ <string name="quick_launch_shortcut">"Søk + <xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g>"</string>
+ <string name="quick_launch_clear_dialog_title">"Fjern"</string>
+ <string name="quick_launch_clear_dialog_message">"Snarveien for <xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g> (<xliff:g id="APPLICATION_NAME">%2$s</xliff:g>) will be fjernet."</string>
+ <string name="quick_launch_clear_ok_button">"OK"</string>
+ <string name="quick_launch_clear_cancel_button">"Avbryt"</string>
+ <string name="quick_launch_display_mode_applications">"Applikasjoner"</string>
+ <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 %s"</string>
+ <string name="development_settings_title">"Utvikling"</string>
+ <string name="development_settings_summary">"Innstillinger for applikasjonsutvikling"</string>
+ <string name="enable_adb">"USB-debugging"</string>
+ <string name="enable_adb_summary">"Debug-modus når USB er koblet til"</string>
+ <string name="keep_screen_on">"Forbli våken"</string>
+ <string name="keep_screen_on_summary">"Skjermen vil aldri blankes under lading"</string>
+ <string name="allow_mock_location">"Tillat manuell plassering"</string>
+ <string name="allow_mock_location_summary">"Tillat manuell plassering"</string>
+ <string name="gadget_picker_title">"Velg gadget"</string>
+ <!-- no translation found for widget_picker_title (9130684134213467557) -->
+ <skip />
+ <string name="battery_history_details_for">"Detaljer for UID %d"</string>
+ <string name="battery_history_uid">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
+ <string name="battery_history_network_usage">"Nettbruk av <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
+ <string name="battery_history_bytes_received">"Byte mottatt: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_sent">"Byte sendt: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_total">"Totalt antall byte: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_cpu_usage">"CPU-bruk av <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
+ <string name="battery_history_user_time">"Brukertid:"</string>
+ <string name="battery_history_system_time">"Systemtid:"</string>
+ <string name="battery_history_total_time">"Total tid:"</string>
+ <string name="battery_history_starts">"Oppstarter: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
+ <string name="battery_history_days">"<xliff:g id="DAYS">%1$d</xliff:g> dager, <xliff:g id="HOURS">%2$d</xliff:g> timer, <xliff:g id="MINUTES">%3$d</xliff:g> minutter, <xliff:g id="SECONDS">%4$d</xliff:g> sekunder"</string>
+ <string name="battery_history_hours">"<xliff:g id="HOURS">%1$d</xliff:g> timer, <xliff:g id="MINUTES">%2$d</xliff:g> minutter, <xliff:g id="SECONDS">%3$d</xliff:g> sekunder"</string>
+ <string name="battery_history_minutes">"<xliff:g id="MINUTES">%1$d</xliff:g> minutter, <xliff:g id="SECONDS">%2$d</xliff:g> sekunder"</string>
+ <string name="battery_history_seconds">"<xliff:g id="SECONDS">%1$d</xliff:g> sekunder"</string>
+ <string name="battery_history_packages_sharing_this_uid">"Pakker som deler denne UID-en:"</string>
+ <string name="battery_history_no_data">"Ingen batterihistorikk tilgjengelig"</string>
+ <string name="battery_history_sensor">"Sensor:"</string>
+ <!-- no translation found for battery_history_wakelock (608683447522396293) -->
+ <skip />
+ <string name="battery_history_used_by_packages">"Sensor brukt av pakker:"</string>
+ <string name="battery_history_sensor_usage">"Brukt <xliff:g id="COUNT">%1$d</xliff:g> ganger av <xliff:g id="PACKAGE">%2$s</xliff:g>"</string>
+ <string name="battery_history_sensor_usage_multi">"Brukt <xliff:g id="COUNT">%1$d</xliff:g> ganger av en av:"</string>
+ <!-- no translation found for battery_history_awake_label (8449792868990080882) -->
+ <skip />
+ <!-- no translation found for battery_history_screen_on_label (1848936521786339362) -->
+ <skip />
+ <!-- no translation found for battery_history_phone_on_label (700191958853142297) -->
+ <skip />
+ <!-- no translation found for battery_history_awake (4350886665719031057) -->
+ <skip />
+ <string name="battery_history_screen_on">"Tid brukt med skjermen på:"</string>
+ <!-- no translation found for battery_history_phone_on (4891504401623839532) -->
+ <skip />
+ <string name="battery_history_screen_on_battery">"På batteri:"</string>
+ <string name="battery_history_screen_on_plugged">"På nettstrøm:"</string>
+ <string name="usage_stats_label">"Bruksstatistikk"</string>
+ <string name="testing_usage_stats">"Bruksstatistikk"</string>
+ <string name="display_order_text">"Sorter etter:"</string>
+ <string name="app_name_label">"Applikasjon"</string>
+ <string name="launch_count_label">"Antall"</string>
+ <string name="usage_time_label">"Brukstid"</string>
+</resources>
diff --git a/res/values-nl-nokeys/strings.xml b/res/values-nl-nokeys/strings.xml
new file mode 100644
index 0000000..eca67ca
--- /dev/null
+++ b/res/values-nl-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">"Toepassingen beheren"</string>
+</resources>
diff --git a/res/values-nl/arrays.xml b/res/values-nl/arrays.xml
new file mode 100644
index 0000000..51a48b0
--- /dev/null
+++ b/res/values-nl/arrays.xml
@@ -0,0 +1,72 @@
+<?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>"Amerika"</item>
+ <item>"Europa"</item>
+ <item>"Afrika"</item>
+ <item>"Azië"</item>
+ <item>"Australië"</item>
+ <item>"Stille Oceaan"</item>
+ <item>"Alles"</item>
+ </string-array>
+ <string-array name="screen_timeout_entries">
+ <item>"15 seconden"</item>
+ <item>"30 seconden"</item>
+ <item>"1 minuut"</item>
+ <item>"2 minuten"</item>
+ <item>"10 minuten"</item>
+ <item>"Nooit time-out"</item>
+ </string-array>
+ <string-array name="wifi_security_entries">
+ <item>"Automatisch"</item>
+ <item>"Geen"</item>
+ <item>"WEP"</item>
+ <item>"WPA Personal"</item>
+ <item>"WPA2 Personal"</item>
+ </string-array>
+ <string-array name="wifi_security_without_auto_entries">
+ <item>"Geen"</item>
+ <item>"WEP"</item>
+ <item>"WPA Personal"</item>
+ <item>"WPA2 Personal"</item>
+ </string-array>
+ <string-array name="wifi_wep_type">
+ <item>"Automatisch"</item>
+ <item>"WEP ASCII"</item>
+ <item>"WEP hexadecimaal"</item>
+ </string-array>
+ <string-array name="wifi_sleep_policy_entries">
+ <item>"Wanneer scherm wordt uitgeschakeld"</item>
+ <item>"Nooit indien aangesloten"</item>
+ <item>"Nooit"</item>
+ </string-array>
+ <!-- no translation found for battery_history_type_spinner:0 (2193799199027871385) -->
+ <!-- no translation found for battery_history_type_spinner:1 (6401018715947316517) -->
+ <!-- no translation found for battery_history_type_spinner:2 (188092590354892392) -->
+ <!-- no translation found for battery_history_type_spinner:3 (8414109131222049141) -->
+ <!-- no translation found for battery_history_type_spinner:4 (1327904325081257093) -->
+ <!-- no translation found for battery_history_type_spinner:5 (4832254146664706277) -->
+ <!-- no translation found for battery_history_which_spinner:0 (3451981114763440074) -->
+ <!-- no translation found for battery_history_which_spinner:1 (166936313535197598) -->
+ <!-- no translation found for battery_history_which_spinner:2 (4793941382744963893) -->
+ <string-array name="usage_stats_display_order_types">
+ <item>"Gebruikstijd"</item>
+ <item>"Aantal keer gestart"</item>
+ <item>"Naam van toepassing"</item>
+ </string-array>
+</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
new file mode 100644
index 0000000..6f30611
--- /dev/null
+++ b/res/values-nl/strings.xml
@@ -0,0 +1,672 @@
+<?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">"Onbekend"</string>
+ <string name="turn_on_radio">"Radio inschakelen"</string>
+ <string name="turn_off_radio">"Radio uitschakelen"</string>
+ <string name="turn_on_qxdm">"QXDM SD-logboek inschakelen"</string>
+ <string name="turn_off_qxdm">"QXDM SD-logboek uitschakelen"</string>
+ <string name="radioInfo_menu_viewADN">"SIM-adresboek weergeven"</string>
+ <string name="radioInfo_menu_viewFDN">"Vaste nummers weergeven"</string>
+ <string name="radioInfo_menu_viewSDN">"Servicenummers weergeven"</string>
+ <string name="radioInfo_menu_getPDP">"PDP-lijst ophalen"</string>
+ <string name="radioInfo_menu_enableData">"Gegevensverbinding inschakelen"</string>
+ <string name="radioInfo_menu_disableData">"Gegevensverbinding uitschakelen"</string>
+ <string name="radioInfo_menu_enableDataOnBoot">"Gegevens inschakelen bij opstarten"</string>
+ <string name="radioInfo_menu_disableDataOnBoot">"Gegevens uitschakelen bij opstarten"</string>
+ <string name="radioInfo_service_in">"In gebruik"</string>
+ <string name="radioInfo_service_out">"Niet in gebruik"</string>
+ <string name="radioInfo_service_emergency">"Alleen noodoproepen"</string>
+ <string name="radioInfo_service_off">"Radio uit"</string>
+ <string name="radioInfo_roaming_in">"Roaming"</string>
+ <string name="radioInfo_roaming_not">"Geen roaming"</string>
+ <string name="radioInfo_phone_idle">"Inactief"</string>
+ <string name="radioInfo_phone_ringing">"Telefoon gaat over"</string>
+ <string name="radioInfo_phone_offhook">"Actieve oproep"</string>
+ <string name="radioInfo_data_disconnected">"Verbinding verbroken"</string>
+ <string name="radioInfo_data_connecting">"Verbinding maken"</string>
+ <string name="radioInfo_data_connected">"Verbonden"</string>
+ <string name="radioInfo_data_suspended">"Opgeschort"</string>
+ <string name="radioInfo_unknown">"onbekend"</string>
+ <string name="radioInfo_display_packets">"pakketten"</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">"SD-kaart ontkoppelen"</string>
+ <string name="sdcard_format">"SD-kaart formatteren"</string>
+ <string name="small_font">"Klein"</string>
+ <string name="medium_font">"Gemiddeld"</string>
+ <string name="large_font">"Groot"</string>
+ <string name="font_size_save">"OK"</string>
+ <string name="sdcard_setting">"SD-kaart"</string>
+ <string name="battery_info_status_label">"Accustatus:"</string>
+ <string name="battery_info_scale_label">"Accuschaal:"</string>
+ <string name="battery_info_level_label">"Accuniveau:"</string>
+ <string name="battery_info_health_label">"Accustaat:"</string>
+ <string name="battery_info_technology_label">"Accutechnologie:"</string>
+ <string name="battery_info_voltage_label">"Accuvoltage:"</string>
+ <string name="battery_info_voltage_units">"mV"</string>
+ <string name="battery_info_temperature_label">"Accutemperatuur:"</string>
+ <string name="battery_info_temperature_units">"° C"</string>
+ <string name="battery_info_uptime">"Tijd sinds opstarten:"</string>
+ <string name="battery_info_awake_battery">"Stand-bytijd op accu:"</string>
+ <string name="battery_info_awake_plugged">"Stand-bytijd tijdens opladen:"</string>
+ <string name="battery_info_screen_on">"Tijd scherm AAN:"</string>
+ <string name="battery_info_status_unknown">"Onbekend"</string>
+ <string name="battery_info_status_charging">"Opladen"</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">"Ontladen"</string>
+ <string name="battery_info_status_not_charging">"Wordt niet opgeladen"</string>
+ <string name="battery_info_status_full">"Volledig"</string>
+ <string name="battery_info_health_unknown">"Onbekend"</string>
+ <string name="battery_info_health_good">"Goed"</string>
+ <string name="battery_info_health_overheat">"Oververhitting"</string>
+ <string name="battery_info_health_dead">"Versleten"</string>
+ <string name="battery_info_health_over_voltage">"Overspanning"</string>
+ <string name="battery_info_health_unspecified_failure">"Onbekende fout"</string>
+ <string name="bluetooth">"Bluetooth"</string>
+ <string name="bluetooth_visibility">"Kan worden gevonden"</string>
+ <string name="bluetooth_is_discoverable">"Kan gedurende <xliff:g id="DISCOVERABLE_TIME_PERIOD">%1$s</xliff:g> seconden worden gevonden…"</string>
+ <string name="bluetooth_not_discoverable">"Zorgen dat het apparaat kan worden gevonden"</string>
+ <string name="bluetooth_devices">"Bluetooth-apparaten"</string>
+ <string name="bluetooth_device_name">"Apparaatnaam"</string>
+ <string name="bluetooth_name_not_set">"Geen naam ingesteld, accountnaam wordt gebruikt"</string>
+ <string name="bluetooth_scan_for_devices">"Scannen naar apparaten"</string>
+ <string name="bluetooth_disconnect_blank">"Verbinding met <xliff:g id="DEVICE_NAME">%1$s</xliff:g> wordt verbroken."</string>
+ <string name="bluetooth_connected">"Verbonden"</string>
+ <string name="bluetooth_disconnected">"Verbinding verbroken"</string>
+ <string name="bluetooth_disconnecting">"Verbinding verbreken..."</string>
+ <string name="bluetooth_connecting">"Verbinding maken..."</string>
+ <!-- no translation found for bluetooth_unknown (1905151516611093010) -->
+ <skip />
+ <string name="bluetooth_not_connected">"Koppelen met dit apparaat"</string>
+ <string name="bluetooth_pairing">"Koppelen..."</string>
+ <!-- no translation found for bluetooth_paired (1247541089000057726) -->
+ <skip />
+ <string name="bluetooth_device">"handsfree/headset"</string>
+ <string name="progress_scanning">"Scannen"</string>
+ <string name="bluetooth_notif_ticker">"Bluetooth-koppelingsverzoek"</string>
+ <string name="bluetooth_notif_title">"Koppelingsverzoek"</string>
+ <string name="bluetooth_notif_message">"Selecteer dit om te koppelen met "</string>
+ <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="choose_timezone">"Tijdzone selecteren"</string>
+ <string name="display_preview_label">"Voorbeeld:"</string>
+ <string name="display_font_size_label">"Lettergrootte:"</string>
+ <!-- no translation found for intent_sender_data_label (8363026381459131554) -->
+ <skip />
+ <string name="intent_sender_sendbroadcast_text">"<xliff:g id="BROADCAST">broadcast</xliff:g> verzenden"</string>
+ <string name="intent_sender_action_label">"<xliff:g id="ACTION">Action</xliff:g>:"</string>
+ <string name="intent_sender_startactivity_text">"<xliff:g id="ACTIVITY">activity</xliff:g> starten"</string>
+ <string name="intent_sender_resource_label">"<xliff:g id="RESOURCE">Resource</xliff:g>:"</string>
+ <string name="intent_sender_account_label">"Account:"</string>
+ <string name="proxy_clear_text">"Wissen"</string>
+ <string name="proxy_port_label">"Poort"</string>
+ <string name="proxy_defaultView_text">"Standaardwaarden herstellen"</string>
+ <string name="proxy_action_text">"Opslaan"</string>
+ <string name="proxy_hostname_label">"Hostnaam"</string>
+ <string name="proxy_error">"Let op"</string>
+ <string name="proxy_error_dismiss">"OK"</string>
+ <string name="proxy_error_invalid_host">"De hostnaam die u heeft ingevoerd, is ongeldig."</string>
+ <string name="proxy_error_empty_port">"U moet het poortveld invullen."</string>
+ <string name="proxy_error_empty_host_set_port">"Het poortveld moet leeg zijn als het hostveld leeg is."</string>
+ <string name="proxy_error_invalid_port">"De poort die u heeft ingevoerd, is ongeldig."</string>
+ <string name="radio_info_signal_location_label">"Locatie:"</string>
+ <string name="radio_info_neighboring_location_label">"Naburige CID:"</string>
+ <string name="radio_info_data_attempts_label">"Gegevenspogingen:"</string>
+ <string name="radio_info_gprs_service_label">"GPRS-service:"</string>
+ <string name="radio_info_roaming_label">"Roaming:"</string>
+ <string name="radio_info_imei_label">"IMEI-nummer:"</string>
+ <string name="radio_info_call_redirect_label">"Oproep omleiden:"</string>
+ <string name="radio_info_ppp_resets_label">"Aantal PPP-resets sinds opstarten:"</string>
+ <string name="radio_info_gsm_disconnects_label">"GSM wordt ontkoppeld:"</string>
+ <string name="radio_info_current_network_label">"Huidig netwerk:"</string>
+ <string name="radio_info_data_successes_label">"Gegevenssuccessen:"</string>
+ <string name="radio_info_ppp_received_label">"PPP ontvangen:"</string>
+ <string name="radio_info_gsm_service_label">"GSM-service:"</string>
+ <string name="radio_info_signal_strength_label">"Signaalsterkte:"</string>
+ <string name="radio_info_call_status_label">"Oproepstatus:"</string>
+ <string name="radio_info_ppp_sent_label">"PPP verzonden:"</string>
+ <string name="radio_info_radio_resets_label">"Radioresets:"</string>
+ <string name="radio_info_message_waiting_label">"Wachtend bericht:"</string>
+ <string name="radio_info_phone_number_label">"Telefoonnummer:"</string>
+ <string name="radio_info_band_mode_label">"Radioband selecteren"</string>
+ <string name="radio_info_network_type_label">"Netwerktype:"</string>
+ <string name="radio_info_set_perferred_label">"Voorkeursnetwerktype instellen:"</string>
+ <string name="radio_info_ping_ipaddr">"IP-adres pingen:"</string>
+ <string name="radio_info_ping_hostname">"Hostnaam pingen (www.google.com):"</string>
+ <string name="radio_info_http_client_test">"HTTP-client testen:"</string>
+ <string name="radio_info_toggle_ciph_label">"Codering in-/uitschakelen"</string>
+ <string name="ping_test_label">"Pingtest uitvoeren"</string>
+ <string name="radio_info_smsc_label">"SMSC:"</string>
+ <string name="radio_info_smsc_update_label">"Bijwerken"</string>
+ <string name="radio_info_smsc_refresh_label">"Vernieuwen"</string>
+ <string name="radio_info_toggle_dns_check_label">"DNS-controle in-/uitschakelen"</string>
+ <string name="band_mode_title">"GSM/UMTS-band instellen"</string>
+ <string name="band_mode_loading">"Bandlijst laden..."</string>
+ <string name="band_mode_set">"Instellen"</string>
+ <string name="band_mode_failed">"Mislukt"</string>
+ <string name="band_mode_succeeded">"Geslaagd"</string>
+ <string name="sdcard_changes_instructions">"Wijzigingen worden van kracht als de USB-kabel opnieuw wordt aangesloten"</string>
+ <string name="sdcard_settings_screen_mass_storage_text">"USB-massaopslag inschakelen"</string>
+ <string name="sdcard_settings_total_bytes_label">"Totaal aantal bytes:"</string>
+ <string name="sdcard_settings_not_present_status">"Geen SD-kaart"</string>
+ <string name="sdcard_settings_available_bytes_label">"Beschikbare bytes:"</string>
+ <string name="sdcard_settings_mass_storage_status">"SD-kaart wordt gebruikt als apparaat voor massaopslag"</string>
+ <string name="sdcard_settings_unmounted_status">"U kunt de SD-kaart nu veilig verwijderen"</string>
+ <string name="sdcard_settings_bad_removal_status">"De SD-kaart is verwijderd terwijl deze nog werd gebruikt!"</string>
+ <string name="sdcard_settings_used_bytes_label">"Gebruikte bytes:"</string>
+ <string name="sdcard_settings_scanning_status">"SD-kaart scannen op media..."</string>
+ <string name="sdcard_settings_read_only_status">"Gekoppelde SD-kaart alleen-lezen"</string>
+ <string name="next_label">"Volgende"</string>
+ <string name="language_picker_title">"Landinstelling"</string>
+ <string name="select_your_language">"Uw taal selecteren"</string>
+ <string name="activity_picker_label">"Activiteit selecteren"</string>
+ <string name="device_info_label">"Apparaatinfo"</string>
+ <string name="battery_info_label">"Accu-info"</string>
+ <string name="battery_history_label">"Accugeschiedenis"</string>
+ <string name="display_label">"Weergave"</string>
+ <string name="phone_info_label">"Telefooninfo"</string>
+ <string name="sd_card_settings_label">"SD-kaart"</string>
+ <string name="proxy_settings_label">"Proxy-instellingen"</string>
+ <string name="cancel">"Annuleren"</string>
+ <string name="settings_label">"Instellingen"</string>
+ <string name="airplane_mode">"Vliegmodus"</string>
+ <string name="airplane_mode_summary">"Alle draadloze verbindingen uitschakelen"</string>
+ <string name="airplane_mode_turning_on">"Draadloze verbindingen uitschakelen..."</string>
+ <string name="airplane_mode_turning_off">"Draadloze verbindingen inschakelen..."</string>
+ <string name="radio_controls_title">"Draadloze bedieningselementen"</string>
+ <string name="radio_controls_summary">"Wi-Fi, Bluetooth, vliegmodus en mobiele netwerken beheren"</string>
+ <string name="date_and_time_settings_title">"Datum en tijd"</string>
+ <string name="date_and_time_settings_summary">"Datum, tijd, tijdzone en notaties instellen"</string>
+ <string name="date_time_auto">"Automatisch"</string>
+ <string name="date_time_auto_summaryOn">"Gebruik door netwerk aangegeven waarden"</string>
+ <string name="date_time_auto_summaryOff">"Gebruik door netwerk aangegeven waarden"</string>
+ <string name="date_time_24hour">"24-uurs notatie gebruiken"</string>
+ <string name="date_time_set_time">"Tijd instellen"</string>
+ <string name="date_time_set_timezone">"Tijdzone selecteren"</string>
+ <string name="date_time_set_date">"Datum instellen"</string>
+ <string name="date_time_date_format">"Datumnotatie selecteren"</string>
+ <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 blokkeren"</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>
+ <string name="bluetooth_settings">"Bluetooth-instellingen"</string>
+ <string name="bluetooth_settings_title">"Bluetooth-instellingen"</string>
+ <string name="bluetooth_settings_summary">"Verbindingen beheren, apparaatnaam en vindbaarheid instellen"</string>
+ <string name="bluetooth_pin_entry">"Bluetooth-koppelingsverzoek"</string>
+ <string name="bluetooth_device_info">"Bluetooth-apparaatinfo"</string>
+ <string name="bluetooth_enter_pin_msg">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"\n\n"Typ de PIN-code om te koppelen."\n"(Probeer 0000 of 1234.)"</string>
+ <string name="bluetooth_error_title">"Let op"</string>
+ <string name="bluetooth_pairing_error_message">"Er is een probleem opgetreden bij het koppelen met <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+ <string name="bluetooth_pairing_pin_error_message">"Er is een probleem opgetreden bij het koppelen met <xliff:g id="DEVICE_NAME">%1$s</xliff:g>, omdat de opgegeven PIN-code onjuist is."</string>
+ <string name="bluetooth_connecting_error_message">"Er is een probleem opgetreden bij het verbinden met <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+ <string name="bluetooth_preference_scan_title">"Scannen naar apparaten"</string>
+ <string name="bluetooth_device_context_connect">"Verbinden"</string>
+ <string name="bluetooth_device_context_disconnect">"Verbinding verbreken"</string>
+ <string name="bluetooth_device_context_pair_connect">"Koppelen en verbinden"</string>
+ <string name="bluetooth_device_context_unpair">"Koppeling ongedaan maken"</string>
+ <string name="bluetooth_device_context_disconnect_unpair">"Verbinding verbreken en koppeling opheffen"</string>
+ <string name="bluetooth_device_context_connect_advanced">"Opties..."</string>
+ <string name="bluetooth_connect_specific_profiles_title">"Verbinding maken met…"</string>
+ <string name="bluetooth_profile_a2dp">"Media"</string>
+ <string name="bluetooth_profile_headset">"Telefoon"</string>
+ <string name="bluetooth_summary_connected_to_a2dp">"Verbonden met audio van medium"</string>
+ <string name="bluetooth_summary_connected_to_headset">"Verbonden met audio van telefoon"</string>
+ <string name="bluetooth_summary_connected_to_a2dp_headset">"Verbonden met audio van telefoon en medium"</string>
+ <string name="bluetooth_device_advanced_title">"Opties voor <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_device_advanced_online_mode_title">"Verbinden"</string>
+ <string name="bluetooth_device_advanced_online_mode_summary">"Verbinden met Bluetooth-apparaat"</string>
+ <string name="bluetooth_device_advanced_profile_header_title">"Profielen"</string>
+ <string name="bluetooth_a2dp_profile_summary_connected">"Verbonden met audio van medium"</string>
+ <string name="bluetooth_headset_profile_summary_connected">"Verbonden met audio van telefoon"</string>
+ <string name="bluetooth_a2dp_profile_summary_use_for">"Gebruiken voor audio van medium"</string>
+ <string name="bluetooth_headset_profile_summary_use_for">"Gebruiken voor audio van telefoon"</string>
+ <string name="wifi">"Wi-Fi"</string>
+ <string name="wifi_quick_toggle_title">"Wi-Fi"</string>
+ <string name="wifi_quick_toggle_summary">"Wi-Fi inschakelen"</string>
+ <string name="wifi_settings">"Wi-Fi-instellingen"</string>
+ <string name="wifi_settings_category">"Wi-Fi-instellingen"</string>
+ <string name="wifi_settings_summary">"Draadloze toegangspunten instellen en beheren"</string>
+ <string name="forget_network">"Vergeten"</string>
+ <string name="wifi_status">"Status"</string>
+ <string name="wifi_link_speed">"Snelheid"</string>
+ <string name="wifi_signal_3">"Uitstekend"</string>
+ <string name="wifi_signal_2">"Goed"</string>
+ <string name="wifi_signal_1">"Redelijk"</string>
+ <string name="wifi_signal_0">"Slecht"</string>
+ <string name="security">"Beveiliging"</string>
+ <string name="wifi_security_open">"Open"</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">"Onbekend"</string>
+ <string name="wifi_security_verbose_open">"Open netwerk"</string>
+ <string name="wifi_security_verbose_wep">"Beveiligd met WEP"</string>
+ <string name="wifi_security_verbose_wpa">"Beveiligd met WPA"</string>
+ <string name="wifi_security_verbose_wpa2">"Beveiligd met WPA2"</string>
+ <string name="ip_address">"IP-adres"</string>
+ <string name="signal">"Signaalsterkte"</string>
+ <string name="wifi_starting">"Inschakelen..."</string>
+ <string name="wifi_stopping">"Uitschakelen..."</string>
+ <string name="wifi_error">"Fout"</string>
+ <string name="error_starting">"Kan Wi-Fi niet starten"</string>
+ <string name="error_stopping">"Kan Wi-Fi niet stoppen"</string>
+ <string name="error_scanning">"Kan niet scannen naar netwerken"</string>
+ <string name="error_connecting">"Kan geen verbinding met het netwerk maken"</string>
+ <string name="error_saving">"Kan het netwerk niet opslaan"</string>
+ <string name="connect">"Verbinden"</string>
+ <string name="connect_to_blank">"Verbinding maken met <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+ <string name="please_type_passphrase">"Draadloos wachtwoord"</string>
+ <string name="please_type_hex_key">"Hexadecimale WEP-sleutel (0-9, A-F)"</string>
+ <string name="wifi_show_password">"Wachtwoord weergeven."</string>
+ <string name="scan_wifi">"Scannen"</string>
+ <string name="summary_not_in_range">"Niet binnen bereik"</string>
+ <string name="summary_remembered">"Onthouden"</string>
+ <string name="summary_connection_failed">"Verbinding mislukt. Selecteer dit om opnieuw te proberen."</string>
+ <string name="wifi_access_points">"Wi-Fi-netwerken"</string>
+ <string name="wifi_type_ssid">"SSID van netwerk"</string>
+ <string name="wifi_security">"Beveiliging"</string>
+ <string name="wifi_save_config">"Opslaan"</string>
+ <string name="wifi_password_unchanged">"(ongewijzigd)"</string>
+ <string name="wifi_add_other_network">"Wi-Fi-netwerk toevoegen"</string>
+ <string name="wifi_notify_open_networks">"Netwerkmelding"</string>
+ <string name="wifi_notify_open_networks_summary">"Melden wanneer een open netwerk beschikbaar is"</string>
+ <string name="wifi_password_incorrect_error">"Het netwerkwachtwoord dat u heeft ingevoerd, is onjuist. Probeer het opnieuw."</string>
+ <string name="wifi_generic_connection_error">"Er kan geen verbinding worden gemaakt met het netwerk. Probeer het opnieuw."</string>
+ <string name="wifi_menu_advanced">"Geavanceerd"</string>
+ <string name="wifi_ip_settings_titlebar">"IP-instellingen"</string>
+ <string name="wifi_ip_settings_menu_save">"Opslaan"</string>
+ <string name="wifi_ip_settings_menu_cancel">"Annuleren"</string>
+ <string name="wifi_ip_settings_invalid_ip">"Voer een geldig IP-adres in."</string>
+ <string name="wifi_use_static_ip">"Statisch IP-adres gebruiken"</string>
+ <string name="wifi_ip_address">"IP-adres"</string>
+ <string name="wifi_dns1">"DNS 1"</string>
+ <string name="wifi_dns2">"DNS 2"</string>
+ <string name="wifi_gateway">"Gateway"</string>
+ <string name="wifi_netmask">"Netmasker"</string>
+ <string name="wifi_context_menu_connect">"Verbinding maken met netwerk"</string>
+ <string name="wifi_context_menu_forget">"Netwerk niet gebruiken"</string>
+ <string name="wifi_context_menu_change_password">"Wachtwoord wijzigen"</string>
+ <string name="wifi_advanced_titlebar">"Geavanceerd"</string>
+ <string name="wifi_setting_num_channels_title">"Regulerend domein"</string>
+ <string name="wifi_setting_num_channels_summary">"Het aantal te gebruiken kanalen instellen"</string>
+ <string name="wifi_setting_num_channels_error">"Er is een probleem opgetreden bij het instellen van het regulerende domein."</string>
+ <string name="wifi_setting_num_channels_channel_phrase">"<xliff:g id="NUM_CHANNELS">%1$d</xliff:g> kanalen"</string>
+ <string name="wifi_setting_sleep_policy_title">"Wi-Fi-slaapbeleid"</string>
+ <string name="wifi_setting_sleep_policy_summary">"Opgeven wanneer wordt overgeschakeld van Wi-Fi naar mobiele gegevens"</string>
+ <string name="wifi_setting_sleep_policy_error">"Er is een probleem opgetreden bij het instellen van het slaapbeleid."</string>
+ <string name="wifi_advanced_mac_address_title">"MAC-adres"</string>
+ <string name="fragment_status_scanning">"Scannen..."</string>
+ <string name="fragment_status_connecting">"Verbinding maken met <xliff:g id="NETWORK_NAME">%1$s</xliff:g>..."</string>
+ <string name="fragment_status_authenticating">"Verifiëren met <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</string>
+ <string name="fragment_status_obtaining_ip">"IP-adres ophalen van <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</string>
+ <string name="fragment_status_connected">"Verbonden met <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+ <string name="fragment_status_disconnecting">"Verbinding verbreken met <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</string>
+ <string name="fragment_status_disconnected">"Verbinding verbroken"</string>
+ <string name="fragment_status_failed">"Mislukt"</string>
+ <string name="status_scanning">"Scannen..."</string>
+ <string name="status_connecting">"Verbinding maken..."</string>
+ <string name="status_authenticating">"Verifiëren..."</string>
+ <string name="status_obtaining_ip">"Adres ophalen..."</string>
+ <string name="status_connected">"Verbonden"</string>
+ <string name="status_disconnecting">"Verbinding verbreken..."</string>
+ <string name="status_disconnected">"Verbinding verbroken"</string>
+ <string name="status_failed">"Mislukt"</string>
+ <string name="sound_and_display_settings">"Geluid en weergave"</string>
+ <string name="sound_settings">"Geluidsinstellingen"</string>
+ <string name="sound_and_display_settings_summary">"Beltonen, meldingen, schermhelderheid instellen"</string>
+ <string name="silent_mode_title">"Stille modus"</string>
+ <string name="silent_mode_summary">"Alle geluiden worden uitgeschakeld, behalve media- en alarmtonen"</string>
+ <string name="ringtone_title">"Beltoon telefoon"</string>
+ <string name="ringtone_summary">"Standaardbeltoon voor inkomende oproepen instellen"</string>
+ <string name="ring_volume_title">"Belvolume"</string>
+ <string name="ring_volume_summary">"Volume voor inkomende oproepen en meldingen instellen"</string>
+ <string name="vibrate_title">"Trilstand telefoon"</string>
+ <string name="vibrate_summary">"Laat telefoon trillen bij inkomende oproepen"</string>
+ <string name="notification_sound_title">"Beltoon voor meldingen"</string>
+ <string name="notification_sound_summary">"Standaardbeltoon voor meldingen instellen"</string>
+ <string name="incoming_call_volume_title">"Volume van inkomende oproepen"</string>
+ <string name="notification_volume_title">"Meldingsvolume"</string>
+ <string name="checkbox_notification_same_as_incoming_call">"Volume van inkomende oproepen gebruiken voor meldingen"</string>
+ <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">"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>
+ <string name="sound_effects_enable_summary_on">"Geluid afspelen bij schermselectie"</string>
+ <string name="sound_effects_enable_summary_off">"Geluid afspelen bij schermselectie"</string>
+ <string name="play_media_notification_sounds_enable_title">"SD-kaartmeldingen"</string>
+ <string name="play_media_notification_sounds_enable_summary_on">"Geluiden voor SD-kaartmeldingen uitschakelen"</string>
+ <string name="play_media_notification_sounds_enable_summary_off">"Geluiden voor SD-kaartmeldingen inschakelen"</string>
+ <string name="sync_settings">"Gegevenssynchronisatie"</string>
+ <string name="sync_settings_summary">"Selecteren welke toepassingen worden gesynchroniseerd"</string>
+ <string name="display_settings">"Instellingen weergeven"</string>
+ <string name="animations_title">"Animatie"</string>
+ <string name="animations_summary_on">"Animatie weergeven bij het openen/sluiten van vensters"</string>
+ <string name="animations_summary_off">"Animatie weergeven bij het openen/sluiten van vensters"</string>
+ <string name="brightness">"Helderheid"</string>
+ <string name="brightness_summary">"Helderheid van het scherm aanpassen"</string>
+ <string name="screen_timeout">"Time-out scherm"</string>
+ <string name="screen_timeout_summary">"De vertraging voor het automatisch uitschakelen van het scherm aanpassen"</string>
+ <string name="sim_lock_settings">"Instellingen SIM-kaartblokkering"</string>
+ <string name="sim_lock_settings_category">"SIM-kaartblokkering instellen"</string>
+ <string name="sim_lock_settings_title">"SIM-kaartblokkering"</string>
+ <string name="sim_pin_toggle">"SIM-kaart blokkeren"</string>
+ <string name="sim_lock_on">"PIN-code vereist voor gebruik van telefoon"</string>
+ <string name="sim_lock_off">"PIN-code vereist voor gebruik van telefoon"</string>
+ <string name="sim_pin_change">"SIM PIN-code wijzigen"</string>
+ <string name="sim_enter_pin">"SIM PIN-code"</string>
+ <string name="sim_enable_sim_lock">"SIM-kaart blokkeren"</string>
+ <string name="sim_disable_sim_lock">"SIM-kaart ontgrendelen"</string>
+ <string name="sim_enter_old">"Oude SIM PIN-code"</string>
+ <string name="sim_enter_new">"Nieuwe SIM PIN-code"</string>
+ <string name="sim_reenter_new">"Nieuwe PIN-code nogmaals invoeren"</string>
+ <string name="sim_change_pin">"SIM PIN-code"</string>
+ <string name="sim_bad_pin">"Onjuiste PIN-code!"</string>
+ <string name="sim_pins_dont_match">"PIN-codes komen niet overeen!"</string>
+ <string name="sim_change_failed">"Kan PIN-code niet wijzigen."\n"PIN-code mogelijk onjuist."</string>
+ <string name="sim_change_succeeded">"SIM PIN-code gewijzigd"</string>
+ <string name="sim_lock_failed">"Kan status van SIM-kaartblokkering niet wijzigen."\n"PIN-code mogelijk onjuist."</string>
+ <string name="sim_enter_ok">"OK"</string>
+ <string name="sim_enter_cancel">"Annuleren"</string>
+ <string name="device_info_settings">"Telefoonstatus"</string>
+ <string name="system_update_settings_list_item_title">"Systeemupdates"</string>
+ <string name="system_update_settings_list_item_summary">"Controleren op systeemupdates"</string>
+ <string name="firmware_version">"Firmwareversie"</string>
+ <string name="model_number">"Modelnummer"</string>
+ <string name="baseband_version">"Smalbandversie"</string>
+ <string name="kernel_version">"Kernel-versie"</string>
+ <string name="build_number">"Build-nummer"</string>
+ <string name="device_info_not_available">"Niet beschikbaar"</string>
+ <string name="device_status_activity_title">"Status"</string>
+ <string name="device_status">"Status"</string>
+ <string name="device_status_summary">"IMEI-nummer, telefoonnummer, signaal, enzovoort"</string>
+ <string name="storage_settings_title">"SD-kaart en telefoongeheugen"</string>
+ <string name="storage_settings_summary">"SD-kaart ontkoppelen, beschikbare opslagruimte weergeven"</string>
+ <string name="status_number">"Telefoonnummer"</string>
+ <string name="status_network_type">"Type mobiel netwerk"</string>
+ <string name="status_data_state">"Status mobiel netwerk"</string>
+ <string name="status_service_state">"Servicestatus"</string>
+ <string name="status_signal_strength">"Signaalsterkte"</string>
+ <string name="status_roaming">"Roaming"</string>
+ <string name="status_operator">"Netwerk"</string>
+ <string name="status_wifi_mac_address">"Wi-Fi MAC-adres"</string>
+ <string name="status_bt_address">"Bluetooth-adres"</string>
+ <string name="status_unavailable">"Niet beschikbaar"</string>
+ <string name="status_network_traffic_stats">"Netwerkgebruik"</string>
+ <string name="status_network_traffic_summary">"Verzonden: <xliff:g id="NETWORK_TRAFFIC_0">%1$d packets, %2$d bytes%n</xliff:g>Ontvangen: <xliff:g id="NETWORK_TRAFFIC_1">%3$d packets, %4$d bytes</xliff:g>"</string>
+ <string name="status_up_time">"Bedrijfstijd"</string>
+ <string name="status_awake_time">"Stand-bytijd"</string>
+ <string name="internal_memory">"Intern telefoongeheugen"</string>
+ <string name="sd_memory">"SD-kaart"</string>
+ <string name="memory_available">"Beschikbare ruimte"</string>
+ <string name="memory_size">"Totale ruimte"</string>
+ <string name="sd_eject">"SD-kaart ontkoppelen"</string>
+ <string name="sd_eject_summary">"De SD-kaart ontkoppelen zodat u deze veilig kunt verwijderen"</string>
+ <string name="sd_format">"SD-kaart formatteren"</string>
+ <string name="sd_format_summary">"De SD-kaart formatteren (wissen)"</string>
+ <string name="sd_unavailable">"Niet beschikbaar"</string>
+ <string name="read_only">" (Alleen-lezen)"</string>
+ <string name="battery_status_title">"Accustatus"</string>
+ <string name="battery_level_title">"Accuniveau"</string>
+ <string name="apn_settings">"APN\'s"</string>
+ <string name="apn_edit">"Toegangspunt bewerken"</string>
+ <string name="apn_not_set">"&lt;Niet ingesteld&gt;"</string>
+ <string name="apn_name">"Naam"</string>
+ <string name="apn_apn">"APN"</string>
+ <string name="apn_http_proxy">"Proxy"</string>
+ <string name="apn_http_port">"Poort"</string>
+ <string name="apn_user">"Gebruikersnaam"</string>
+ <string name="apn_password">"Wachtwoord"</string>
+ <string name="apn_server">"Server"</string>
+ <string name="apn_mmsc">"MMSC"</string>
+ <string name="apn_mms_proxy">"MMS-proxy"</string>
+ <string name="apn_mms_port">"MMS-poort"</string>
+ <string name="apn_mcc">"MCC"</string>
+ <string name="apn_mnc">"MNC"</string>
+ <string name="apn_type">"APN-type"</string>
+ <string name="menu_delete">"APN verwijderen"</string>
+ <string name="menu_new">"Nieuwe APN"</string>
+ <string name="menu_save">"Opslaan"</string>
+ <string name="menu_cancel">"Weggooien"</string>
+ <string name="error_title">"Let op"</string>
+ <string name="error_name_empty">"Het veld \'Naam\' mag niet leeg zijn."</string>
+ <string name="error_apn_empty">"De APN mag niet leeg zijn."</string>
+ <string name="error_mcc_not3">"MCC-veld moet 3 cijfers bevatten."</string>
+ <string name="error_mnc_not23">"MNC-veld moet 2 of 3 cijfers bevatten."</string>
+ <string name="master_clear_title">"Terugzetten op fabrieksinstellingen"</string>
+ <string name="master_clear_summary">"Hiermee worden alle gegevens op de telefoon gewist"</string>
+ <string name="master_clear_desc">"Met deze actie wordt de telefoon teruggezet op de fabrieksinstellingen. Alle gegevens en gedownloade toepassingen worden gewist!"</string>
+ <string name="master_clear_button_text">"Telefoon opnieuw instellen"</string>
+ <string name="master_clear_final_desc">"Telefoon opnieuw instellen en alle gegevens en toepassingen wissen? Actie kan niet ongedaan worden gemaakt!"</string>
+ <string name="master_clear_final_button_text">"Alles wissen"</string>
+ <string name="master_clear_gesture_prompt">"Teken uw ontgrendelingspatroon"</string>
+ <string name="master_clear_gesture_explanation">"U moet uw ontgrendelingspatroon tekenen om het opnieuw instellen van de telefoon te bevestigen."</string>
+ <string name="master_clear_failed">"Niet opnieuw ingesteld, omdat de service \'Systeem wissen\' niet beschikbaar is."</string>
+ <string name="media_format_title">"SD-kaart formatteren."</string>
+ <string name="media_format_summary">"Hiermee worden alle gegevens op de SD-kaart gewist"</string>
+ <string name="media_format_desc">"Deze actie wist de gegevens van de SD-kaart die in de telefoon is geplaatst. ALLE gegevens op de kaart gaan dan verloren."</string>
+ <string name="media_format_button_text">"SD-kaart formatteren"</string>
+ <string name="media_format_final_desc">"Wilt u de SD-kaart formatteren en al uw mediabestanden wissen? Deze actie kan niet ongedaan worden gemaakt."</string>
+ <string name="media_format_final_button_text">"Alles wissen"</string>
+ <string name="media_format_gesture_prompt">"Teken uw deblokkeringspatroon"</string>
+ <string name="media_format_gesture_explanation">"U moet uw deblokkeringspatroon tekenen om het formatteren van een SD-kaart te bevestigen."</string>
+ <string name="call_settings_title">"Oproepinstellingen"</string>
+ <string name="call_settings_summary">"Voicemail, oproepen doorschakelen, wisselgesprek, beller-id instellen."</string>
+ <string name="network_settings_title">"Mobiele netwerken"</string>
+ <string name="network_settings_summary">"Opties voor roaming, netwerken, APN\'s instellen"</string>
+ <string name="location_title">"Mijn locatiebronnen"</string>
+ <string name="location_network_based">"Draadloze netwerken gebruiken"</string>
+ <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">"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>
+ <string name="contributors_title">"Bijdragers"</string>
+ <string name="copyright_title">"Auteursrecht"</string>
+ <string name="license_title">"Licentie"</string>
+ <string name="terms_title">"Algemene voorwaarden"</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>
+ <string name="settings_license_activity_loading">"Laden..."</string>
+ <string name="lock_settings_title">"Ontgrendelingspatroon scherm"</string>
+ <string name="lockpattern_change_lock_pattern_label">"Ontgrendelingspatroon wijzigen"</string>
+ <string name="lockpattern_need_to_unlock">"Opgeslagen patroon bevestigen"</string>
+ <string name="lockpattern_need_to_unlock_wrong">"Probeer het opnieuw:"</string>
+ <string name="lockpattern_recording_intro_header">"Teken een ontgrendelingspatroon"</string>
+ <string name="lockpattern_recording_intro_footer">"Druk op \'Menu\' voor hulp."</string>
+ <string name="lockpattern_recording_inprogress">"Haal uw vinger van het scherm als u klaar bent."</string>
+ <string name="lockpattern_recording_incorrect_too_short">"Verbind minimaal <xliff:g id="NUMBER">%d</xliff:g> punten. Probeer het opnieuw:"</string>
+ <string name="lockpattern_pattern_entered_header">"Patroon opgenomen!"</string>
+ <string name="lockpattern_need_to_confirm">"Teken patroon nogmaals ter bevestiging:"</string>
+ <string name="lockpattern_pattern_confirmed_header">"Uw nieuwe ontgrendelingspatroon:"</string>
+ <string name="lockpattern_confirm_button_text">"Bevestigen"</string>
+ <string name="lockpattern_restart_button_text">"Opnieuw tekenen"</string>
+ <string name="lockpattern_retry_button_text">"Opnieuw proberen"</string>
+ <string name="lockpattern_continue_button_text">"Doorgaan"</string>
+ <string name="lockpattern_settings_title">"Deblokkeringspatroon"</string>
+ <string name="lockpattern_settings_enable_title">"Patroon vereist"</string>
+ <string name="lockpattern_settings_enable_summary">"U moet een patroon tekenen om het scherm te ontgrendelen"</string>
+ <string name="lockpattern_settings_enable_visible_pattern_title">"Zichtbaar patroon gebruiken"</string>
+ <string name="lockpattern_settings_enable_tactile_feedback_title">"Tastbare feedback gebruiken"</string>
+ <string name="lockpattern_settings_choose_lock_pattern">"Ontgrendelingspatroon instellen"</string>
+ <string name="lockpattern_settings_change_lock_pattern">"Ontgrendelingspatroon wijzigen"</string>
+ <string name="lockpattern_settings_help_how_to_record">"U tekent als volgt een ontgrendelingspatroon"</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_header">"Te veel onjuiste pogingen!"</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_footer">"Probeer het over <xliff:g id="NUMBER">%d</xliff:g> seconden opnieuw."</string>
+ <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 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>
+ <string name="manageapplications_settings_summary">"Geïnstalleerde toepassingen beheren en verwijderen"</string>
+ <string name="applications_settings">"Toepassingen"</string>
+ <string name="applications_settings_summary">"Toepassingen beheren, sneltoetsen voor snelstarten instellen"</string>
+ <string name="applications_settings_header">"Toepassingsinstellingen"</string>
+ <string name="install_applications">"Onbekende bronnen"</string>
+ <string name="install_unknown_applications">"Installatie van andere toepassingen dan Market-toepassingen toestaan"</string>
+ <string name="install_all_warning">"Uw telefoon en persoonlijke gegevens zijn gevoeliger voor aanvallen door toepassingen van onbekende bronnen. U gaat ermee akkoord dat u alleen verantwoordelijk bent voor enige schade aan uw telefoon of verlies van gegevens die voortkomen uit het gebruik van deze toepassingen."</string>
+ <string name="application_info_label">"Toepassingsinfo"</string>
+ <string name="storage_label">"Opslagruimte"</string>
+ <string name="auto_launch_label">"Standaard starten"</string>
+ <string name="permissions_label">"Machtigingen"</string>
+ <string name="cache_header_label">"Cachegeheugen"</string>
+ <string name="clear_cache_btn_text">"Cache wissen"</string>
+ <string name="cache_size_label">"Cachegeheugen"</string>
+ <string name="controls_label">"Bedieningselementen"</string>
+ <string name="force_stop">"Nu stoppen"</string>
+ <string name="total_size_label">"Totaal"</string>
+ <string name="application_size_label">"Toepassing"</string>
+ <string name="data_size_label">"Gegevens"</string>
+ <string name="uninstall_text">"Verwijderen"</string>
+ <string name="clear_user_data_text">"Gegevens wissen"</string>
+ <string name="auto_launch_enable_text">"U heeft ervoor gekozen om deze toepassing standaard te starten voor bepaalde acties."</string>
+ <string name="auto_launch_disable_text">"Geen standaardwaarden ingesteld."</string>
+ <string name="clear_activities">"Standaardwaarden wissen"</string>
+ <string name="unknown">"Onbekend"</string>
+ <string name="sort_order_alpha">"Sorteren"</string>
+ <string name="sort_order_size">"Sorteren op grootte"</string>
+ <string name="manage_space_text">"Ruimte beheren"</string>
+ <string name="filter">"Filter"</string>
+ <string name="filter_dlg_title">"Filteropties selecteren"</string>
+ <string name="filter_apps_all">"Alles"</string>
+ <string name="filter_apps_third_party">"Derden"</string>
+ <string name="filter_apps_running">"Wordt uitgevoerd"</string>
+ <string name="loading">"Laden..."</string>
+ <string name="recompute_size">"Grootte opnieuw berekenen..."</string>
+ <string name="clear_data_dlg_title">"Verwijderen"</string>
+ <string name="clear_data_dlg_text">"Alle informatie die u in deze toepassing heeft opgeslagen, wordt definitief verwijderd."</string>
+ <string name="dlg_ok">"OK"</string>
+ <string name="dlg_cancel">"Annuleren"</string>
+ <string name="app_not_found_dlg_title">"Toepassing niet gevonden"</string>
+ <string name="app_not_found_dlg_text">"De toepassing is niet gevonden in de lijst met geïnstalleerde toepassingen."</string>
+ <string name="clear_data_failed">"Kan toepassingsgegevens niet wissen."</string>
+ <string name="security_settings_desc">"Deze toepassing heeft toegang tot de volgende opties van uw telefoon:"</string>
+ <string name="computing_size">"Berekenen…"</string>
+ <string name="invalid_size_value">"Kan grootte van pakket niet berekenen"</string>
+ <string name="empty_list_msg">"U heeft geen toepassingen van derden geïnstalleerd."</string>
+ <string name="language_settings">"Landinstelling en tekst"</string>
+ <string name="language_settings_summary">"Instellingen voor taal en regio, tekstinvoer en autocorrectieopties opgeven"</string>
+ <string name="language_category">"Landinstelling"</string>
+ <string name="text_category">"Tekstinstellingen"</string>
+ <string name="phone_language">"Landinstelling selecteren"</string>
+ <string name="phone_language_summary">"Taal en regio selecteren"</string>
+ <string name="auto_replace">"Automatisch vervangen"</string>
+ <string name="auto_replace_summary">"Corrigeer verkeerd getypte woorden"</string>
+ <string name="auto_caps">"Automatische hoofdletters"</string>
+ <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 \'.\' in te voegen"</string>
+ <string name="show_password">"Zichtbare wachtwoorden"</string>
+ <string name="show_password_summary">"Wachtwoord weergeven tijdens het typen"</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 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_context_menu_edit_title">"Bewerken"</string>
+ <string name="user_dict_settings_context_menu_delete_title">"Verwijderen"</string>
+ <string name="user_dict_settings_empty_text">"U heeft geen woorden in het gebruikerswoordenboek. U kunt een woord toevoegen via het menu."</string>
+ <string name="testing">"Testen"</string>
+ <string name="testing_phone_info">"Telefooninformatie"</string>
+ <string name="testing_battery_info">"Accu-informatie"</string>
+ <string name="testing_battery_history">"Accugeschiedenis"</string>
+ <string name="quick_launch_title">"Snelstarten"</string>
+ <string name="quick_launch_summary">"Sneltoetsen instellen voor starten toepassingen"</string>
+ <string name="quick_launch_assign_application">"Toepassing toewijzen"</string>
+ <string name="quick_launch_no_shortcut">"Geen sneltoets"</string>
+ <string name="quick_launch_shortcut">"Zoeken + <xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g>"</string>
+ <string name="quick_launch_clear_dialog_title">"Wissen"</string>
+ <string name="quick_launch_clear_dialog_message">"Uw sneltoets voor <xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g> (<xliff:g id="APPLICATION_NAME">%2$s</xliff:g>) wordt gewist."</string>
+ <string name="quick_launch_clear_ok_button">"OK"</string>
+ <string name="quick_launch_clear_cancel_button">"Annuleren"</string>
+ <string name="quick_launch_display_mode_applications">"Toepassingen"</string>
+ <string name="quick_launch_display_mode_shortcuts">"Sneltoetsen"</string>
+ <string name="input_methods_settings_title">"Tekstinvoer"</string>
+ <string name="input_methods_settings_summary">"Opties voor tekstinvoer beheren"</string>
+ <string name="input_methods_settings_label_format">"Instellingen voor %s"</string>
+ <string name="development_settings_title">"Ontwikkeling"</string>
+ <string name="development_settings_summary">"Opties instellen voor toepassingsontwikkeling"</string>
+ <string name="enable_adb">"USB-foutopsporing"</string>
+ <string name="enable_adb_summary">"Foutopsporingsmodus bij USB-verbinding"</string>
+ <string name="keep_screen_on">"Stand-by"</string>
+ <string name="keep_screen_on_summary">"Scherm gaat nooit uit tijdens het opladen"</string>
+ <string name="allow_mock_location">"Neplocaties toestaan"</string>
+ <string name="allow_mock_location_summary">"Neplocaties toestaan"</string>
+ <!-- no translation found for gadget_picker_title (98374951396755811) -->
+ <skip />
+ <!-- no translation found for widget_picker_title (9130684134213467557) -->
+ <skip />
+ <string name="battery_history_details_for">"Details voor UID %d"</string>
+ <string name="battery_history_uid">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
+ <string name="battery_history_network_usage">"Netwerkgebruiksdetails voor <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
+ <string name="battery_history_bytes_received">"Bytes ontvangen: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_sent">"Bytes verzonden: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_total">"Totaal aantal bytes: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_cpu_usage">"CPU-gebruiksdetails voor <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
+ <string name="battery_history_user_time">"Gebruikerstijd:"</string>
+ <string name="battery_history_system_time">"Systeemtijd:"</string>
+ <string name="battery_history_total_time">"Totale tijdsduur:"</string>
+ <string name="battery_history_starts">"Aantal keren gestart: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
+ <string name="battery_history_days">"<xliff:g id="DAYS">%1$d</xliff:g> dagen, <xliff:g id="HOURS">%2$d</xliff:g> uur, <xliff:g id="MINUTES">%3$d</xliff:g> minuten, <xliff:g id="SECONDS">%4$d</xliff:g> seconden"</string>
+ <string name="battery_history_hours">"<xliff:g id="HOURS">%1$d</xliff:g> uur, <xliff:g id="MINUTES">%2$d</xliff:g> minuten, <xliff:g id="SECONDS">%3$d</xliff:g> seconden"</string>
+ <string name="battery_history_minutes">"<xliff:g id="MINUTES">%1$d</xliff:g> minuten, <xliff:g id="SECONDS">%2$d</xliff:g> seconden"</string>
+ <string name="battery_history_seconds">"<xliff:g id="SECONDS">%1$d</xliff:g> seconden"</string>
+ <string name="battery_history_packages_sharing_this_uid">"Pakketten die deze UID delen:"</string>
+ <string name="battery_history_no_data">"Er zijn geen beschikbare gebruiksgegevens van de accu"</string>
+ <string name="battery_history_sensor">"Sensor:"</string>
+ <!-- no translation found for battery_history_wakelock (608683447522396293) -->
+ <skip />
+ <string name="battery_history_used_by_packages">"De sensor wordt gebruikt door de volgende pakketten:"</string>
+ <string name="battery_history_sensor_usage">"<xliff:g id="COUNT">%1$d</xliff:g> keer gebruikt door <xliff:g id="PACKAGE">%2$s</xliff:g>"</string>
+ <string name="battery_history_sensor_usage_multi">"<xliff:g id="COUNT">%1$d</xliff:g> keer gebruikt door een van de volgende:"</string>
+ <!-- no translation found for battery_history_awake_label (8449792868990080882) -->
+ <skip />
+ <!-- no translation found for battery_history_screen_on_label (1848936521786339362) -->
+ <skip />
+ <!-- no translation found for battery_history_phone_on_label (700191958853142297) -->
+ <skip />
+ <!-- no translation found for battery_history_awake (4350886665719031057) -->
+ <skip />
+ <string name="battery_history_screen_on">"Tijd verstreken met scherm aan:"</string>
+ <!-- no translation found for battery_history_phone_on (4891504401623839532) -->
+ <skip />
+ <string name="battery_history_screen_on_battery">"Op accu:"</string>
+ <string name="battery_history_screen_on_plugged">"Opladen:"</string>
+ <string name="usage_stats_label">"Gebruiksstatistieken"</string>
+ <string name="testing_usage_stats">"Gebruiksstatistieken"</string>
+ <string name="display_order_text">"Sorteren op:"</string>
+ <string name="app_name_label">"Toepassing"</string>
+ <string name="launch_count_label">"Aantal"</string>
+ <string name="usage_time_label">"Gebruikstijd"</string>
+</resources>
diff --git a/res/values-no-nokeys/strings.xml b/res/values-no-nokeys/strings.xml
new file mode 100644
index 0000000..0e080b4
--- /dev/null
+++ b/res/values-no-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">"Installerte applikasjoner, hurtigtaster"</string>
+</resources>
diff --git a/res/values-nokeys/strings.xml b/res/values-nokeys/strings.xml
new file mode 100644
index 0000000..67a69e7
--- /dev/null
+++ b/res/values-nokeys/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- Applications settings summary, on main settings screen. The summary for the "Applications" item on the main settings screen. Describes what settings are accessible from the "Applications" screen. This is the string to use for devices without a keyboard (so for example, there is no "Quick launch" settings here since that feature requires a keyboard) -->
+ <string name="applications_settings_summary">Manage applications</string>
+
+</resources>
diff --git a/res/values-pl-nokeys/strings.xml b/res/values-pl-nokeys/strings.xml
new file mode 100644
index 0000000..3971571
--- /dev/null
+++ b/res/values-pl-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">"Zarządzaj aplikacjami"</string>
+</resources>
diff --git a/res/values-pl/arrays.xml b/res/values-pl/arrays.xml
new file mode 100644
index 0000000..5855618
--- /dev/null
+++ b/res/values-pl/arrays.xml
@@ -0,0 +1,72 @@
+<?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>"Ameryka"</item>
+ <item>"Europa"</item>
+ <item>"Afryka"</item>
+ <item>"Azja"</item>
+ <item>"Australia"</item>
+ <item>"Pacyfik"</item>
+ <item>"Wszystkie"</item>
+ </string-array>
+ <string-array name="screen_timeout_entries">
+ <item>"15 sekund"</item>
+ <item>"30 sekund"</item>
+ <item>"1 minuta"</item>
+ <item>"2 minuty"</item>
+ <item>"10 minut"</item>
+ <item>"Nigdy nie wygaszaj"</item>
+ </string-array>
+ <string-array name="wifi_security_entries">
+ <item>"Automatycznie"</item>
+ <item>"Brak"</item>
+ <item>"WEP"</item>
+ <item>"WPA Personal"</item>
+ <item>"WPA2 Personal"</item>
+ </string-array>
+ <string-array name="wifi_security_without_auto_entries">
+ <item>"Brak"</item>
+ <item>"WEP"</item>
+ <item>"WPA Personal"</item>
+ <item>"WPA2 Personal"</item>
+ </string-array>
+ <string-array name="wifi_wep_type">
+ <item>"Automatycznie"</item>
+ <item>"WEP ASCII"</item>
+ <item>"WEP szesnastkowy"</item>
+ </string-array>
+ <string-array name="wifi_sleep_policy_entries">
+ <item>"Po wyłączeniu ekranu"</item>
+ <item>"Nigdy, gdy podłączony"</item>
+ <item>"Nigdy"</item>
+ </string-array>
+ <!-- no translation found for battery_history_type_spinner:0 (2193799199027871385) -->
+ <!-- no translation found for battery_history_type_spinner:1 (6401018715947316517) -->
+ <!-- no translation found for battery_history_type_spinner:2 (188092590354892392) -->
+ <!-- no translation found for battery_history_type_spinner:3 (8414109131222049141) -->
+ <!-- no translation found for battery_history_type_spinner:4 (1327904325081257093) -->
+ <!-- no translation found for battery_history_type_spinner:5 (4832254146664706277) -->
+ <!-- no translation found for battery_history_which_spinner:0 (3451981114763440074) -->
+ <!-- no translation found for battery_history_which_spinner:1 (166936313535197598) -->
+ <!-- no translation found for battery_history_which_spinner:2 (4793941382744963893) -->
+ <string-array name="usage_stats_display_order_types">
+ <item>"Czas użycia"</item>
+ <item>"Licznik uruchomień"</item>
+ <item>"Nazwa aplikacji"</item>
+ </string-array>
+</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
new file mode 100644
index 0000000..51ce9cb
--- /dev/null
+++ b/res/values-pl/strings.xml
@@ -0,0 +1,672 @@
+<?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">"Nieznany"</string>
+ <string name="turn_on_radio">"Włącz radio"</string>
+ <string name="turn_off_radio">"Wyłącz radio"</string>
+ <string name="turn_on_qxdm">"Włącz dziennik QXDM dla karty SD"</string>
+ <string name="turn_off_qxdm">"Wyłącz dziennik QXDM dla karty SD"</string>
+ <string name="radioInfo_menu_viewADN">"Wyświetl książkę adresową na karcie SIM"</string>
+ <string name="radioInfo_menu_viewFDN">"Wyświetl ustalone numery (FDN)"</string>
+ <string name="radioInfo_menu_viewSDN">"Wyświetl numery usług"</string>
+ <string name="radioInfo_menu_getPDP">"Pobierz listę PDP"</string>
+ <string name="radioInfo_menu_enableData">"Włącz połączenie danych"</string>
+ <string name="radioInfo_menu_disableData">"Wyłącz połączenie danych"</string>
+ <string name="radioInfo_menu_enableDataOnBoot">"Włącz dane podczas uruchamianiu"</string>
+ <string name="radioInfo_menu_disableDataOnBoot">"Wyłącz dane przy uruchamianiu"</string>
+ <string name="radioInfo_service_in">"Działa"</string>
+ <string name="radioInfo_service_out">"Nie działa"</string>
+ <string name="radioInfo_service_emergency">"Tylko połączenia alarmowe"</string>
+ <string name="radioInfo_service_off">"Radio wyłączone"</string>
+ <string name="radioInfo_roaming_in">"Roaming"</string>
+ <string name="radioInfo_roaming_not">"Brak roamingu"</string>
+ <string name="radioInfo_phone_idle">"Bezczynny"</string>
+ <string name="radioInfo_phone_ringing">"Dzwonienie"</string>
+ <string name="radioInfo_phone_offhook">"Połączenie w toku"</string>
+ <string name="radioInfo_data_disconnected">"Rozłączona"</string>
+ <string name="radioInfo_data_connecting">"Łączenie"</string>
+ <string name="radioInfo_data_connected">"Połączony"</string>
+ <string name="radioInfo_data_suspended">"Zawieszony"</string>
+ <string name="radioInfo_unknown">"nieznane"</string>
+ <string name="radioInfo_display_packets">"pakietów"</string>
+ <string name="radioInfo_display_bytes">"bajtów"</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">"Odłącz kartę SD"</string>
+ <string name="sdcard_format">"Formatuj kartę SD"</string>
+ <string name="small_font">"Mały"</string>
+ <string name="medium_font">"Średni"</string>
+ <string name="large_font">"Duży"</string>
+ <string name="font_size_save">"OK"</string>
+ <string name="sdcard_setting">"Karta SD"</string>
+ <string name="battery_info_status_label">"Stan baterii:"</string>
+ <string name="battery_info_scale_label">"Poziom baterii:"</string>
+ <string name="battery_info_level_label">"Poziom naładowania baterii:"</string>
+ <string name="battery_info_health_label">"Poziom baterii:"</string>
+ <string name="battery_info_technology_label">"Technologia wykonania baterii:"</string>
+ <string name="battery_info_voltage_label">"Napięcie baterii:"</string>
+ <string name="battery_info_voltage_units">"mV"</string>
+ <string name="battery_info_temperature_label">"Temperatura baterii:"</string>
+ <string name="battery_info_temperature_units">"°C"</string>
+ <string name="battery_info_uptime">"Czas od uruchomienia:"</string>
+ <string name="battery_info_awake_battery">"Czas działania na baterii:"</string>
+ <string name="battery_info_awake_plugged">"Czas pozostawania w stanie wybudzenia podczas ładowania:"</string>
+ <string name="battery_info_screen_on">"Czas włączenia ekranu:"</string>
+ <string name="battery_info_status_unknown">"Nieznany"</string>
+ <string name="battery_info_status_charging">"Ładowanie"</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">"Rozładowywanie"</string>
+ <string name="battery_info_status_not_charging">"Nie ładuje"</string>
+ <string name="battery_info_status_full">"Pełna"</string>
+ <string name="battery_info_health_unknown">"Nieznane"</string>
+ <string name="battery_info_health_good">"Dobry"</string>
+ <string name="battery_info_health_overheat">"Przegrzanie"</string>
+ <string name="battery_info_health_dead">"Rozładowana"</string>
+ <string name="battery_info_health_over_voltage">"Przepięcie"</string>
+ <string name="battery_info_health_unspecified_failure">"Nieznany błąd"</string>
+ <string name="bluetooth">"Bluetooth"</string>
+ <string name="bluetooth_visibility">"Wykrywalny"</string>
+ <string name="bluetooth_is_discoverable">"Wykrywalny przez <xliff:g id="DISCOVERABLE_TIME_PERIOD">%1$s</xliff:g> s …"</string>
+ <string name="bluetooth_not_discoverable">"Zezwalaj na wykrywanie urządzenia"</string>
+ <string name="bluetooth_devices">"Lista urządzeń"</string>
+ <string name="bluetooth_device_name">"Nazwa urządzenia"</string>
+ <string name="bluetooth_name_not_set">"Nie ustawiono nazwy, wykorzystywana jest nazwa konta"</string>
+ <string name="bluetooth_scan_for_devices">"Wyszukaj urządzenia"</string>
+ <string name="bluetooth_disconnect_blank">"Urządzenie <xliff:g id="DEVICE_NAME">%1$s</xliff:g> zostanie odłączone."</string>
+ <string name="bluetooth_connected">"Połączony"</string>
+ <string name="bluetooth_disconnected">"Rozłączona"</string>
+ <string name="bluetooth_disconnecting">"Rozłączanie..."</string>
+ <string name="bluetooth_connecting">"Łączenie..."</string>
+ <!-- no translation found for bluetooth_unknown (1905151516611093010) -->
+ <skip />
+ <string name="bluetooth_not_connected">"Paruj z tym urządzeniem"</string>
+ <string name="bluetooth_pairing">"Parowanie..."</string>
+ <!-- no translation found for bluetooth_paired (1247541089000057726) -->
+ <skip />
+ <string name="bluetooth_device">"zestaw głośnomówiący/słuchawkowy"</string>
+ <string name="progress_scanning">"Przeszukiwanie"</string>
+ <string name="bluetooth_notif_ticker">"Żądanie parowania Bluetooth"</string>
+ <string name="bluetooth_notif_title">"Żądanie parowania"</string>
+ <string name="bluetooth_notif_message">"Zaznacz, aby sparować "</string>
+ <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="choose_timezone">"Wybierz strefę czasową"</string>
+ <string name="display_preview_label">"Podgląd:"</string>
+ <string name="display_font_size_label">"Rozmiar czcionki:"</string>
+ <!-- no translation found for intent_sender_data_label (8363026381459131554) -->
+ <skip />
+ <string name="intent_sender_sendbroadcast_text">"Wyślij <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">"Rozpocznij <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">"Konto:"</string>
+ <string name="proxy_clear_text">"Wyczyść"</string>
+ <string name="proxy_port_label">"Port"</string>
+ <string name="proxy_defaultView_text">"Przywróć ustawienia domyślne"</string>
+ <string name="proxy_action_text">"Zapisz"</string>
+ <string name="proxy_hostname_label">"Nazwa hosta"</string>
+ <string name="proxy_error">"Uwaga"</string>
+ <string name="proxy_error_dismiss">"OK"</string>
+ <string name="proxy_error_invalid_host">"Wprowadzona nazwa hosta jest nieprawidłowa."</string>
+ <string name="proxy_error_empty_port">"Należy uzupełnić pole port."</string>
+ <string name="proxy_error_empty_host_set_port">"Pole port musi być puste, jeśli pole host jest puste."</string>
+ <string name="proxy_error_invalid_port">"Wprowadzony port jest nieprawidłowy."</string>
+ <string name="radio_info_signal_location_label">"Lokalizacja:"</string>
+ <string name="radio_info_neighboring_location_label">"Sąsiadujący CID:"</string>
+ <string name="radio_info_data_attempts_label">"Próby danych:"</string>
+ <string name="radio_info_gprs_service_label">"Usługa 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">"Przekierowania połączeń:"</string>
+ <string name="radio_info_ppp_resets_label">"Liczba operacji resetowania PPP od momentu uruchomienia:"</string>
+ <string name="radio_info_gsm_disconnects_label">"GSM rozłącza się:"</string>
+ <string name="radio_info_current_network_label">"Obecna sieć:"</string>
+ <string name="radio_info_data_successes_label">"Postępy danych:"</string>
+ <string name="radio_info_ppp_received_label">"Otrzymano PPP:"</string>
+ <string name="radio_info_gsm_service_label">"Usługa GSM:"</string>
+ <string name="radio_info_signal_strength_label">"Siła sygnału:"</string>
+ <string name="radio_info_call_status_label">"Stan połączenia:"</string>
+ <string name="radio_info_ppp_sent_label">"Wysłano PPP:"</string>
+ <string name="radio_info_radio_resets_label">"Resetowanie radia:"</string>
+ <string name="radio_info_message_waiting_label">"Wiadomość oczekująca:"</string>
+ <string name="radio_info_phone_number_label">"Numer telefonu:"</string>
+ <string name="radio_info_band_mode_label">"Wybierz pasmo radiowe"</string>
+ <string name="radio_info_network_type_label">"Typ sieci:"</string>
+ <string name="radio_info_set_perferred_label">"Ustaw preferowany typ sieci:"</string>
+ <string name="radio_info_ping_ipaddr">"Wyślij polecenie ping adresu IP:"</string>
+ <string name="radio_info_ping_hostname">"Nazwa hosta dla operacji ping (www.google.pl):"</string>
+ <string name="radio_info_http_client_test">"Test klienta HTTP:"</string>
+ <string name="radio_info_toggle_ciph_label">"Przełącz szyfrowanie"</string>
+ <string name="ping_test_label">"Przeprowadź test ping"</string>
+ <string name="radio_info_smsc_label">"SMSC:"</string>
+ <string name="radio_info_smsc_update_label">"Aktualizuj"</string>
+ <string name="radio_info_smsc_refresh_label">"Odśwież"</string>
+ <string name="radio_info_toggle_dns_check_label">"Przełącz sprawdzanie DNS"</string>
+ <string name="band_mode_title">"Ustaw pasmo GSM/UMTS"</string>
+ <string name="band_mode_loading">"Ładowanie listy pasm..."</string>
+ <string name="band_mode_set">"Ustaw"</string>
+ <string name="band_mode_failed">"Niepowodzenie"</string>
+ <string name="band_mode_succeeded">"Powodzenie"</string>
+ <string name="sdcard_changes_instructions">"Zmiany zostaną wprowadzone po ponownym podłączeniu przewodu USB"</string>
+ <string name="sdcard_settings_screen_mass_storage_text">"Włącz pamięć masową USB"</string>
+ <string name="sdcard_settings_total_bytes_label">"Łącznie bajtów:"</string>
+ <string name="sdcard_settings_not_present_status">"Brak karty SD"</string>
+ <string name="sdcard_settings_available_bytes_label">"Dostępnych bajtów:"</string>
+ <string name="sdcard_settings_mass_storage_status">"Karta SD wykorzystywana jest jako pamięć masowa"</string>
+ <string name="sdcard_settings_unmounted_status">"Można teraz bezpiecznie usunąć kartę SD"</string>
+ <string name="sdcard_settings_bad_removal_status">"Karta SD została usunięta, gdy była używana!"</string>
+ <string name="sdcard_settings_used_bytes_label">"Wykorzystanych bajtów:"</string>
+ <string name="sdcard_settings_scanning_status">"Przeszukiwanie karty SD w poszukiwaniu multimediów..."</string>
+ <string name="sdcard_settings_read_only_status">"Karta SD jest podłączona tylko do odczytu"</string>
+ <string name="next_label">"Dalej"</string>
+ <string name="language_picker_title">"Ustawienia regionalne"</string>
+ <string name="select_your_language">"Wybierz język"</string>
+ <string name="activity_picker_label">"Wybierz czynność"</string>
+ <string name="device_info_label">"Informacje o urządzeniu"</string>
+ <string name="battery_info_label">"Informacje o baterii"</string>
+ <string name="battery_history_label">"Historia baterii"</string>
+ <string name="display_label">"Wyświetlacz"</string>
+ <string name="phone_info_label">"Informacje o telefonie"</string>
+ <string name="sd_card_settings_label">"Karta SD"</string>
+ <string name="proxy_settings_label">"Ustawienia proxy"</string>
+ <string name="cancel">"Anuluj"</string>
+ <string name="settings_label">"Ustawienia"</string>
+ <string name="airplane_mode">"Tryb samolotowy"</string>
+ <string name="airplane_mode_summary">"Wyłącz wszystkie połączenia bezprzewodowe"</string>
+ <string name="airplane_mode_turning_on">"Wyłączanie połączeń bezprzewodowych..."</string>
+ <string name="airplane_mode_turning_off">"Włączanie połączeń bezprzewodowych..."</string>
+ <string name="radio_controls_title">"Opcje bezprzewodowe"</string>
+ <string name="radio_controls_summary">"Zarządzaj Wi-Fi, Bluetooth, trybem samolotowym i sieciami komórkowymi"</string>
+ <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">"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>
+ <string name="date_time_set_date">"Ustaw datę"</string>
+ <string name="date_time_date_format">"Wybierz format daty"</string>
+ <string name="zone_list_menu_sort_alphabetically">"Sortuj alfabetycznie"</string>
+ <string name="zone_list_menu_sort_by_timezone">"Sortuj według strefy czasowej"</string>
+ <string name="security_settings_title">"Położenie i zabezpieczenia"</string>
+ <string name="security_settings_summary">"Ustaw Moją lokalizację, blokadę ekranu, blokadę karty SIM"</string>
+ <string name="security_passwords_title">"Hasła"</string>
+ <string name="bluetooth_quick_toggle_title">"Bluetooth"</string>
+ <string name="bluetooth_quick_toggle_summary">"Włącz Bluetooth"</string>
+ <string name="bluetooth_settings">"Ustawienia Bluetooth"</string>
+ <string name="bluetooth_settings_title">"Ustawienia Bluetooth"</string>
+ <string name="bluetooth_settings_summary">"Zarządzaj połączeniami, ustaw nazwę urządzenia i możliwość wykrycia"</string>
+ <string name="bluetooth_pin_entry">"Żądanie parowania Bluetooth"</string>
+ <string name="bluetooth_device_info">"Informacje o urządzeniu Bluetooth"</string>
+ <string name="bluetooth_enter_pin_msg">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"\n\n"Wpisz kod PIN, aby sparować."\n"(Spróbuj użyć kodu 0000 lub 1234.)"</string>
+ <string name="bluetooth_error_title">"Uwaga"</string>
+ <string name="bluetooth_pairing_error_message">"Wystąpił problem podczas parowania z urządzeniem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_pairing_pin_error_message">"Wystąpił problem podczas parowania z urządzeniem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>. Wpisany kod PIN jest nieprawidłowy."</string>
+ <string name="bluetooth_connecting_error_message">"Wystąpił problem podczas łączenia z urządzeniem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_preference_scan_title">"Wyszukaj urządzenia"</string>
+ <string name="bluetooth_device_context_connect">"Połącz"</string>
+ <string name="bluetooth_device_context_disconnect">"Rozłącz"</string>
+ <string name="bluetooth_device_context_pair_connect">"Sparuj i połącz"</string>
+ <string name="bluetooth_device_context_unpair">"Rozłącz parę"</string>
+ <string name="bluetooth_device_context_disconnect_unpair">"Rozłącz i anuluj parowanie"</string>
+ <string name="bluetooth_device_context_connect_advanced">"Opcje…"</string>
+ <string name="bluetooth_connect_specific_profiles_title">"Połącz z siecią…"</string>
+ <string name="bluetooth_profile_a2dp">"Multimedia"</string>
+ <string name="bluetooth_profile_headset">"Telefon"</string>
+ <string name="bluetooth_summary_connected_to_a2dp">"Połączono z funkcją audio multimediów"</string>
+ <string name="bluetooth_summary_connected_to_headset">"Połączono z funkcją audio telefonu"</string>
+ <string name="bluetooth_summary_connected_to_a2dp_headset">"Połączono z funkcją audio telefonu i multimediów"</string>
+ <string name="bluetooth_device_advanced_title">"Opcje urządzenia <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_device_advanced_online_mode_title">"Połącz"</string>
+ <string name="bluetooth_device_advanced_online_mode_summary">"Połącz z urządzeniem Bluetooth"</string>
+ <string name="bluetooth_device_advanced_profile_header_title">"Profile"</string>
+ <string name="bluetooth_a2dp_profile_summary_connected">"Połączono z funkcją audio multimediów"</string>
+ <string name="bluetooth_headset_profile_summary_connected">"Połączono z funkcją audio telefonu"</string>
+ <string name="bluetooth_a2dp_profile_summary_use_for">"Użyj dla funkcji audio multimediów"</string>
+ <string name="bluetooth_headset_profile_summary_use_for">"Użyj dla funkcji audio telefonu"</string>
+ <string name="wifi">"Wi-Fi"</string>
+ <string name="wifi_quick_toggle_title">"Wi-Fi"</string>
+ <string name="wifi_quick_toggle_summary">"Włącz Wi-Fi"</string>
+ <string name="wifi_settings">"Ustawienia Wi-Fi"</string>
+ <string name="wifi_settings_category">"Ustawienia Wi-Fi"</string>
+ <string name="wifi_settings_summary">"Konfiguracja i zarządzanie punktami dostępowymi sieci bezprzewodowej"</string>
+ <string name="forget_network">"Zapomnij"</string>
+ <string name="wifi_status">"Stan"</string>
+ <string name="wifi_link_speed">"Prędkość"</string>
+ <string name="wifi_signal_3">"Doskonała"</string>
+ <string name="wifi_signal_2">"Dobra"</string>
+ <string name="wifi_signal_1">"Dostateczna"</string>
+ <string name="wifi_signal_0">"Słaba"</string>
+ <string name="security">"Zabezpieczenia"</string>
+ <string name="wifi_security_open">"Otwarta"</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">"Nieznane"</string>
+ <string name="wifi_security_verbose_open">"Sieć otwarta"</string>
+ <string name="wifi_security_verbose_wep">"Zabezpieczona za pomocą WEP"</string>
+ <string name="wifi_security_verbose_wpa">"Zabezpieczona za pomocą WPA"</string>
+ <string name="wifi_security_verbose_wpa2">"Zabezpieczona za pomocą WPA2"</string>
+ <string name="ip_address">"Adres IP"</string>
+ <string name="signal">"Siła sygnału"</string>
+ <string name="wifi_starting">"Włączanie..."</string>
+ <string name="wifi_stopping">"Wyłączanie..."</string>
+ <string name="wifi_error">"Błąd"</string>
+ <string name="error_starting">"Nie można uruchomić Wi-Fi"</string>
+ <string name="error_stopping">"Nie można zatrzymać działania Wi-Fi"</string>
+ <string name="error_scanning">"Nie można wyszukać sieci"</string>
+ <string name="error_connecting">"Nie można połączyć z siecią"</string>
+ <string name="error_saving">"Nie można zapisać sieci"</string>
+ <string name="connect">"Połącz"</string>
+ <string name="connect_to_blank">"Połącz z siecią <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+ <string name="please_type_passphrase">"Hasło sieci bezprzewodowej"</string>
+ <string name="please_type_hex_key">"Klucz szesnastkowy WEP (0–9, A–F)"</string>
+ <string name="wifi_show_password">"Pokaż hasło."</string>
+ <string name="scan_wifi">"Przeszukaj"</string>
+ <string name="summary_not_in_range">"Poza zasięgiem"</string>
+ <string name="summary_remembered">"Zapamiętane"</string>
+ <string name="summary_connection_failed">"Połączenie nieudane. Wybierz, aby spróbować ponownie"</string>
+ <string name="wifi_access_points">"Sieci Wi-Fi"</string>
+ <string name="wifi_type_ssid">"Identyfikator SSID sieci"</string>
+ <string name="wifi_security">"Zabezpieczenia"</string>
+ <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 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>
+ <string name="wifi_menu_advanced">"Zaawansowane"</string>
+ <string name="wifi_ip_settings_titlebar">"Ustawienia IP"</string>
+ <string name="wifi_ip_settings_menu_save">"Zapisz"</string>
+ <string name="wifi_ip_settings_menu_cancel">"Anuluj"</string>
+ <string name="wifi_ip_settings_invalid_ip">"Wprowadź poprawny adres IP."</string>
+ <string name="wifi_use_static_ip">"Statyczny adres IP"</string>
+ <string name="wifi_ip_address">"Adres IP"</string>
+ <string name="wifi_dns1">"DNS 1"</string>
+ <string name="wifi_dns2">"DNS 2"</string>
+ <string name="wifi_gateway">"Brama"</string>
+ <string name="wifi_netmask">"Maska sieci"</string>
+ <string name="wifi_context_menu_connect">"Połącz z siecią"</string>
+ <string name="wifi_context_menu_forget">"Zapomnij sieć"</string>
+ <string name="wifi_context_menu_change_password">"Zmień hasło"</string>
+ <string name="wifi_advanced_titlebar">"Zaawansowane"</string>
+ <string name="wifi_setting_num_channels_title">"Domena standaryzacyjna"</string>
+ <string name="wifi_setting_num_channels_summary">"Wybierz liczbę wykorzystywanych kanałów"</string>
+ <string name="wifi_setting_num_channels_error">"Wystąpił problem podczas ustawiania domeny standaryzacyjnej."</string>
+ <string name="wifi_setting_num_channels_channel_phrase">"<xliff:g id="NUM_CHANNELS">%1$d</xliff:g> kanałów"</string>
+ <string name="wifi_setting_sleep_policy_title">"Zasady usypiania Wi-Fi"</string>
+ <string name="wifi_setting_sleep_policy_summary">"Określ, kiedy przełączyć Wi-Fi na komórkowe połączenie danych"</string>
+ <string name="wifi_setting_sleep_policy_error">"Wystąpił problem podczas ustawiania zasad usypiania."</string>
+ <string name="wifi_advanced_mac_address_title">"Adres MAC"</string>
+ <string name="fragment_status_scanning">"Przeszukiwanie..."</string>
+ <string name="fragment_status_connecting">"Łączenie z <xliff:g id="NETWORK_NAME">%1$s</xliff:g>..."</string>
+ <string name="fragment_status_authenticating">"Uwierzytelnianie w sieci <xliff:g id="NETWORK_NAME">%1$s</xliff:g>..."</string>
+ <string name="fragment_status_obtaining_ip">"Pozyskiwanie adresu IP od <xliff:g id="NETWORK_NAME">%1$s</xliff:g>..."</string>
+ <string name="fragment_status_connected">"Połączony z <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+ <string name="fragment_status_disconnecting">"Rozłączanie z <xliff:g id="NETWORK_NAME">%1$s</xliff:g>..."</string>
+ <string name="fragment_status_disconnected">"Rozłączona"</string>
+ <string name="fragment_status_failed">"Niepowodzenie"</string>
+ <string name="status_scanning">"Przeszukiwanie..."</string>
+ <string name="status_connecting">"Łączenie..."</string>
+ <string name="status_authenticating">"Uwierzytelnianie..."</string>
+ <string name="status_obtaining_ip">"Pozyskiwanie adresu..."</string>
+ <string name="status_connected">"Połączony"</string>
+ <string name="status_disconnecting">"Rozłączanie..."</string>
+ <string name="status_disconnected">"Rozłączona"</string>
+ <string name="status_failed">"Niepowodzenie"</string>
+ <string name="sound_and_display_settings">"Dźwięk i wyświetlacz"</string>
+ <string name="sound_settings">"Ustawienia dźwięku"</string>
+ <string name="sound_and_display_settings_summary">"Ustaw dzwonki, powiadomienia, jasność ekranu"</string>
+ <string name="silent_mode_title">"Tryb cichy"</string>
+ <string name="silent_mode_summary">"Wszystkie dźwięki oprócz multimediów i alarmów są wyciszone"</string>
+ <string name="ringtone_title">"Dzwonek telefonu"</string>
+ <string name="ringtone_summary">"Ustaw domyślny dzwonek dla połączeń przychodzących"</string>
+ <string name="ring_volume_title">"Głośność dzwonka"</string>
+ <string name="ring_volume_summary">"Ustaw głośność połączeń przychodzących i powiadomień"</string>
+ <string name="vibrate_title">"Wibracje telefonu"</string>
+ <string name="vibrate_summary">"Wibracje telefonu przy połączeniach przychodzących"</string>
+ <string name="notification_sound_title">"Powiadomienia"</string>
+ <string name="notification_sound_summary">"Ustaw domyślny dzwonek dla powiadomień"</string>
+ <string name="incoming_call_volume_title">"Głośność połączeń przychodzących"</string>
+ <string name="notification_volume_title">"Głośność powiadomienia"</string>
+ <string name="checkbox_notification_same_as_incoming_call">"Użyj głośności połączeń przychodzących dla powiadomień"</string>
+ <string name="notification_sound_dialog_title">"Wybierz dzwonek powiadomienia"</string>
+ <string name="media_volume_title">"Głośność multimediów"</string>
+ <string name="media_volume_summary">"Ustaw głośność muzyki oraz filmów wideo"</string>
+ <string name="dtmf_tone_enable_title">"Wybieranie numeru"</string>
+ <string name="dtmf_tone_enable_summary_on">"Odtwarzaj dźwięki podczas używania panelu wybierania numeru"</string>
+ <string name="dtmf_tone_enable_summary_off">"Odtwarzaj dźwięki podczas wybierania numeru"</string>
+ <string name="sound_effects_enable_title">"Dotyk ekranu"</string>
+ <string name="sound_effects_enable_summary_on">"Odtwarzaj dźwięk podczas wybierania opcji na ekranie"</string>
+ <string name="sound_effects_enable_summary_off">"Odtwarzaj dźwięk podczas wybierania opcji na ekranie"</string>
+ <string name="play_media_notification_sounds_enable_title">"Powiadomienia karty SD"</string>
+ <string name="play_media_notification_sounds_enable_summary_on">"Wyłącz dźwięki powiadomień dla karty SD"</string>
+ <string name="play_media_notification_sounds_enable_summary_off">"Włącz dźwięki powiadomień dla karty SD"</string>
+ <string name="sync_settings">"Synchronizacja danych"</string>
+ <string name="sync_settings_summary">"Wybierz, które aplikacje są synchronizowane"</string>
+ <string name="display_settings">"Ustawienia wyświetlacza"</string>
+ <string name="animations_title">"Animacja"</string>
+ <string name="animations_summary_on">"Pokazuj animację podczas otwierania i zamykania okien"</string>
+ <string name="animations_summary_off">"Pokazuj animację podczas otwierania i zamykania okien"</string>
+ <string name="brightness">"Jasność ekranu"</string>
+ <string name="brightness_summary">"Dostosuj jasność ekranu"</string>
+ <string name="screen_timeout">"Wygaszanie ekranu"</string>
+ <string name="screen_timeout_summary">"Dostosuj opóźnienie automatycznego wyłączenia ekranu"</string>
+ <string name="sim_lock_settings">"Ustawienia blokady karty SIM"</string>
+ <string name="sim_lock_settings_category">"Ustaw blokadę SIM"</string>
+ <string name="sim_lock_settings_title">"Blokada karty SIM"</string>
+ <string name="sim_pin_toggle">"Zablokuj kartę SIM"</string>
+ <string name="sim_lock_on">"Aby korzystać z telefonu, należy wprowadzić kod PIN"</string>
+ <string name="sim_lock_off">"Aby korzystać z telefonu, należy wprowadzić kod PIN"</string>
+ <string name="sim_pin_change">"Zmień kod PIN do karty SIM"</string>
+ <string name="sim_enter_pin">"Kod PIN do karty SIM"</string>
+ <string name="sim_enable_sim_lock">"Zablokuj kartę SIM"</string>
+ <string name="sim_disable_sim_lock">"Odblokuj kartę SIM"</string>
+ <string name="sim_enter_old">"Stary kod PIN do karty SIM"</string>
+ <string name="sim_enter_new">"Nowy kod PIN do karty SIM"</string>
+ <string name="sim_reenter_new">"Wpisz ponownie nowy kod PIN"</string>
+ <string name="sim_change_pin">"Kod PIN do karty SIM"</string>
+ <string name="sim_bad_pin">"Nieprawidłowy kod PIN!"</string>
+ <string name="sim_pins_dont_match">"Kody PIN nie pasują do siebie!"</string>
+ <string name="sim_change_failed">"Nie można zmienić kodu PIN."\n"Prawdopodobnie błędny kod PIN."</string>
+ <string name="sim_change_succeeded">"Kod PIN do karty SIM został pomyślnie zmieniony"</string>
+ <string name="sim_lock_failed">"Nie można zmienić stanu blokady karty SIM."\n"Prawdopodobnie zły kod PIN."</string>
+ <string name="sim_enter_ok">"OK"</string>
+ <string name="sim_enter_cancel">"Anuluj"</string>
+ <string name="device_info_settings">"Stan telefonu"</string>
+ <string name="system_update_settings_list_item_title">"Aktualizacje systemowe"</string>
+ <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">"Pasmo podstawowe"</string>
+ <string name="kernel_version">"Wersja jądra"</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>
+ <string name="device_status_summary">"IMEI, numer telefonu, sygnał itp."</string>
+ <string name="storage_settings_title">"Karta SD i pamięć telefonu"</string>
+ <string name="storage_settings_summary">"Odłącz kartę SD, pokaż ilość dostępnej pamięci"</string>
+ <string name="status_number">"Numer telefonu"</string>
+ <string name="status_network_type">"Typ sieci komórkowej"</string>
+ <string name="status_data_state">"Stan sieci komórkowej"</string>
+ <string name="status_service_state">"Stan usługi"</string>
+ <string name="status_signal_strength">"Siła sygnału"</string>
+ <string name="status_roaming">"Roaming"</string>
+ <string name="status_operator">"Sieć"</string>
+ <string name="status_wifi_mac_address">"Adres MAC karty Wi-Fi"</string>
+ <string name="status_bt_address">"Adres Bluetooth"</string>
+ <string name="status_unavailable">"Niedostępny"</string>
+ <string name="status_network_traffic_stats">"Wykorzystanie sieci"</string>
+ <string name="status_network_traffic_summary">"Wysłane: <xliff:g id="NETWORK_TRAFFIC_0">%1$d packets, %2$d bytes%n</xliff:g>Odebrane: <xliff:g id="NETWORK_TRAFFIC_1">%3$d packets, %4$d bytes</xliff:g>"</string>
+ <string name="status_up_time">"Czas działania"</string>
+ <string name="status_awake_time">"Czas działania (włączony)"</string>
+ <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">"Łą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>
+ <string name="read_only">" (Tylko do odczytu)"</string>
+ <string name="battery_status_title">"Stan baterii"</string>
+ <string name="battery_level_title">"Poziom naładowania baterii"</string>
+ <string name="apn_settings">"Nazwy APN"</string>
+ <string name="apn_edit">"Edytuj punkt dostępowy"</string>
+ <string name="apn_not_set">"&lt;Nie ustawione&gt;"</string>
+ <string name="apn_name">"Nazwa"</string>
+ <string name="apn_apn">"APN"</string>
+ <string name="apn_http_proxy">"Proxy"</string>
+ <string name="apn_http_port">"Port"</string>
+ <string name="apn_user">"Nazwa użytkownika"</string>
+ <string name="apn_password">"Hasło"</string>
+ <string name="apn_server">"Serwer"</string>
+ <string name="apn_mmsc">"MMSC"</string>
+ <string name="apn_mms_proxy">"Proxy dla wiadomości MMS"</string>
+ <string name="apn_mms_port">"Port MMS"</string>
+ <string name="apn_mcc">"MCC"</string>
+ <string name="apn_mnc">"MNC"</string>
+ <string name="apn_type">"Typ APN"</string>
+ <string name="menu_delete">"Usuń APN"</string>
+ <string name="menu_new">"Nowa nazwa APN"</string>
+ <string name="menu_save">"Zapisz"</string>
+ <string name="menu_cancel">"Odrzuć"</string>
+ <string name="error_title">"Uwaga"</string>
+ <string name="error_name_empty">"Pole Nazwa nie może być puste"</string>
+ <string name="error_apn_empty">"Pole APN nie może być puste."</string>
+ <string name="error_mcc_not3">"Pole MMC musi zawierać 3 cyfry."</string>
+ <string name="error_mnc_not23">"Pole MNC musi zawierać 2 lub 3 cyfry."</string>
+ <string name="master_clear_title">"Ustawienia fabryczne"</string>
+ <string name="master_clear_summary">"Wymazuje wszystkie dane w telefonie"</string>
+ <string name="master_clear_desc">"Ta czynność spowoduje przywrócenie w telefonie ustawień fabrycznych i wymazanie wszystkich danych oraz pobranych aplikacji!"</string>
+ <string name="master_clear_button_text">"Resetuj telefon"</string>
+ <string name="master_clear_final_desc">"Zresetować telefon, wymazując wszystkie dane i aplikacje? Działania nie można cofnąć!"</string>
+ <string name="master_clear_final_button_text">"Wymaż wszystko"</string>
+ <string name="master_clear_gesture_prompt">"Narysuj wzór odblokowania"</string>
+ <string name="master_clear_gesture_explanation">"Aby potwierdzić resetowanie telefonu, musisz narysować swój wzór odblokowania."</string>
+ <string name="master_clear_failed">"Nie wykonano resetowania, ponieważ usługa czyszczenia systemu nie jest dostępna."</string>
+ <string name="media_format_title">"Formatuj kartę SD."</string>
+ <string name="media_format_summary">"Wymazuje wszystkie dane z karty SD"</string>
+ <string name="media_format_desc">"Ta akcja spowoduje wymazanie danych z karty SD w telefonie. WSZYSTKIE dane na karcie zostaną utracone."</string>
+ <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 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 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_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="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>
+ <string name="contributors_title">"Współautorzy"</string>
+ <string name="copyright_title">"Prawa autorskie"</string>
+ <string name="license_title">"Licencja"</string>
+ <string name="terms_title">"Warunki i zasady korzystania"</string>
+ <string name="settings_license_activity_title">"Licencje open source"</string>
+ <string name="settings_license_activity_unavailable">"Wystąpił problem podczas ładowania licencji."</string>
+ <string name="settings_license_activity_loading">"Ładowanie..."</string>
+ <string name="lock_settings_title">"Wzór odblokowania ekranu"</string>
+ <string name="lockpattern_change_lock_pattern_label">"Zmień wzór odblokowania"</string>
+ <string name="lockpattern_need_to_unlock">"Potwierdź zapisany wzór"</string>
+ <string name="lockpattern_need_to_unlock_wrong">"Niestety, spróbuj ponownie:"</string>
+ <string name="lockpattern_recording_intro_header">"Narysuj wzór odblokowania"</string>
+ <string name="lockpattern_recording_intro_footer">"Naciśnij Menu, aby uzyskać pomoc."</string>
+ <string name="lockpattern_recording_inprogress">"Puść palec, gdy gotowe."</string>
+ <string name="lockpattern_recording_incorrect_too_short">"Połącz co najmniej <xliff:g id="NUMBER">%d</xliff:g> punktów. Spróbuj jeszcze raz:"</string>
+ <string name="lockpattern_pattern_entered_header">"Wzór został nagrany!"</string>
+ <string name="lockpattern_need_to_confirm">"Narysuj wzór ponownie, aby potwierdzić:"</string>
+ <string name="lockpattern_pattern_confirmed_header">"Nowy wzór odblokowania:"</string>
+ <string name="lockpattern_confirm_button_text">"Potwierdź"</string>
+ <string name="lockpattern_restart_button_text">"Narysuj ponownie"</string>
+ <string name="lockpattern_retry_button_text">"Ponów próbę"</string>
+ <string name="lockpattern_continue_button_text">"Dalej"</string>
+ <string name="lockpattern_settings_title">"Wzór odblokowania"</string>
+ <string name="lockpattern_settings_enable_title">"Wymagaj wzoru"</string>
+ <string name="lockpattern_settings_enable_summary">"Trzeba narysować wzór, aby odblokować ekran"</string>
+ <string name="lockpattern_settings_enable_visible_pattern_title">"Wzór jest widoczny"</string>
+ <string name="lockpattern_settings_enable_tactile_feedback_title">"Wibracje przy rysowaniu"</string>
+ <string name="lockpattern_settings_choose_lock_pattern">"Ustaw wzór odblokowania"</string>
+ <string name="lockpattern_settings_change_lock_pattern">"Zmień wzór odblokowania"</string>
+ <string name="lockpattern_settings_help_how_to_record">"Jak narysować wzór odblokowania"</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_header">"Zbyt wiele nieudanych prób!"</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_footer">"Spróbuj ponownie za <xliff:g id="NUMBER">%d</xliff:g> sekund."</string>
+ <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 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>
+ <string name="manageapplications_settings_summary">"Zarządzaj zainstalowanymi aplikacjami oraz usuwaj je"</string>
+ <string name="applications_settings">"Aplikacje"</string>
+ <string name="applications_settings_summary">"Zarządzaj aplikacjami, skonfiguruj skróty szybkiego uruchamiania"</string>
+ <string name="applications_settings_header">"Ustawienia aplikacji"</string>
+ <string name="install_applications">"Nieznane źródła"</string>
+ <string name="install_unknown_applications">"Pozwól na instalowanie aplikacji spoza Android Market"</string>
+ <string name="install_all_warning">"Telefon i dane osobiste są bardziej narażone na atak za pomocą aplikacji z nieznanych źródeł. Zgadzasz się ponieść pełną odpowiedzialność za wszelkie uszkodzenia telefonu oraz utratę danych, które mogą wyniknąć ze stosowania tych aplikacji."</string>
+ <string name="application_info_label">"Informacje o aplikacji"</string>
+ <string name="storage_label">"Pamięć"</string>
+ <string name="auto_launch_label">"Uruchom domyślnie"</string>
+ <string name="permissions_label">"Uprawnienia"</string>
+ <string name="cache_header_label">"Pamięć podręczna"</string>
+ <string name="clear_cache_btn_text">"Wyczyść pamięć podręczną"</string>
+ <string name="cache_size_label">"Pamięć podręczna"</string>
+ <string name="controls_label">"Elementy sterujące"</string>
+ <string name="force_stop">"Wymuś zatrzymanie"</string>
+ <string name="total_size_label">"Razem"</string>
+ <string name="application_size_label">"Aplikacja"</string>
+ <string name="data_size_label">"Dane"</string>
+ <string name="uninstall_text">"Odinstaluj"</string>
+ <string name="clear_user_data_text">"Wyczyść dane"</string>
+ <string name="auto_launch_enable_text">"Wybrano domyślne uruchamianie tej aplikacji dla niektórych czynności."</string>
+ <string name="auto_launch_disable_text">"Brak ustawień domyślnych."</string>
+ <string name="clear_activities">"Wyczyść domyślne"</string>
+ <string name="unknown">"Nieznana"</string>
+ <string name="sort_order_alpha">"Sortuj"</string>
+ <string name="sort_order_size">"Sortuj według rozmiaru"</string>
+ <string name="manage_space_text">"Zarządzaj rozmiarem"</string>
+ <string name="filter">"Filtr"</string>
+ <string name="filter_dlg_title">"Wybierz opcje filtru"</string>
+ <string name="filter_apps_all">"Wszystkie"</string>
+ <string name="filter_apps_third_party">"Inne firmy"</string>
+ <string name="filter_apps_running">"Uruchomione"</string>
+ <string name="loading">"Ładowanie..."</string>
+ <string name="recompute_size">"Przeliczanie rozmiaru..."</string>
+ <string name="clear_data_dlg_title">"Usuń"</string>
+ <string name="clear_data_dlg_text">"Wszystkie informacje zapisane w tej aplikacji zostaną na stałe usunięte."</string>
+ <string name="dlg_ok">"OK"</string>
+ <string name="dlg_cancel">"Anuluj"</string>
+ <string name="app_not_found_dlg_title">"Nie znaleziono aplikacji"</string>
+ <string name="app_not_found_dlg_text">"Program nie został znaleziony na liście zainstalowanych aplikacji."</string>
+ <string name="clear_data_failed">"Nie można wyczyścić danych aplikacji."</string>
+ <string name="security_settings_desc">"Ta aplikacja ma dostęp do następujących funkcji telefonu:"</string>
+ <string name="computing_size">"Przetwarzanie..."</string>
+ <string name="invalid_size_value">"Nie można obliczyć rozmiaru pakietu"</string>
+ <string name="empty_list_msg">"Nie zainstalowano żadnych aplikacji innych firm."</string>
+ <string name="language_settings">"Regionalne i język"</string>
+ <string name="language_settings_summary">"Określ ustawienia regionalne (język i region) oraz opcje wprowadzania tekstu i autokorekty"</string>
+ <string name="language_category">"Ustawienia regionalne"</string>
+ <string name="text_category">"Ustawienia tekstu"</string>
+ <string name="phone_language">"Wybierz język"</string>
+ <string name="phone_language_summary">"Wybierz język i region"</string>
+ <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">"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 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="user_dict_settings_titlebar">"Słownik użytkownika"</string>
+ <string name="user_dict_settings_title">"Słownik użytkownika"</string>
+ <string name="user_dict_settings_summary">"Dodaj i usuń słowa w słowniku użytkownika"</string>
+ <string name="user_dict_settings_add_menu_title">"Dodaj"</string>
+ <string name="user_dict_settings_add_dialog_title">"Dodaj do słownika"</string>
+ <string name="user_dict_settings_context_menu_edit_title">"Edytuj"</string>
+ <string name="user_dict_settings_context_menu_delete_title">"Usuń"</string>
+ <string name="user_dict_settings_empty_text">"Nie masz żadnych słów w słowniku użytkownika. Możesz dodać słowo poprzez menu."</string>
+ <string name="testing">"Testowanie"</string>
+ <string name="testing_phone_info">"Informacje o telefonie"</string>
+ <string name="testing_battery_info">"Informacje o baterii"</string>
+ <string name="testing_battery_history">"Historia baterii"</string>
+ <string name="quick_launch_title">"Szybkie uruchamianie"</string>
+ <string name="quick_launch_summary">"Ustaw skróty klawiaturowe, aby uruchamiać aplikacje"</string>
+ <string name="quick_launch_assign_application">"Przypisz aplikację"</string>
+ <string name="quick_launch_no_shortcut">"Brak skrótu"</string>
+ <string name="quick_launch_shortcut">"Szukaj + <xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g>"</string>
+ <string name="quick_launch_clear_dialog_title">"Wyczyść"</string>
+ <string name="quick_launch_clear_dialog_message">"Skrót do <xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g> (<xliff:g id="APPLICATION_NAME">%2$s</xliff:g>) zostanie usunięty."</string>
+ <string name="quick_launch_clear_ok_button">"OK"</string>
+ <string name="quick_launch_clear_cancel_button">"Anuluj"</string>
+ <string name="quick_launch_display_mode_applications">"Aplikacje"</string>
+ <string name="quick_launch_display_mode_shortcuts">"Skróty"</string>
+ <string name="input_methods_settings_title">"Wprowadzanie tekstu"</string>
+ <string name="input_methods_settings_summary">"Zarządzaj opcjami wprowadzania tekstu"</string>
+ <string name="input_methods_settings_label_format">"%s – ustawienia"</string>
+ <string name="development_settings_title">"Programowanie"</string>
+ <string name="development_settings_summary">"Ustaw opcje związane z programowaniem aplikacji"</string>
+ <string name="enable_adb">"Debugowanie USB"</string>
+ <string name="enable_adb_summary">"Tryb debugowania, gdy podłączone jest USB"</string>
+ <string name="keep_screen_on">"Zostaw włączony"</string>
+ <string name="keep_screen_on_summary">"Ekran nigdy nie będzie gaszony podczas ładowania"</string>
+ <string name="allow_mock_location">"Pozorowanie położenia"</string>
+ <string name="allow_mock_location_summary">"Zezwalaj na pozorowane położenia"</string>
+ <!-- no translation found for gadget_picker_title (98374951396755811) -->
+ <skip />
+ <!-- no translation found for widget_picker_title (9130684134213467557) -->
+ <skip />
+ <string name="battery_history_details_for">"Szczegóły dla identyfikatora UID %d"</string>
+ <string name="battery_history_uid">"Identyfikator UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
+ <string name="battery_history_network_usage">"Szczegóły wykorzystania sieci dla <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
+ <string name="battery_history_bytes_received">"Odebranych bajtów: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_sent">"Wysłanych bajtów: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_total">"Łącznie bajtów: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_cpu_usage">"Szczegóły wykorzystania procesora dla <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
+ <string name="battery_history_user_time">"Czas użytkownika:"</string>
+ <string name="battery_history_system_time">"Czas systemu:"</string>
+ <string name="battery_history_total_time">"Łączny czas:"</string>
+ <string name="battery_history_starts">"Uruchomień: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
+ <string name="battery_history_days">"<xliff:g id="DAYS">%1$d</xliff:g> dni, <xliff:g id="HOURS">%2$d</xliff:g> godz., <xliff:g id="MINUTES">%3$d</xliff:g> min, <xliff:g id="SECONDS">%4$d</xliff:g> sek."</string>
+ <string name="battery_history_hours">"<xliff:g id="HOURS">%1$d</xliff:g> godz., <xliff:g id="MINUTES">%2$d</xliff:g> min, <xliff:g id="SECONDS">%3$d</xliff:g> sek."</string>
+ <string name="battery_history_minutes">"<xliff:g id="MINUTES">%1$d</xliff:g> min, <xliff:g id="SECONDS">%2$d</xliff:g> sek."</string>
+ <string name="battery_history_seconds">"<xliff:g id="SECONDS">%1$d</xliff:g> sek."</string>
+ <string name="battery_history_packages_sharing_this_uid">"Pakiety współdzielące ten identyfikator UID:"</string>
+ <string name="battery_history_no_data">"Brak danych o użyciu baterii"</string>
+ <string name="battery_history_sensor">"Czujnik:"</string>
+ <!-- no translation found for battery_history_wakelock (608683447522396293) -->
+ <skip />
+ <string name="battery_history_used_by_packages">"Czujnik używany przez pakiety:"</string>
+ <string name="battery_history_sensor_usage">"Używane <xliff:g id="COUNT">%1$d</xliff:g> raz(y) przez <xliff:g id="PACKAGE">%2$s</xliff:g>"</string>
+ <string name="battery_history_sensor_usage_multi">"Używane <xliff:g id="COUNT">%1$d</xliff:g> raz(y) przez:"</string>
+ <!-- no translation found for battery_history_awake_label (8449792868990080882) -->
+ <skip />
+ <!-- no translation found for battery_history_screen_on_label (1848936521786339362) -->
+ <skip />
+ <!-- no translation found for battery_history_phone_on_label (700191958853142297) -->
+ <skip />
+ <!-- no translation found for battery_history_awake (4350886665719031057) -->
+ <skip />
+ <string name="battery_history_screen_on">"Czas pracy z włączonym ekranem:"</string>
+ <!-- no translation found for battery_history_phone_on (4891504401623839532) -->
+ <skip />
+ <string name="battery_history_screen_on_battery">"Praca na baterii:"</string>
+ <string name="battery_history_screen_on_plugged">"Podłączone:"</string>
+ <string name="usage_stats_label">"Statystyki użycia"</string>
+ <string name="testing_usage_stats">"Statystyki użycia"</string>
+ <string name="display_order_text">"Sortuj wg:"</string>
+ <string name="app_name_label">"Aplikacja"</string>
+ <string name="launch_count_label">"Licznik"</string>
+ <string name="usage_time_label">"Czas użycia"</string>
+</resources>
diff --git a/res/values-ru-nokeys/strings.xml b/res/values-ru-nokeys/strings.xml
new file mode 100644
index 0000000..3ec9126
--- /dev/null
+++ b/res/values-ru-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">"Управлять приложениями"</string>
+</resources>
diff --git a/res/values-ru/arrays.xml b/res/values-ru/arrays.xml
new file mode 100644
index 0000000..f9afd8e
--- /dev/null
+++ b/res/values-ru/arrays.xml
@@ -0,0 +1,72 @@
+<?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>"Америка"</item>
+ <item>"Европа"</item>
+ <item>"Африка"</item>
+ <item>"Азия"</item>
+ <item>"Австралия"</item>
+ <item>"Тихий океан"</item>
+ <item>"Все"</item>
+ </string-array>
+ <string-array name="screen_timeout_entries">
+ <item>"15 секунд"</item>
+ <item>"30 секунд"</item>
+ <item>"1 минута"</item>
+ <item>"2 минуты"</item>
+ <item>"10 минут"</item>
+ <item>"Не выключать"</item>
+ </string-array>
+ <string-array name="wifi_security_entries">
+ <item>"Автоматически"</item>
+ <item>"Нет"</item>
+ <item>"WEP"</item>
+ <item>"WPA Personal"</item>
+ <item>"WPA2 Personal"</item>
+ </string-array>
+ <string-array name="wifi_security_without_auto_entries">
+ <item>"Нет"</item>
+ <item>"WEP"</item>
+ <item>"WPA Personal"</item>
+ <item>"WPA2 Personal"</item>
+ </string-array>
+ <string-array name="wifi_wep_type">
+ <item>"Автоматически"</item>
+ <item>"WEP ASCII"</item>
+ <item>"Шестнадцатеричный WEP"</item>
+ </string-array>
+ <string-array name="wifi_sleep_policy_entries">
+ <item>"При выключении экрана"</item>
+ <item>"Никогда, если устройство подключено к сети питания"</item>
+ <item>"Никогда"</item>
+ </string-array>
+ <!-- no translation found for battery_history_type_spinner:0 (2193799199027871385) -->
+ <!-- no translation found for battery_history_type_spinner:1 (6401018715947316517) -->
+ <!-- no translation found for battery_history_type_spinner:2 (188092590354892392) -->
+ <!-- no translation found for battery_history_type_spinner:3 (8414109131222049141) -->
+ <!-- no translation found for battery_history_type_spinner:4 (1327904325081257093) -->
+ <!-- no translation found for battery_history_type_spinner:5 (4832254146664706277) -->
+ <!-- no translation found for battery_history_which_spinner:0 (3451981114763440074) -->
+ <!-- no translation found for battery_history_which_spinner:1 (166936313535197598) -->
+ <!-- no translation found for battery_history_which_spinner:2 (4793941382744963893) -->
+ <string-array name="usage_stats_display_order_types">
+ <item>"Время использования"</item>
+ <item>"Начать подсчет"</item>
+ <item>"Название приложения"</item>
+ </string-array>
+</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
new file mode 100644
index 0000000..0a80622
--- /dev/null
+++ b/res/values-ru/strings.xml
@@ -0,0 +1,672 @@
+<?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">"Неизвестно"</string>
+ <string name="turn_on_radio">"Включить радиосвязь"</string>
+ <string name="turn_off_radio">"Отключить радиосвязь"</string>
+ <string name="turn_on_qxdm">"Включить журнал QXDM SD"</string>
+ <string name="turn_off_qxdm">"Отключить журнал QXDM SD"</string>
+ <string name="radioInfo_menu_viewADN">"Просмотреть адресную книгу SIM-карты"</string>
+ <string name="radioInfo_menu_viewFDN">"Просмотр номеров с фиксированным набором"</string>
+ <string name="radioInfo_menu_viewSDN">"Просмотр служебных номеров"</string>
+ <string name="radioInfo_menu_getPDP">"Получить список PDP"</string>
+ <string name="radioInfo_menu_enableData">"Разрешить подключение для передачи данных"</string>
+ <string name="radioInfo_menu_disableData">"Выключить подключение к данным"</string>
+ <string name="radioInfo_menu_enableDataOnBoot">"Включить данные при загрузке"</string>
+ <string name="radioInfo_menu_disableDataOnBoot">"Отключить данные при загрузке"</string>
+ <string name="radioInfo_service_in">"В зоне обслуживания"</string>
+ <string name="radioInfo_service_out">"Вне зоны обслуживания"</string>
+ <string name="radioInfo_service_emergency">"Только экстренные вызовы"</string>
+ <string name="radioInfo_service_off">"Радиосвязь отключена"</string>
+ <string name="radioInfo_roaming_in">"Роуминг"</string>
+ <string name="radioInfo_roaming_not">"Не в роуминге"</string>
+ <string name="radioInfo_phone_idle">"Ожидание"</string>
+ <string name="radioInfo_phone_ringing">"Звонок"</string>
+ <string name="radioInfo_phone_offhook">"Вызов выполняется"</string>
+ <string name="radioInfo_data_disconnected">"Отключено"</string>
+ <string name="radioInfo_data_connecting">"Подключение"</string>
+ <string name="radioInfo_data_connected">"Подключено"</string>
+ <string name="radioInfo_data_suspended">"Приостановлено"</string>
+ <string name="radioInfo_unknown">"неизвестно"</string>
+ <string name="radioInfo_display_packets">"пак."</string>
+ <string name="radioInfo_display_bytes">"байт"</string>
+ <string name="radioInfo_display_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">"Отключиться от карты SD"</string>
+ <string name="sdcard_format">"Форматировать карту SD"</string>
+ <string name="small_font">"Мелкий"</string>
+ <string name="medium_font">"Средний"</string>
+ <string name="large_font">"Крупный"</string>
+ <string name="font_size_save">"ОК"</string>
+ <string name="sdcard_setting">"Карта SD"</string>
+ <string name="battery_info_status_label">"Состояние батареи:"</string>
+ <string name="battery_info_scale_label">"Шкала батареи:"</string>
+ <string name="battery_info_level_label">"Уровень заряда батареи:"</string>
+ <string name="battery_info_health_label">"Состояние батареи:"</string>
+ <string name="battery_info_technology_label">"Технология батареи:"</string>
+ <string name="battery_info_voltage_label">"Напряжение батареи:"</string>
+ <string name="battery_info_voltage_units">"мВ"</string>
+ <string name="battery_info_temperature_label">"Температура батареи:"</string>
+ <string name="battery_info_temperature_units">"° C"</string>
+ <string name="battery_info_uptime">"Время с момента загрузки:"</string>
+ <string name="battery_info_awake_battery">"Время действия от батареи:"</string>
+ <string name="battery_info_awake_plugged">"Время активности при зарядке:"</string>
+ <string name="battery_info_screen_on">"Время включения экрана:"</string>
+ <string name="battery_info_status_unknown">"Неизвестно"</string>
+ <string name="battery_info_status_charging">"Зарядка"</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">"Разрядка"</string>
+ <string name="battery_info_status_not_charging">"Не заряжается"</string>
+ <string name="battery_info_status_full">"Полная"</string>
+ <string name="battery_info_health_unknown">"Неизвестно"</string>
+ <string name="battery_info_health_good">"Достаточная"</string>
+ <string name="battery_info_health_overheat">"Перегрев"</string>
+ <string name="battery_info_health_dead">"Разряженная"</string>
+ <string name="battery_info_health_over_voltage">"Скачок напряжения"</string>
+ <string name="battery_info_health_unspecified_failure">"Неизвестная ошибка"</string>
+ <string name="bluetooth">"Bluetooth"</string>
+ <string name="bluetooth_visibility">"Видно другим"</string>
+ <string name="bluetooth_is_discoverable">"Виден в течение <xliff:g id="DISCOVERABLE_TIME_PERIOD">%1$s</xliff:g> сек…"</string>
+ <string name="bluetooth_not_discoverable">"Сделать устройство видимым"</string>
+ <string name="bluetooth_devices">"Устройства Bluetooth"</string>
+ <string name="bluetooth_device_name">"Название устройства"</string>
+ <string name="bluetooth_name_not_set">"Имя не задано, используется имя аккаунта"</string>
+ <string name="bluetooth_scan_for_devices">"Поиск устройств"</string>
+ <string name="bluetooth_disconnect_blank">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> будет отключено."</string>
+ <string name="bluetooth_connected">"Подключено"</string>
+ <string name="bluetooth_disconnected">"Отключено"</string>
+ <string name="bluetooth_disconnecting">"Отключение…"</string>
+ <string name="bluetooth_connecting">"Идет подключение…"</string>
+ <!-- no translation found for bluetooth_unknown (1905151516611093010) -->
+ <skip />
+ <string name="bluetooth_not_connected">"Создать пару с этим устройством"</string>
+ <string name="bluetooth_pairing">"Идет создание пары..."</string>
+ <!-- no translation found for bluetooth_paired (1247541089000057726) -->
+ <skip />
+ <string name="bluetooth_device">"гарнитура/наушники"</string>
+ <string name="progress_scanning">"Сканирование"</string>
+ <string name="bluetooth_notif_ticker">"Запрос на соединение Bluetooth"</string>
+ <string name="bluetooth_notif_title">"Запрос на соединение"</string>
+ <string name="bluetooth_notif_message">"Выбрать для соединения "</string>
+ <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>
+ <string name="choose_timezone">"Выбрать часовой пояс"</string>
+ <string name="display_preview_label">"Предварительный просмотр:"</string>
+ <string name="display_font_size_label">"Размер шрифта:"</string>
+ <!-- no translation found for intent_sender_data_label (8363026381459131554) -->
+ <skip />
+ <string name="intent_sender_sendbroadcast_text">"Отправить <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">"Запустить <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">"Аккаунт:"</string>
+ <string name="proxy_clear_text">"Очистить"</string>
+ <string name="proxy_port_label">"Порт"</string>
+ <string name="proxy_defaultView_text">"Восстановить значения по умолчанию"</string>
+ <string name="proxy_action_text">"Сохранить"</string>
+ <string name="proxy_hostname_label">"Имя узла"</string>
+ <string name="proxy_error">"Внимание"</string>
+ <string name="proxy_error_dismiss">"ОК"</string>
+ <string name="proxy_error_invalid_host">"Указано недействительное имя узла."</string>
+ <string name="proxy_error_empty_port">"Нужно заполнить поле порта."</string>
+ <string name="proxy_error_empty_host_set_port">"Если поле хоста пусто, поле порта тоже должно быть пустым."</string>
+ <string name="proxy_error_invalid_port">"Указанный порт недействителен."</string>
+ <string name="radio_info_signal_location_label">"Местоположение:"</string>
+ <string name="radio_info_neighboring_location_label">"CID поблизости:"</string>
+ <string name="radio_info_data_attempts_label">"Попыток данных:"</string>
+ <string name="radio_info_gprs_service_label">"Обслуживание GPRS:"</string>
+ <string name="radio_info_roaming_label">"Роуминг:"</string>
+ <string name="radio_info_imei_label">"IMEI:"</string>
+ <string name="radio_info_call_redirect_label">"Перенаправление вызова:"</string>
+ <string name="radio_info_ppp_resets_label">"Количество сбросов PPP с момента загрузки:"</string>
+ <string name="radio_info_gsm_disconnects_label">"GSM отключается:"</string>
+ <string name="radio_info_current_network_label">"Текущая сеть:"</string>
+ <string name="radio_info_data_successes_label">"Успешные данные:"</string>
+ <string name="radio_info_ppp_received_label">"Получено PPP:"</string>
+ <string name="radio_info_gsm_service_label">"Обслуживание GSM:"</string>
+ <string name="radio_info_signal_strength_label">"Уровень сигнала:"</string>
+ <string name="radio_info_call_status_label">"Состояние вызова:"</string>
+ <string name="radio_info_ppp_sent_label">"Отправлено PPP:"</string>
+ <string name="radio_info_radio_resets_label">"Сбросы радиосвязи:"</string>
+ <string name="radio_info_message_waiting_label">"Ожидает сообщение:"</string>
+ <string name="radio_info_phone_number_label">"Номер телефона:"</string>
+ <string name="radio_info_band_mode_label">"Выбор диапазона радиосвязи"</string>
+ <string name="radio_info_network_type_label">"Тип сети:"</string>
+ <string name="radio_info_set_perferred_label">"Задать предпочитаемый тип сети:"</string>
+ <string name="radio_info_ping_ipaddr">"IP-адрес Ping:"</string>
+ <string name="radio_info_ping_hostname">"Имя узла для ping (www.google.com):"</string>
+ <string name="radio_info_http_client_test">"Проверка HTTP-клиента:"</string>
+ <string name="radio_info_toggle_ciph_label">"Включить шифрование"</string>
+ <string name="ping_test_label">"Выполнить ping"</string>
+ <string name="radio_info_smsc_label">"SMSC:"</string>
+ <string name="radio_info_smsc_update_label">"Обновить"</string>
+ <string name="radio_info_smsc_refresh_label">"Обновить"</string>
+ <string name="radio_info_toggle_dns_check_label">"Выбор проверки DNS"</string>
+ <string name="band_mode_title">"Установить диапазон GSM/UMTS"</string>
+ <string name="band_mode_loading">"Загрузка списка диапазонов…"</string>
+ <string name="band_mode_set">"Установить"</string>
+ <string name="band_mode_failed">"Ошибка"</string>
+ <string name="band_mode_succeeded">"Успешно"</string>
+ <string name="sdcard_changes_instructions">"Изменения вступят в силу после повторного подключения кабеля USB"</string>
+ <string name="sdcard_settings_screen_mass_storage_text">"Включить устройство хранения USB"</string>
+ <string name="sdcard_settings_total_bytes_label">"Всего байт:"</string>
+ <string name="sdcard_settings_not_present_status">"Нет карты SD"</string>
+ <string name="sdcard_settings_available_bytes_label">"Доступно байт:"</string>
+ <string name="sdcard_settings_mass_storage_status">"Карта SD используется как устройство хранения данных."</string>
+ <string name="sdcard_settings_unmounted_status">"Теперь можно безопасно извлечь карту SD"</string>
+ <string name="sdcard_settings_bad_removal_status">"Карта SD извлечена во время использования!"</string>
+ <string name="sdcard_settings_used_bytes_label">"Занято, байт:"</string>
+ <string name="sdcard_settings_scanning_status">"Поиск мультимедиа на карте SD…"</string>
+ <string name="sdcard_settings_read_only_status">"Подключение к карте SD только для чтения"</string>
+ <string name="next_label">"Далее"</string>
+ <string name="language_picker_title">"Локаль"</string>
+ <string name="select_your_language">"Выберите язык"</string>
+ <string name="activity_picker_label">"Выбрать действие"</string>
+ <string name="device_info_label">"Сведения об устройстве"</string>
+ <string name="battery_info_label">"Сведения о батарее"</string>
+ <string name="battery_history_label">"Журнал сведений о батарее"</string>
+ <string name="display_label">"Экран"</string>
+ <string name="phone_info_label">"Сведения о телефоне"</string>
+ <string name="sd_card_settings_label">"Карта SD"</string>
+ <string name="proxy_settings_label">"Настройки прокси"</string>
+ <string name="cancel">"Отмена"</string>
+ <string name="settings_label">"Настройки"</string>
+ <string name="airplane_mode">"Режим полета"</string>
+ <string name="airplane_mode_summary">"Отключить все беспроводные подключения"</string>
+ <string name="airplane_mode_turning_on">"Отключение беспроводных соединений…"</string>
+ <string name="airplane_mode_turning_off">"Включение беспроводных соединений..."</string>
+ <string name="radio_controls_title">"Управление беспроводной связью"</string>
+ <string name="radio_controls_summary">"Управление Wi-Fi, Bluetooth, режимом полета и мобильными сетями"</string>
+ <string name="date_and_time_settings_title">"Дата и время"</string>
+ <string name="date_and_time_settings_summary">"Установка даты, времени, часового пояса и форматов"</string>
+ <string name="date_time_auto">"Автоматически"</string>
+ <string name="date_time_auto_summaryOn">"Использовать значения, предоставленные сетью"</string>
+ <string name="date_time_auto_summaryOff">"Использовать значения, предоставленные сетью"</string>
+ <string name="date_time_24hour">"Использовать 24-часовой формат"</string>
+ <string name="date_time_set_time">"Выбор времени"</string>
+ <string name="date_time_set_timezone">"Выбрать часовой пояс"</string>
+ <string name="date_time_set_date">"Установка даты"</string>
+ <string name="date_time_date_format">"Выбор формата даты"</string>
+ <string name="zone_list_menu_sort_alphabetically">"Расположить в алфавитном порядке"</string>
+ <string name="zone_list_menu_sort_by_timezone">"Сортировать по часовому поясу"</string>
+ <string name="security_settings_title">"Безопасность и местоположение"</string>
+ <string name="security_settings_summary">"Задать местоположение, разблокировку экрана, блокировку SIM-карты"</string>
+ <string name="security_passwords_title">"Пароли"</string>
+ <string name="bluetooth_quick_toggle_title">"Bluetooth"</string>
+ <string name="bluetooth_quick_toggle_summary">"Включить Bluetooth"</string>
+ <string name="bluetooth_settings">"Настройки Bluetooth"</string>
+ <string name="bluetooth_settings_title">"Настройки Bluetooth"</string>
+ <string name="bluetooth_settings_summary">"Управление подключениями, установка названия и видимости устройства"</string>
+ <string name="bluetooth_pin_entry">"Запрос на соединение Bluetooth"</string>
+ <string name="bluetooth_device_info">"Сведения об устройстве Bluetooth"</string>
+ <string name="bluetooth_enter_pin_msg">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"\n\n"Для создания пары укажите PIN."\n"(Попробуйте 0000 или 1234.)"</string>
+ <string name="bluetooth_error_title">"Внимание"</string>
+ <string name="bluetooth_pairing_error_message">"Не удалось создать пару с устройством <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+ <string name="bluetooth_pairing_pin_error_message">"Не удалось создать пару с устройством <xliff:g id="DEVICE_NAME">%1$s</xliff:g>, поскольку указан неверный PIN."</string>
+ <string name="bluetooth_connecting_error_message">"Не удалось подключиться к устройству <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+ <string name="bluetooth_preference_scan_title">"Поиск устройств"</string>
+ <string name="bluetooth_device_context_connect">"Подключиться"</string>
+ <string name="bluetooth_device_context_disconnect">"Отключить"</string>
+ <string name="bluetooth_device_context_pair_connect">"Создать пару и подключиться"</string>
+ <string name="bluetooth_device_context_unpair">"Отсоединить"</string>
+ <string name="bluetooth_device_context_disconnect_unpair">"Отключиться и разорвать пару"</string>
+ <string name="bluetooth_device_context_connect_advanced">"Параметры…"</string>
+ <string name="bluetooth_connect_specific_profiles_title">"Подключиться к…"</string>
+ <string name="bluetooth_profile_a2dp">"Мультимедиа"</string>
+ <string name="bluetooth_profile_headset">"Телефон"</string>
+ <string name="bluetooth_summary_connected_to_a2dp">"Подключено к мультимедийному звуковому выходу"</string>
+ <string name="bluetooth_summary_connected_to_headset">"Подключено к звуковому выходу телефона"</string>
+ <string name="bluetooth_summary_connected_to_a2dp_headset">"Подключено к звуковому выходу телефона и мультимедиа"</string>
+ <string name="bluetooth_device_advanced_title">"Параметры <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_device_advanced_online_mode_title">"Подключиться"</string>
+ <string name="bluetooth_device_advanced_online_mode_summary">"Подключиться к устройству Bluetooth"</string>
+ <string name="bluetooth_device_advanced_profile_header_title">"Профили"</string>
+ <string name="bluetooth_a2dp_profile_summary_connected">"Подключено к мультимедийному звуковому выходу"</string>
+ <string name="bluetooth_headset_profile_summary_connected">"Подключено к звуковому выходу телефона"</string>
+ <string name="bluetooth_a2dp_profile_summary_use_for">"Использовать для звука мультимедиа"</string>
+ <string name="bluetooth_headset_profile_summary_use_for">"Использовать для звука телефона"</string>
+ <string name="wifi">"Wi-Fi"</string>
+ <string name="wifi_quick_toggle_title">"Wi-Fi"</string>
+ <string name="wifi_quick_toggle_summary">"Включить Wi-Fi"</string>
+ <string name="wifi_settings">"Настройки Wi-Fi"</string>
+ <string name="wifi_settings_category">"Настройки Wi-Fi"</string>
+ <string name="wifi_settings_summary">"Настройка и управление точками доступа беспроводной связи"</string>
+ <string name="forget_network">"Удалить навсегда"</string>
+ <string name="wifi_status">"Состояние"</string>
+ <string name="wifi_link_speed">"Скорость"</string>
+ <string name="wifi_signal_3">"Отличный"</string>
+ <string name="wifi_signal_2">"Хороший"</string>
+ <string name="wifi_signal_1">"Средний"</string>
+ <string name="wifi_signal_0">"Плохой"</string>
+ <string name="security">"Безопасность"</string>
+ <string name="wifi_security_open">"Без шифрования"</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">"Неизвестно"</string>
+ <string name="wifi_security_verbose_open">"Открытая сеть"</string>
+ <string name="wifi_security_verbose_wep">"Защищена WEP"</string>
+ <string name="wifi_security_verbose_wpa">"Защищена WPA"</string>
+ <string name="wifi_security_verbose_wpa2">"Защищена WPA2"</string>
+ <string name="ip_address">"IP-адрес"</string>
+ <string name="signal">"Уровень сигнала"</string>
+ <string name="wifi_starting">"Включение…"</string>
+ <string name="wifi_stopping">"Выключение…"</string>
+ <string name="wifi_error">"Ошибка"</string>
+ <string name="error_starting">"Не удается запустить Wi-Fi"</string>
+ <string name="error_stopping">"Не удается остановить Wi-Fi"</string>
+ <string name="error_scanning">"Не удается начать поиск сетей"</string>
+ <string name="error_connecting">"Не удается подключиться к сети"</string>
+ <string name="error_saving">"Не удается сохранить сеть"</string>
+ <string name="connect">"Подключиться"</string>
+ <string name="connect_to_blank">"Подключиться к сети <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+ <string name="please_type_passphrase">"Пароль беспроводной сети"</string>
+ <string name="please_type_hex_key">"Шестнадцатеричный ключ WEP (0-9, A-F)"</string>
+ <string name="wifi_show_password">"Показать пароль."</string>
+ <string name="scan_wifi">"Сканировать"</string>
+ <string name="summary_not_in_range">"Вне зоны действия"</string>
+ <string name="summary_remembered">"Запомнено ранее"</string>
+ <string name="summary_connection_failed">"Соединение не установлено, повторите попытку"</string>
+ <string name="wifi_access_points">"Сети Wi-Fi"</string>
+ <string name="wifi_type_ssid">"SSID сети"</string>
+ <string name="wifi_security">"Безопасность"</string>
+ <string name="wifi_save_config">"Сохранить"</string>
+ <string name="wifi_password_unchanged">"(не изменено)"</string>
+ <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_generic_connection_error">"Проблема при подключении к сети. Повторите попытку."</string>
+ <string name="wifi_menu_advanced">"Дополнительно"</string>
+ <string name="wifi_ip_settings_titlebar">"Настройки IP"</string>
+ <string name="wifi_ip_settings_menu_save">"Сохранить"</string>
+ <string name="wifi_ip_settings_menu_cancel">"Отмена"</string>
+ <string name="wifi_ip_settings_invalid_ip">"Укажите действительный IP-адрес."</string>
+ <string name="wifi_use_static_ip">"Использовать статический IP"</string>
+ <string name="wifi_ip_address">"IP-адрес"</string>
+ <string name="wifi_dns1">"DNS 1"</string>
+ <string name="wifi_dns2">"DNS 2"</string>
+ <string name="wifi_gateway">"Шлюз"</string>
+ <string name="wifi_netmask">"Маска сети"</string>
+ <string name="wifi_context_menu_connect">"Подключиться к сети"</string>
+ <string name="wifi_context_menu_forget">"Удалить сеть"</string>
+ <string name="wifi_context_menu_change_password">"Изменить пароль"</string>
+ <string name="wifi_advanced_titlebar">"Дополнительно"</string>
+ <string name="wifi_setting_num_channels_title">"Управляющий домен"</string>
+ <string name="wifi_setting_num_channels_summary">"Установить количество используемых каналов"</string>
+ <string name="wifi_setting_num_channels_error">"При установке управляющего домена возникла проблема."</string>
+ <string name="wifi_setting_num_channels_channel_phrase">"Каналов: <xliff:g id="NUM_CHANNELS">%1$d</xliff:g>"</string>
+ <string name="wifi_setting_sleep_policy_title">"Правила перехода Wi-Fi в спящий режим"</string>
+ <string name="wifi_setting_sleep_policy_summary">"Укажите, когда следует переходить от Wi-Fi к мобильным данным"</string>
+ <string name="wifi_setting_sleep_policy_error">"При установке правила перехода в спящий режим возникла проблема."</string>
+ <string name="wifi_advanced_mac_address_title">"MAC-адрес"</string>
+ <string name="fragment_status_scanning">"Идет сканирование…"</string>
+ <string name="fragment_status_connecting">"Идет подключение к <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</string>
+ <string name="fragment_status_authenticating">"Аутентификация в сети <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</string>
+ <string name="fragment_status_obtaining_ip">"Получение IP-адреса в <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</string>
+ <string name="fragment_status_connected">"Подключено к <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+ <string name="fragment_status_disconnecting">"Отключение от сети <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</string>
+ <string name="fragment_status_disconnected">"Отключено"</string>
+ <string name="fragment_status_failed">"Ошибка"</string>
+ <string name="status_scanning">"Идет сканирование…"</string>
+ <string name="status_connecting">"Идет подключение…"</string>
+ <string name="status_authenticating">"Идет аутентификация…"</string>
+ <string name="status_obtaining_ip">"Получение адреса…"</string>
+ <string name="status_connected">"Подключено"</string>
+ <string name="status_disconnecting">"Отключение…"</string>
+ <string name="status_disconnected">"Отключено"</string>
+ <string name="status_failed">"Ошибка"</string>
+ <string name="sound_and_display_settings">"Звук и экран"</string>
+ <string name="sound_settings">"Настройки звука"</string>
+ <string name="sound_and_display_settings_summary">"Установка мелодий звонка, уведомлений, яркости экрана"</string>
+ <string name="silent_mode_title">"Беззвучный режим"</string>
+ <string name="silent_mode_summary">"Отключение всех звуков, кроме мультимедиа и будильников"</string>
+ <string name="ringtone_title">"Мелодия звонка телефона"</string>
+ <string name="ringtone_summary">"Установить мелодию звонка для входящих вызовов по умолчанию"</string>
+ <string name="ring_volume_title">"Громкость звонка"</string>
+ <string name="ring_volume_summary">"Установить громкость входящих звонков и уведомлений"</string>
+ <string name="vibrate_title">"Виброзвонок"</string>
+ <string name="vibrate_summary">"Вибрация при входящих вызовах"</string>
+ <string name="notification_sound_title">"Мелодия уведомления"</string>
+ <string name="notification_sound_summary">"Задать мелодию уведомления по умолчанию"</string>
+ <string name="incoming_call_volume_title">"Громкость входящих вызовов"</string>
+ <string name="notification_volume_title">"Громкость уведомления"</string>
+ <string name="checkbox_notification_same_as_incoming_call">"Использовать громкость входящих вызовов для уведомлений"</string>
+ <string name="notification_sound_dialog_title">"Выбрать мелодию уведомления"</string>
+ <string name="media_volume_title">"Громкость звука мультимедиа"</string>
+ <string name="media_volume_summary">"Установить громкость музыки и видео"</string>
+ <string name="dtmf_tone_enable_title">"Звук при нажатии"</string>
+ <string name="dtmf_tone_enable_summary_on">"Издавать сигналы при использовании клавиатуры"</string>
+ <string name="dtmf_tone_enable_summary_off">"Издавать сигналы при использовании клавиатуры"</string>
+ <string name="sound_effects_enable_title">"Звук при выборе"</string>
+ <string name="sound_effects_enable_summary_on">"Воспроизвести звук при выборе на экране"</string>
+ <string name="sound_effects_enable_summary_off">"Воспроизвести звук при выборе на экране"</string>
+ <string name="play_media_notification_sounds_enable_title">"Оповещения карты SD"</string>
+ <string name="play_media_notification_sounds_enable_summary_on">"Отключить звуковые сигналы для карты SD"</string>
+ <string name="play_media_notification_sounds_enable_summary_off">"Включить предупреждающие звуки карты SD"</string>
+ <string name="sync_settings">"Синхронизация данных"</string>
+ <string name="sync_settings_summary">"Выбрать синхронизируемые приложения"</string>
+ <string name="display_settings">"Настройки экрана"</string>
+ <string name="animations_title">"Анимация"</string>
+ <string name="animations_summary_on">"Показывать анимацию при открытии и закрытии окон"</string>
+ <string name="animations_summary_off">"Показывать анимацию при открытии и закрытии окон"</string>
+ <string name="brightness">"Яркость"</string>
+ <string name="brightness_summary">"Настроить яркость экрана"</string>
+ <string name="screen_timeout">"Время до отключения экрана"</string>
+ <string name="screen_timeout_summary">"Настроить задержку автоматического отключения экрана"</string>
+ <string name="sim_lock_settings">"Настройки блокировки SIM-карты"</string>
+ <string name="sim_lock_settings_category">"Установить блокировку SIM-карты"</string>
+ <string name="sim_lock_settings_title">"Блокировка SIM-карты"</string>
+ <string name="sim_pin_toggle">"Блокировка SIM-карты"</string>
+ <string name="sim_lock_on">"Для использования телефона требуется PIN"</string>
+ <string name="sim_lock_off">"Для использования телефона требуется PIN"</string>
+ <string name="sim_pin_change">"Изменение PIN SIM-карты"</string>
+ <string name="sim_enter_pin">"PIN SIM-карты"</string>
+ <string name="sim_enable_sim_lock">"Блокировка SIM-карты"</string>
+ <string name="sim_disable_sim_lock">"Разблокировать SIM-карту"</string>
+ <string name="sim_enter_old">"Старый PIN SIM-карты"</string>
+ <string name="sim_enter_new">"Новый PIN SIM-карты"</string>
+ <string name="sim_reenter_new">"Введите новый PIN еще раз"</string>
+ <string name="sim_change_pin">"PIN SIM-карты"</string>
+ <string name="sim_bad_pin">"Неверный PIN!"</string>
+ <string name="sim_pins_dont_match">"PIN-коды не совпадают!"</string>
+ <string name="sim_change_failed">"Не удается изменить PIN."\n"Возможно, указан неверный PIN."</string>
+ <string name="sim_change_succeeded">"PIN SIM-карты успешно изменен"</string>
+ <string name="sim_lock_failed">"Не удается изменить состояние блокировки SIM-карты."\n"Возможно, указан неверный PIN."</string>
+ <string name="sim_enter_ok">"ОК"</string>
+ <string name="sim_enter_cancel">"Отмена"</string>
+ <string name="device_info_settings">"Состояние телефона"</string>
+ <string name="system_update_settings_list_item_title">"Системные обновления"</string>
+ <string name="system_update_settings_list_item_summary">"Проверить наличие системных обновлений"</string>
+ <string name="firmware_version">"Версия микропрограммного обеспечения"</string>
+ <string name="model_number">"Номер модели"</string>
+ <string name="baseband_version">"Версия основного диапазона"</string>
+ <string name="kernel_version">"Версия Kernel"</string>
+ <string name="build_number">"Номер сборки"</string>
+ <string name="device_info_not_available">"Недоступно"</string>
+ <string name="device_status_activity_title">"Состояние"</string>
+ <string name="device_status">"Состояние"</string>
+ <string name="device_status_summary">"IMEI, номер телефона, сигнал и т.д."</string>
+ <string name="storage_settings_title">"Карта SD и память телефона"</string>
+ <string name="storage_settings_summary">"Отключить карту SD, просмотреть объем свободного места"</string>
+ <string name="status_number">"Номер телефона"</string>
+ <string name="status_network_type">"Тип мобильной сети"</string>
+ <string name="status_data_state">"Состояние мобильной сети"</string>
+ <string name="status_service_state">"Наличие обслуживания"</string>
+ <string name="status_signal_strength">"Уровень сигнала"</string>
+ <string name="status_roaming">"Роуминг"</string>
+ <string name="status_operator">"Сеть"</string>
+ <string name="status_wifi_mac_address">"MAC-адрес Wi-Fi"</string>
+ <string name="status_bt_address">"Адрес Bluetooth"</string>
+ <string name="status_unavailable">"Недоступно"</string>
+ <string name="status_network_traffic_stats">"Использование сети"</string>
+ <string name="status_network_traffic_summary">"Отправлено: <xliff:g id="NETWORK_TRAFFIC_0">%1$d packets, %2$d bytes%n</xliff:g>Принято: <xliff:g id="NETWORK_TRAFFIC_1">%3$d packets, %4$d bytes</xliff:g>"</string>
+ <string name="status_up_time">"Время работы"</string>
+ <string name="status_awake_time">"Время активности"</string>
+ <string name="internal_memory">"Хранение в памяти телефона"</string>
+ <string name="sd_memory">"Карта SD"</string>
+ <string name="memory_available">"Доступное место"</string>
+ <string name="memory_size">"Всего места"</string>
+ <string name="sd_eject">"Демонтировать карту SD"</string>
+ <string name="sd_eject_summary">"Демонтировать карту SD для безопасного удаления"</string>
+ <string name="sd_format">"Форматировать карту SD"</string>
+ <string name="sd_format_summary">"Форматировать (очистить) карту SD"</string>
+ <string name="sd_unavailable">"Недоступно"</string>
+ <string name="read_only">" (Только для чтения)"</string>
+ <string name="battery_status_title">"Состояние батареи"</string>
+ <string name="battery_level_title">"Уровень батареи"</string>
+ <string name="apn_settings">"APN"</string>
+ <string name="apn_edit">"Изменение точки доступа"</string>
+ <string name="apn_not_set">"&lt;Не задано&gt;"</string>
+ <string name="apn_name">"Имя"</string>
+ <string name="apn_apn">"APN"</string>
+ <string name="apn_http_proxy">"Прокси"</string>
+ <string name="apn_http_port">"Порт"</string>
+ <string name="apn_user">"Имя пользователя"</string>
+ <string name="apn_password">"Пароль"</string>
+ <string name="apn_server">"Сервер"</string>
+ <string name="apn_mmsc">"MMSC"</string>
+ <string name="apn_mms_proxy">"Прокси MMS"</string>
+ <string name="apn_mms_port">"Порт MMS"</string>
+ <string name="apn_mcc">"MCC"</string>
+ <string name="apn_mnc">"MNC"</string>
+ <string name="apn_type">"Тип APN"</string>
+ <string name="menu_delete">"Удалить APN"</string>
+ <string name="menu_new">"Создать APN"</string>
+ <string name="menu_save">"Сохранить"</string>
+ <string name="menu_cancel">"Закрыть"</string>
+ <string name="error_title">"Внимание"</string>
+ <string name="error_name_empty">"Поле Имя не может быть пустым."</string>
+ <string name="error_apn_empty">"APN не может быть пустым."</string>
+ <string name="error_mcc_not3">"Поле MCC должно содержать 3 цифры."</string>
+ <string name="error_mnc_not23">"Поле MNC должно содержать 2 или 3 цифры."</string>
+ <string name="master_clear_title">"Сброс заводских данных"</string>
+ <string name="master_clear_summary">"Удаление всех данных с телефона"</string>
+ <string name="master_clear_desc">"Это действие сбросит телефон до исходного заводского состояния, удалив все данные и загруженные приложения!"</string>
+ <string name="master_clear_button_text">"Сбросить телефон"</string>
+ <string name="master_clear_final_desc">"Сбросить телефон? Все данные и приложения будут удалены; действия необратимы!"</string>
+ <string name="master_clear_final_button_text">"Удалить все"</string>
+ <string name="master_clear_gesture_prompt">"Воспроизведите комбинацию разблокировки"</string>
+ <string name="master_clear_gesture_explanation">"Для подтверждения сброса телефона нужно воспроизвести комбинацию разблокировки."</string>
+ <string name="master_clear_failed">"Сброс не произведен, так как служба очистки системы недоступна."</string>
+ <string name="media_format_title">"Форматировать карту SD."</string>
+ <string name="media_format_summary">"Удаляет все данные с карты SD"</string>
+ <string name="media_format_desc">"Это действие приведет к очистке карты SD в телефоне. ВСЯ информация, находящаяся на карте, будет удалена!"</string>
+ <string name="media_format_button_text">"Форматировать карту SD"</string>
+ <string name="media_format_final_desc">"Форматировать карту SD с удалением всех ваших данных? Это действие нельзя отменить!"</string>
+ <string name="media_format_final_button_text">"Стереть все"</string>
+ <string name="media_format_gesture_prompt">"Воспроизвести шаблон снятия блока"</string>
+ <string name="media_format_gesture_explanation">"Для подтверждения форматирования карты SD нужно воспроизвести шаблон снятия блока."</string>
+ <string name="call_settings_title">"Настройки вызовов"</string>
+ <string name="call_settings_summary">"Настройка голосовой почты, перенаправления звонков, удержания звонков, идентификатора звонящего"</string>
+ <string name="network_settings_title">"Мобильные сети"</string>
+ <string name="network_settings_summary">"Установить параметры роуминга, сетей, APN"</string>
+ <string name="location_title">"Источники моего местоположения"</string>
+ <string name="location_network_based">"Использовать беспроводные сети"</string>
+ <string name="location_networks_disabled">"Просмотр местоположения в приложениях (например в Картах) с помощью беспроводных сетей"</string>
+ <string name="location_neighborhood_level">"Местоположение определяется с помощью Wi-Fi и/или сотовых сетей"</string>
+ <string name="location_gps">"Включить спутники GPS"</string>
+ <string name="location_street_level">"Определение местоположения с точностью до улицы (для экономии заряда батареи отмените выбор)"</string>
+ <string name="location_gps_disabled">"Находить меня до уровня улицы (требуется больше заряда батареи, а также прямая видимость неба)"</string>
+ <string name="about_settings">"О телефоне"</string>
+ <string name="about_settings_summary">"Просмотреть юридические сведения, состояние телефона, версию ПО"</string>
+ <string name="legal_information">"Юридическая информация"</string>
+ <string name="contributors_title">"Авторы"</string>
+ <string name="copyright_title">"Авторские права"</string>
+ <string name="license_title">"Лицензия"</string>
+ <string name="terms_title">"Условия предоставления услуг"</string>
+ <string name="settings_license_activity_title">"Лицензии Open Source"</string>
+ <string name="settings_license_activity_unavailable">"При загрузке лицензий произошла ошибка."</string>
+ <string name="settings_license_activity_loading">"Идет загрузка…"</string>
+ <string name="lock_settings_title">"Комбинация разблокировки экрана"</string>
+ <string name="lockpattern_change_lock_pattern_label">"Изменить последовательность разблокировки"</string>
+ <string name="lockpattern_need_to_unlock">"Подтвердите сохраненную комбинацию"</string>
+ <string name="lockpattern_need_to_unlock_wrong">"Неверно, попробуйте еще раз:"</string>
+ <string name="lockpattern_recording_intro_header">"Создайте комбинацию разблокировки"</string>
+ <string name="lockpattern_recording_intro_footer">"Для справки нажмите Menu"</string>
+ <string name="lockpattern_recording_inprogress">"По окончании уберите палец."</string>
+ <string name="lockpattern_recording_incorrect_too_short">"Соедините не менее <xliff:g id="NUMBER">%d</xliff:g> точек. Попробуйте еще раз:"</string>
+ <string name="lockpattern_pattern_entered_header">"Последовательность записана!"</string>
+ <string name="lockpattern_need_to_confirm">"Для подтверждения еще раз воспроизведите комбинацию:"</string>
+ <string name="lockpattern_pattern_confirmed_header">"Новая комбинация разблокировки:"</string>
+ <string name="lockpattern_confirm_button_text">"Подтверждение"</string>
+ <string name="lockpattern_restart_button_text">"Изменить"</string>
+ <string name="lockpattern_retry_button_text">"Повторить"</string>
+ <string name="lockpattern_continue_button_text">"Продолжить"</string>
+ <string name="lockpattern_settings_title">"Комбинация разблокировки"</string>
+ <string name="lockpattern_settings_enable_title">"Комбинация обязательна"</string>
+ <string name="lockpattern_settings_enable_summary">"Для разблокировки экрана воспроизведите комбинацию"</string>
+ <string name="lockpattern_settings_enable_visible_pattern_title">"Использовать видимую комбинацию"</string>
+ <string name="lockpattern_settings_enable_tactile_feedback_title">"Использовать тактильную обратную связь"</string>
+ <string name="lockpattern_settings_choose_lock_pattern">"Задать комбинацию разблокировки"</string>
+ <string name="lockpattern_settings_change_lock_pattern">"Изменить последовательность разблокировки"</string>
+ <string name="lockpattern_settings_help_how_to_record">"Как создать комбинацию разблокировки"</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_header">"Слишком много неверных попыток!"</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_footer">"Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> сек."</string>
+ <string name="skip_button_label">"Отмена"</string>
+ <string name="next_button_label">"Далее"</string>
+ <string name="lock_title">"Защита телефона"</string>
+ <string name="lock_intro_message"><font size="17">"Защитите телефон от несанкционированного использования, создав личную комбинацию разблокировки экрана. "\n<font height="17">\n</font><b>"1"</b>"  На следующем экране показан пример создания комбинации "\n<font height="17">\n</font><b>"2"</b>"  Просмотрите его и создайте собственную комбинацию разблокировки. Пробуйте разные комбинации, но соединяйте не менее четырех точек. "\n<font height="17">\n</font><b>"3"</b>"  Воспроизведите комбинацию повторно для подтверждения. "\n<font height="17">\n</font><b>"Готовы начать? Нажмите \"Далее\""</b>". "\n<font height="3">\n</font>"Чтобы оставить телефон без защиты, нажмите \"Отмена\"."</font></string>
+ <string name="lock_example_title">"Пример комбинации"</string>
+ <string name="lock_example_message">"Соедините не меньше четырех точек."\n" "\n"Выберите \"Далее\", когда будете готовы создать свою комбинацию."</string>
+ <string name="manageapplications_settings_title">"Управление приложениями"</string>
+ <string name="manageapplications_settings_summary">"Управлять установленными приложениями и удалять их"</string>
+ <string name="applications_settings">"Приложения"</string>
+ <string name="applications_settings_summary">"Управление приложениями, настройка горячих клавиш"</string>
+ <string name="applications_settings_header">"Настройки приложений"</string>
+ <string name="install_applications">"Неизвестные источники"</string>
+ <string name="install_unknown_applications">"Разрешить установку приложений не из Android Маркет"</string>
+ <string name="install_all_warning">"Атака приложений из неизвестных источников более опасна для телефона и личных данных. Вы соглашаетесь, что несете всю ответственность за ущерб телефону или потерю данных, которые могут произойти от использования таких приложений."</string>
+ <string name="application_info_label">"Сведения о приложении"</string>
+ <string name="storage_label">"Хранение"</string>
+ <string name="auto_launch_label">"Запускать по умолчанию"</string>
+ <string name="permissions_label">"Разрешения"</string>
+ <string name="cache_header_label">"Кэш"</string>
+ <string name="clear_cache_btn_text">"Очистить кэш"</string>
+ <string name="cache_size_label">"Кэш"</string>
+ <string name="controls_label">"Элементы управления"</string>
+ <string name="force_stop">"Остановить принудительно"</string>
+ <string name="total_size_label">"Всего"</string>
+ <string name="application_size_label">"Приложение"</string>
+ <string name="data_size_label">"Данные"</string>
+ <string name="uninstall_text">"Удалить"</string>
+ <string name="clear_user_data_text">"Очистить данные"</string>
+ <string name="auto_launch_enable_text">"Это приложение по умолчанию запускается для некоторых действий."</string>
+ <string name="auto_launch_disable_text">"Значения по умолчанию не установлены."</string>
+ <string name="clear_activities">"Очистить значения по умолчанию"</string>
+ <string name="unknown">"Неизвестно"</string>
+ <string name="sort_order_alpha">"Сортировать"</string>
+ <string name="sort_order_size">"Сортировать по размеру"</string>
+ <string name="manage_space_text">"Управление памятью"</string>
+ <string name="filter">"Фильтр"</string>
+ <string name="filter_dlg_title">"Выбрать параметры фильтра"</string>
+ <string name="filter_apps_all">"Все"</string>
+ <string name="filter_apps_third_party">"Сторонние"</string>
+ <string name="filter_apps_running">"Выполняемые"</string>
+ <string name="loading">"Идет загрузка…"</string>
+ <string name="recompute_size">"Перерасчет размера…"</string>
+ <string name="clear_data_dlg_title">"Удалить"</string>
+ <string name="clear_data_dlg_text">"Вся информация, сохраненная в этом приложении, будет удалена навсегда."</string>
+ <string name="dlg_ok">"ОК"</string>
+ <string name="dlg_cancel">"Отмена"</string>
+ <string name="app_not_found_dlg_title">"Приложение не найдено"</string>
+ <string name="app_not_found_dlg_text">"Приложение не найдено в списке установленных приложений."</string>
+ <string name="clear_data_failed">"Не удается очистить данные приложения."</string>
+ <string name="security_settings_desc">"Это приложение имеет доступ к следующему на телефоне:"</string>
+ <string name="computing_size">"Вычисление..."</string>
+ <string name="invalid_size_value">"Невозможно вычислить размер пакета"</string>
+ <string name="empty_list_msg">"У вас не установлено приложений сторонних разработчиков."</string>
+ <string name="language_settings">"Локаль и текст"</string>
+ <string name="language_settings_summary">"Выбор локали (языка и региона), параметров ввода текста и автоисправлений"</string>
+ <string name="language_category">"Настройки локали"</string>
+ <string name="text_category">"Настройки текста"</string>
+ <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_caps">"Автоматически заменять заглавной буквой"</string>
+ <string name="auto_caps_summary">"Большие буквы в начале предложений"</string>
+ <string name="auto_punctuate">"Автоматическая пунктуация"</string>
+ <string name="hardkeyboard_category">"Настройки внешней клавиатуры"</string>
+ <string name="auto_punctuate_summary">"Чтобы вставить символ \".\", дважды нажмите пробел."</string>
+ <string name="show_password">"Показывать пароли"</string>
+ <string name="show_password_summary">"Показывать пароль при вводе"</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_add_menu_title">"Добавить"</string>
+ <string name="user_dict_settings_add_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">"В пользовательском словаре отсутствуют слова. Добавить слово можно с помощью меню."</string>
+ <string name="testing">"Тестирование"</string>
+ <string name="testing_phone_info">"Сведения о телефоне"</string>
+ <string name="testing_battery_info">"Сведения о батарее"</string>
+ <string name="testing_battery_history">"Журнал сведений о батарее"</string>
+ <string name="quick_launch_title">"Быстрый запуск"</string>
+ <string name="quick_launch_summary">"Задать горячие клавиши для запуска приложений"</string>
+ <string name="quick_launch_assign_application">"Назначить приложение"</string>
+ <string name="quick_launch_no_shortcut">"Нет ярлыка"</string>
+ <string name="quick_launch_shortcut">"Поиск + <xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g>"</string>
+ <string name="quick_launch_clear_dialog_title">"Очистить"</string>
+ <string name="quick_launch_clear_dialog_message">"Ярлык <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">"ОК"</string>
+ <string name="quick_launch_clear_cancel_button">"Отмена"</string>
+ <string name="quick_launch_display_mode_applications">"Приложения"</string>
+ <string name="quick_launch_display_mode_shortcuts">"Ярлыки"</string>
+ <string name="input_methods_settings_title">"Ввод текста"</string>
+ <string name="input_methods_settings_summary">"Управление параметрами ввода текста"</string>
+ <string name="input_methods_settings_label_format">"Настройки %s"</string>
+ <string name="development_settings_title">"Разработка"</string>
+ <string name="development_settings_summary">"Выбрать параметры разработки приложений"</string>
+ <string name="enable_adb">"Отладка USB"</string>
+ <string name="enable_adb_summary">"Режим отладки при подключении USB"</string>
+ <string name="keep_screen_on">"Не выключать"</string>
+ <string name="keep_screen_on_summary">"При зарядке экран не отключается"</string>
+ <string name="allow_mock_location">"Разрешить фиктивные местоположения"</string>
+ <string name="allow_mock_location_summary">"Разрешить фиктивные местоположения"</string>
+ <!-- no translation found for gadget_picker_title (98374951396755811) -->
+ <skip />
+ <!-- no translation found for widget_picker_title (9130684134213467557) -->
+ <skip />
+ <string name="battery_history_details_for">"Сведения для идентификатора пользователя %d"</string>
+ <string name="battery_history_uid">"Идентификатор пользователя <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
+ <string name="battery_history_network_usage">"Сведения об использовании сети приложением <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
+ <string name="battery_history_bytes_received">"Получено байт: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_sent">"Отправлено байт: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_total">"Всего байт: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_cpu_usage">"Сведения об использовании процессора приложением <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
+ <string name="battery_history_user_time">"Пользовательское время:"</string>
+ <string name="battery_history_system_time">"Системное время:"</string>
+ <string name="battery_history_total_time">"Общее время:"</string>
+ <string name="battery_history_starts">"Запусков: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
+ <string name="battery_history_days">"<xliff:g id="DAYS">%1$d</xliff:g> дн., <xliff:g id="HOURS">%2$d</xliff:g> ч., <xliff:g id="MINUTES">%3$d</xliff:g> мин., <xliff:g id="SECONDS">%4$d</xliff:g> сек."</string>
+ <string name="battery_history_hours">"<xliff:g id="HOURS">%1$d</xliff:g> ч., <xliff:g id="MINUTES">%2$d</xliff:g> мин., <xliff:g id="SECONDS">%3$d</xliff:g>сек."</string>
+ <string name="battery_history_minutes">"<xliff:g id="MINUTES">%1$d</xliff:g> мин., <xliff:g id="SECONDS">%2$d</xliff:g> сек."</string>
+ <string name="battery_history_seconds">"<xliff:g id="SECONDS">%1$d</xliff:g> секунд"</string>
+ <string name="battery_history_packages_sharing_this_uid">"Пакеты с этим идентификатором пользователя:"</string>
+ <string name="battery_history_no_data">"Данные об использовании батареи недоступны"</string>
+ <string name="battery_history_sensor">"Сенсор:"</string>
+ <!-- no translation found for battery_history_wakelock (608683447522396293) -->
+ <skip />
+ <string name="battery_history_used_by_packages">"Использования сенсора пакетами:"</string>
+ <string name="battery_history_sensor_usage">"Использовано пакетом <xliff:g id="PACKAGE">%2$s</xliff:g>: <xliff:g id="COUNT">%1$d</xliff:g> раз(а)"</string>
+ <string name="battery_history_sensor_usage_multi">"Использовано <xliff:g id="COUNT">%1$d</xliff:g> раз(а) одним из:"</string>
+ <!-- no translation found for battery_history_awake_label (8449792868990080882) -->
+ <skip />
+ <!-- no translation found for battery_history_screen_on_label (1848936521786339362) -->
+ <skip />
+ <!-- no translation found for battery_history_phone_on_label (700191958853142297) -->
+ <skip />
+ <!-- no translation found for battery_history_awake (4350886665719031057) -->
+ <skip />
+ <string name="battery_history_screen_on">"Время пребывания экрана включенным:"</string>
+ <!-- no translation found for battery_history_phone_on (4891504401623839532) -->
+ <skip />
+ <string name="battery_history_screen_on_battery">"От батареи:"</string>
+ <string name="battery_history_screen_on_plugged">"Подключен к питанию:"</string>
+ <string name="usage_stats_label">"Статистика использования"</string>
+ <string name="testing_usage_stats">"Статистика использования"</string>
+ <string name="display_order_text">"Упорядочить по:"</string>
+ <string name="app_name_label">"Приложение"</string>
+ <string name="launch_count_label">"Подсчет"</string>
+ <string name="usage_time_label">"Время использования"</string>
+</resources>
diff --git a/res/values-zh-rCN-nokeys/strings.xml b/res/values-zh-rCN-nokeys/strings.xml
new file mode 100644
index 0000000..09bd118
--- /dev/null
+++ b/res/values-zh-rCN-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">"管理应用程序"</string>
+</resources>
diff --git a/res/values-zh-rCN/arrays.xml b/res/values-zh-rCN/arrays.xml
new file mode 100644
index 0000000..5b3b651
--- /dev/null
+++ b/res/values-zh-rCN/arrays.xml
@@ -0,0 +1,72 @@
+<?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>"美洲"</item>
+ <item>"欧洲"</item>
+ <item>"非洲"</item>
+ <item>"亚洲"</item>
+ <item>"澳大利亚"</item>
+ <item>"太平洋"</item>
+ <item>"全部"</item>
+ </string-array>
+ <string-array name="screen_timeout_entries">
+ <item>"15 秒"</item>
+ <item>"30 秒"</item>
+ <item>"1 分钟"</item>
+ <item>"2 分钟"</item>
+ <item>"10 分钟"</item>
+ <item>"从不待机"</item>
+ </string-array>
+ <string-array name="wifi_security_entries">
+ <item>"自动"</item>
+ <item>"无"</item>
+ <item>"WEP"</item>
+ <item>"WPA(个人)"</item>
+ <item>"WPA2(个人)"</item>
+ </string-array>
+ <string-array name="wifi_security_without_auto_entries">
+ <item>"无"</item>
+ <item>"WEP"</item>
+ <item>"WPA(个人)"</item>
+ <item>"WPA2(个人)"</item>
+ </string-array>
+ <string-array name="wifi_wep_type">
+ <item>"自动"</item>
+ <item>"WEP ASCII"</item>
+ <item>"WEP 十六进制"</item>
+ </string-array>
+ <string-array name="wifi_sleep_policy_entries">
+ <item>"当屏幕关闭时"</item>
+ <item>"插入后从不进入休眠状态"</item>
+ <item>"从不"</item>
+ </string-array>
+ <!-- no translation found for battery_history_type_spinner:0 (2193799199027871385) -->
+ <!-- no translation found for battery_history_type_spinner:1 (6401018715947316517) -->
+ <!-- no translation found for battery_history_type_spinner:2 (188092590354892392) -->
+ <!-- no translation found for battery_history_type_spinner:3 (8414109131222049141) -->
+ <!-- no translation found for battery_history_type_spinner:4 (1327904325081257093) -->
+ <!-- no translation found for battery_history_type_spinner:5 (4832254146664706277) -->
+ <!-- no translation found for battery_history_which_spinner:0 (3451981114763440074) -->
+ <!-- no translation found for battery_history_which_spinner:1 (166936313535197598) -->
+ <!-- no translation found for battery_history_which_spinner:2 (4793941382744963893) -->
+ <string-array name="usage_stats_display_order_types">
+ <item>"使用时间"</item>
+ <item>"启动次数"</item>
+ <item>"应用程序名称"</item>
+ </string-array>
+</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..45148de
--- /dev/null
+++ b/res/values-zh-rCN/strings.xml
@@ -0,0 +1,672 @@
+<?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">"未知"</string>
+ <string name="turn_on_radio">"打开收音机"</string>
+ <string name="turn_off_radio">"关闭收音机"</string>
+ <string name="turn_on_qxdm">"启用 QXDM SD 日志"</string>
+ <string name="turn_off_qxdm">"禁用 QXDM SD 日志"</string>
+ <string name="radioInfo_menu_viewADN">"查看 SIM 卡地址簿"</string>
+ <string name="radioInfo_menu_viewFDN">"查看固定拨号"</string>
+ <string name="radioInfo_menu_viewSDN">"查看服务拨号"</string>
+ <string name="radioInfo_menu_getPDP">"获取 PDP 列表"</string>
+ <string name="radioInfo_menu_enableData">"启用数据连接"</string>
+ <string name="radioInfo_menu_disableData">"禁用数据连接"</string>
+ <string name="radioInfo_menu_enableDataOnBoot">"引导时启用数据"</string>
+ <string name="radioInfo_menu_disableDataOnBoot">"引导时禁用数据"</string>
+ <string name="radioInfo_service_in">"在使用中"</string>
+ <string name="radioInfo_service_out">"不在服务区"</string>
+ <string name="radioInfo_service_emergency">"仅紧急呼叫"</string>
+ <string name="radioInfo_service_off">"收音机已关闭"</string>
+ <string name="radioInfo_roaming_in">"漫游"</string>
+ <string name="radioInfo_roaming_not">"无漫游"</string>
+ <string name="radioInfo_phone_idle">"空闲"</string>
+ <string name="radioInfo_phone_ringing">"正在响铃"</string>
+ <string name="radioInfo_phone_offhook">"正在通话"</string>
+ <string name="radioInfo_data_disconnected">"已断开连接"</string>
+ <string name="radioInfo_data_connecting">"正在连接"</string>
+ <string name="radioInfo_data_connected">"已连接"</string>
+ <string name="radioInfo_data_suspended">"已挂起"</string>
+ <string name="radioInfo_unknown">"未知"</string>
+ <string name="radioInfo_display_packets">"pkts"</string>
+ <string name="radioInfo_display_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">"卸下 SD 卡"</string>
+ <string name="sdcard_format">"格式化 SD 卡"</string>
+ <string name="small_font">"小"</string>
+ <string name="medium_font">"中"</string>
+ <string name="large_font">"大"</string>
+ <string name="font_size_save">"确定"</string>
+ <string name="sdcard_setting">"SD 卡"</string>
+ <string name="battery_info_status_label">"电池状态:"</string>
+ <string name="battery_info_scale_label">"电池容量:"</string>
+ <string name="battery_info_level_label">"电池级别:"</string>
+ <string name="battery_info_health_label">"电池健康状态:"</string>
+ <string name="battery_info_technology_label">"电池技术:"</string>
+ <string name="battery_info_voltage_label">"电池电压:"</string>
+ <string name="battery_info_voltage_units">"mV"</string>
+ <string name="battery_info_temperature_label">"电池温度:"</string>
+ <string name="battery_info_temperature_units">"° C"</string>
+ <string name="battery_info_uptime">"自引导以来的时间:"</string>
+ <string name="battery_info_awake_battery">"电池的唤醒时间:"</string>
+ <string name="battery_info_awake_plugged">"充电时的唤醒时间:"</string>
+ <string name="battery_info_screen_on">"屏幕开启时间:"</string>
+ <string name="battery_info_status_unknown">"未知"</string>
+ <string name="battery_info_status_charging">"正在充电"</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">"正在放电"</string>
+ <string name="battery_info_status_not_charging">"未在充电"</string>
+ <string name="battery_info_status_full">"已满"</string>
+ <string name="battery_info_health_unknown">"未知"</string>
+ <string name="battery_info_health_good">"较强"</string>
+ <string name="battery_info_health_overheat">"过热"</string>
+ <string name="battery_info_health_dead">"没电"</string>
+ <string name="battery_info_health_over_voltage">"过电压"</string>
+ <string name="battery_info_health_unspecified_failure">"未知错误"</string>
+ <string name="bluetooth">"蓝牙"</string>
+ <string name="bluetooth_visibility">"可发现"</string>
+ <string name="bluetooth_is_discoverable">"<xliff:g id="DISCOVERABLE_TIME_PERIOD">%1$s</xliff:g> 秒内可发现..."</string>
+ <string name="bluetooth_not_discoverable">"让设备能被搜索到"</string>
+ <string name="bluetooth_devices">"蓝牙设备"</string>
+ <string name="bluetooth_device_name">"设备名称"</string>
+ <string name="bluetooth_name_not_set">"无名称集,使用帐户名"</string>
+ <string name="bluetooth_scan_for_devices">"扫描以找到设备"</string>
+ <string name="bluetooth_disconnect_blank">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>会断开连接。"</string>
+ <string name="bluetooth_connected">"已连接"</string>
+ <string name="bluetooth_disconnected">"已断开连接"</string>
+ <string name="bluetooth_disconnecting">"正在断开连接..."</string>
+ <string name="bluetooth_connecting">"正在连接..."</string>
+ <!-- no translation found for bluetooth_unknown (1905151516611093010) -->
+ <skip />
+ <string name="bluetooth_not_connected">"与此设备配对"</string>
+ <string name="bluetooth_pairing">"正在配对..."</string>
+ <!-- no translation found for bluetooth_paired (1247541089000057726) -->
+ <skip />
+ <string name="bluetooth_device">"免持听筒/耳机"</string>
+ <string name="progress_scanning">"正在扫描"</string>
+ <string name="bluetooth_notif_ticker">"蓝牙配对请求"</string>
+ <string name="bluetooth_notif_title">"配对请求"</string>
+ <string name="bluetooth_notif_message">"选择以与以下对象配对 "</string>
+ <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>
+ <string name="choose_timezone">"选择时区"</string>
+ <string name="display_preview_label">"预览:"</string>
+ <string name="display_font_size_label">"字体大小:"</string>
+ <!-- no translation found for intent_sender_data_label (8363026381459131554) -->
+ <skip />
+ <string name="intent_sender_sendbroadcast_text">"发送<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">"开始 <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">"帐户:"</string>
+ <string name="proxy_clear_text">"清除"</string>
+ <string name="proxy_port_label">"端口"</string>
+ <string name="proxy_defaultView_text">"恢复默认值"</string>
+ <string name="proxy_action_text">"保存"</string>
+ <string name="proxy_hostname_label">"主机名"</string>
+ <string name="proxy_error">"注意"</string>
+ <string name="proxy_error_dismiss">"确定"</string>
+ <string name="proxy_error_invalid_host">"您键入的主机名无效。"</string>
+ <string name="proxy_error_empty_port">"必须完成端口字段。"</string>
+ <string name="proxy_error_empty_host_set_port">"如果主机字段为空,则端口字段必须为空。"</string>
+ <string name="proxy_error_invalid_port">"您键入的端口无效。"</string>
+ <string name="radio_info_signal_location_label">"位置:"</string>
+ <string name="radio_info_neighboring_location_label">"相邻的 CID:"</string>
+ <string name="radio_info_data_attempts_label">"数据尝试:"</string>
+ <string name="radio_info_gprs_service_label">"GPRS 服务:"</string>
+ <string name="radio_info_roaming_label">"漫游:"</string>
+ <string name="radio_info_imei_label">"IMEI:"</string>
+ <string name="radio_info_call_redirect_label">"呼叫重定向:"</string>
+ <string name="radio_info_ppp_resets_label">"引导后已重设的 PPP 数:"</string>
+ <string name="radio_info_gsm_disconnects_label">"GSM 断开连接:"</string>
+ <string name="radio_info_current_network_label">"当前网络:"</string>
+ <string name="radio_info_data_successes_label">"数据成功:"</string>
+ <string name="radio_info_ppp_received_label">"已收到 PPP:"</string>
+ <string name="radio_info_gsm_service_label">"GSM 服务:"</string>
+ <string name="radio_info_signal_strength_label">"信号强度:"</string>
+ <string name="radio_info_call_status_label">"呼叫状态:"</string>
+ <string name="radio_info_ppp_sent_label">"已发送 PPP:"</string>
+ <string name="radio_info_radio_resets_label">"收音机重设:"</string>
+ <string name="radio_info_message_waiting_label">"消息等待:"</string>
+ <string name="radio_info_phone_number_label">"手机号:"</string>
+ <string name="radio_info_band_mode_label">"选择收音机波段"</string>
+ <string name="radio_info_network_type_label">"网络类型:"</string>
+ <string name="radio_info_set_perferred_label">"设置首选的网络类型:"</string>
+ <string name="radio_info_ping_ipaddr">"Ping IpAddr:"</string>
+ <string name="radio_info_ping_hostname">"Ping 主机名 (www.google.com):"</string>
+ <string name="radio_info_http_client_test">"HTTP 客户端测试:"</string>
+ <string name="radio_info_toggle_ciph_label">"切换加密"</string>
+ <string name="ping_test_label">"进行 Ping 测试"</string>
+ <string name="radio_info_smsc_label">"SMSC:"</string>
+ <string name="radio_info_smsc_update_label">"更新"</string>
+ <string name="radio_info_smsc_refresh_label">"刷新"</string>
+ <string name="radio_info_toggle_dns_check_label">"切换 DNS 检查"</string>
+ <string name="band_mode_title">"设置 GSM/UMTS 波段"</string>
+ <string name="band_mode_loading">"正在载入波段列表..."</string>
+ <string name="band_mode_set">"设置"</string>
+ <string name="band_mode_failed">"失败"</string>
+ <string name="band_mode_succeeded">"成功"</string>
+ <string name="sdcard_changes_instructions">"更改会在重新连接 USB 电缆后生效"</string>
+ <string name="sdcard_settings_screen_mass_storage_text">"启用 USB 大容量存储"</string>
+ <string name="sdcard_settings_total_bytes_label">"字节总数:"</string>
+ <string name="sdcard_settings_not_present_status">"无 SD 卡"</string>
+ <string name="sdcard_settings_available_bytes_label">"可用的字节数:"</string>
+ <string name="sdcard_settings_mass_storage_status">"正在将 SD 卡用作大容量存储设备"</string>
+ <string name="sdcard_settings_unmounted_status">"现在可以安全卸下 SD 卡"</string>
+ <string name="sdcard_settings_bad_removal_status">"SD 卡在使用过程中被卸下!"</string>
+ <string name="sdcard_settings_used_bytes_label">"使用的字节数:"</string>
+ <string name="sdcard_settings_scanning_status">"正在扫描 SD 卡以获取媒体..."</string>
+ <string name="sdcard_settings_read_only_status">"装载的 SD 卡为只读"</string>
+ <string name="next_label">"下一步"</string>
+ <string name="language_picker_title">"区域"</string>
+ <string name="select_your_language">"选择语言"</string>
+ <string name="activity_picker_label">"选择活动"</string>
+ <string name="device_info_label">"设备信息"</string>
+ <string name="battery_info_label">"电池信息"</string>
+ <string name="battery_history_label">"电池历史记录"</string>
+ <string name="display_label">"显示"</string>
+ <string name="phone_info_label">"手机信息"</string>
+ <string name="sd_card_settings_label">"SD 卡"</string>
+ <string name="proxy_settings_label">"代理设置"</string>
+ <string name="cancel">"取消"</string>
+ <string name="settings_label">"设置"</string>
+ <string name="airplane_mode">"飞航模式"</string>
+ <string name="airplane_mode_summary">"禁用所有无线连接"</string>
+ <string name="airplane_mode_turning_on">"正在禁用无线连接..."</string>
+ <string name="airplane_mode_turning_off">"正在启用无线连接..."</string>
+ <string name="radio_controls_title">"无线控件"</string>
+ <string name="radio_controls_summary">"管理 Wi-Fi、蓝牙、飞航模式和移动网络"</string>
+ <string name="date_and_time_settings_title">"日期和时间"</string>
+ <string name="date_and_time_settings_summary">"设置日期、时间、时区和格式"</string>
+ <string name="date_time_auto">"自动"</string>
+ <string name="date_time_auto_summaryOn">"使用网络提供的值"</string>
+ <string name="date_time_auto_summaryOff">"使用网络提供的值"</string>
+ <string name="date_time_24hour">"使用 24 小时格式"</string>
+ <string name="date_time_set_time">"设置时间"</string>
+ <string name="date_time_set_timezone">"选择时区"</string>
+ <string name="date_time_set_date">"设置日期"</string>
+ <string name="date_time_date_format">"选择日期格式"</string>
+ <string name="zone_list_menu_sort_alphabetically">"按字母顺序排序"</string>
+ <string name="zone_list_menu_sort_by_timezone">"按时区排序"</string>
+ <string name="security_settings_title">"安全性和位置"</string>
+ <string name="security_settings_summary">"设置我的位置、屏幕解锁、SIM 卡锁定"</string>
+ <string name="security_passwords_title">"密码"</string>
+ <string name="bluetooth_quick_toggle_title">"蓝牙"</string>
+ <string name="bluetooth_quick_toggle_summary">"打开蓝牙"</string>
+ <string name="bluetooth_settings">"蓝牙设置"</string>
+ <string name="bluetooth_settings_title">"蓝牙设置"</string>
+ <string name="bluetooth_settings_summary">"管理连接,设置设备名称和可发现性"</string>
+ <string name="bluetooth_pin_entry">"蓝牙配对请求"</string>
+ <string name="bluetooth_device_info">"蓝牙设备信息"</string>
+ <string name="bluetooth_enter_pin_msg">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"\n\n"键入 PIN 码以配对。"\n"(尝试键入 0000 或 1234。)"</string>
+ <string name="bluetooth_error_title">"注意"</string>
+ <string name="bluetooth_pairing_error_message">"与<xliff:g id="DEVICE_NAME">%1$s</xliff:g>配对时出现问题。"</string>
+ <string name="bluetooth_pairing_pin_error_message">"与<xliff:g id="DEVICE_NAME">%1$s</xliff:g>配对时出现问题,因为键入的 PIN 码不正确。"</string>
+ <string name="bluetooth_connecting_error_message">"连接至<xliff:g id="DEVICE_NAME">%1$s</xliff:g>时出现问题。"</string>
+ <string name="bluetooth_preference_scan_title">"扫描以找到设备"</string>
+ <string name="bluetooth_device_context_connect">"连接"</string>
+ <string name="bluetooth_device_context_disconnect">"断开连接"</string>
+ <string name="bluetooth_device_context_pair_connect">"配对和连接"</string>
+ <string name="bluetooth_device_context_unpair">"取消配对"</string>
+ <string name="bluetooth_device_context_disconnect_unpair">"断开连接并取消配对"</string>
+ <string name="bluetooth_device_context_connect_advanced">"选项..."</string>
+ <string name="bluetooth_connect_specific_profiles_title">"连接至..."</string>
+ <string name="bluetooth_profile_a2dp">"媒体"</string>
+ <string name="bluetooth_profile_headset">"手机"</string>
+ <string name="bluetooth_summary_connected_to_a2dp">"已连接至媒体音频"</string>
+ <string name="bluetooth_summary_connected_to_headset">"已连接至手机音频"</string>
+ <string name="bluetooth_summary_connected_to_a2dp_headset">"已连接至手机和媒体音频"</string>
+ <string name="bluetooth_device_advanced_title">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>选项"</string>
+ <string name="bluetooth_device_advanced_online_mode_title">"连接"</string>
+ <string name="bluetooth_device_advanced_online_mode_summary">"连接至蓝牙设备"</string>
+ <string name="bluetooth_device_advanced_profile_header_title">"个人资料"</string>
+ <string name="bluetooth_a2dp_profile_summary_connected">"已连接至媒体音频"</string>
+ <string name="bluetooth_headset_profile_summary_connected">"已连接至手机音频"</string>
+ <string name="bluetooth_a2dp_profile_summary_use_for">"用于媒体音频"</string>
+ <string name="bluetooth_headset_profile_summary_use_for">"用于手机音频"</string>
+ <string name="wifi">"Wi-Fi"</string>
+ <string name="wifi_quick_toggle_title">"Wi-Fi"</string>
+ <string name="wifi_quick_toggle_summary">"打开 Wi-Fi"</string>
+ <string name="wifi_settings">"Wi-Fi 设置"</string>
+ <string name="wifi_settings_category">"Wi-Fi 设置"</string>
+ <string name="wifi_settings_summary">"设置和管理无线接入点"</string>
+ <string name="forget_network">"忘记"</string>
+ <string name="wifi_status">"状态"</string>
+ <string name="wifi_link_speed">"速度"</string>
+ <string name="wifi_signal_3">"极强"</string>
+ <string name="wifi_signal_2">"较强"</string>
+ <string name="wifi_signal_1">"强"</string>
+ <string name="wifi_signal_0">"弱"</string>
+ <string name="security">"安全性"</string>
+ <string name="wifi_security_open">"开放"</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">"未知"</string>
+ <string name="wifi_security_verbose_open">"打开网络"</string>
+ <string name="wifi_security_verbose_wep">"用 WEP 保护"</string>
+ <string name="wifi_security_verbose_wpa">"通过 WPA 保护"</string>
+ <string name="wifi_security_verbose_wpa2">"通过 WPA2 保护"</string>
+ <string name="ip_address">"IP 地址"</string>
+ <string name="signal">"信号强度"</string>
+ <string name="wifi_starting">"正在打开..."</string>
+ <string name="wifi_stopping">"正在关闭..."</string>
+ <string name="wifi_error">"错误"</string>
+ <string name="error_starting">"无法启动 Wi-Fi"</string>
+ <string name="error_stopping">"无法停止 Wi-Fi"</string>
+ <string name="error_scanning">"无法扫描以找到网络"</string>
+ <string name="error_connecting">"无法连接至网络"</string>
+ <string name="error_saving">"无法保存网络"</string>
+ <string name="connect">"连接"</string>
+ <string name="connect_to_blank">"连接至 <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+ <string name="please_type_passphrase">"无线密码"</string>
+ <string name="please_type_hex_key">"WEP 十六进制键(0-9、A-F)"</string>
+ <string name="wifi_show_password">"显示密码。"</string>
+ <string name="scan_wifi">"扫描"</string>
+ <string name="summary_not_in_range">"不在范围之内"</string>
+ <string name="summary_remembered">"已记忆"</string>
+ <string name="summary_connection_failed">"连接失败,请选择以重试"</string>
+ <string name="wifi_access_points">"Wi-Fi 网络"</string>
+ <string name="wifi_type_ssid">"网络 SSID"</string>
+ <string name="wifi_security">"安全性"</string>
+ <string name="wifi_save_config">"保存"</string>
+ <string name="wifi_password_unchanged">"(未更改)"</string>
+ <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_generic_connection_error">"连接至网络时出现问题。请重试。"</string>
+ <string name="wifi_menu_advanced">"高级"</string>
+ <string name="wifi_ip_settings_titlebar">"IP 设置"</string>
+ <string name="wifi_ip_settings_menu_save">"保存"</string>
+ <string name="wifi_ip_settings_menu_cancel">"取消"</string>
+ <string name="wifi_ip_settings_invalid_ip">"请键入有效的 IP 地址。"</string>
+ <string name="wifi_use_static_ip">"使用静态 IP"</string>
+ <string name="wifi_ip_address">"IP 地址"</string>
+ <string name="wifi_dns1">"DNS 1"</string>
+ <string name="wifi_dns2">"DNS 2"</string>
+ <string name="wifi_gateway">"网关"</string>
+ <string name="wifi_netmask">"网络掩码"</string>
+ <string name="wifi_context_menu_connect">"连接至网络"</string>
+ <string name="wifi_context_menu_forget">"忘记网络"</string>
+ <string name="wifi_context_menu_change_password">"更改密码"</string>
+ <string name="wifi_advanced_titlebar">"高级"</string>
+ <string name="wifi_setting_num_channels_title">"调节域"</string>
+ <string name="wifi_setting_num_channels_summary">"设置要使用的频道数"</string>
+ <string name="wifi_setting_num_channels_error">"设置调节域时出现问题。"</string>
+ <string name="wifi_setting_num_channels_channel_phrase">"<xliff:g id="NUM_CHANNELS">%1$d</xliff:g> 个频道"</string>
+ <string name="wifi_setting_sleep_policy_title">"Wi-Fi 休眠策略"</string>
+ <string name="wifi_setting_sleep_policy_summary">"指定何时从 Wi-Fi 切换到手机数据"</string>
+ <string name="wifi_setting_sleep_policy_error">"设置休眠策略时出现问题。"</string>
+ <string name="wifi_advanced_mac_address_title">"MAC 地址"</string>
+ <string name="fragment_status_scanning">"正在扫描..."</string>
+ <string name="fragment_status_connecting">"正在连接至 <xliff:g id="NETWORK_NAME">%1$s</xliff:g>..."</string>
+ <string name="fragment_status_authenticating">"正在通过 <xliff:g id="NETWORK_NAME">%1$s</xliff:g> 验证..."</string>
+ <string name="fragment_status_obtaining_ip">"正在从 <xliff:g id="NETWORK_NAME">%1$s</xliff:g> 获取 IP 地址..."</string>
+ <string name="fragment_status_connected">"已连接至 <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+ <string name="fragment_status_disconnecting">"正在断开与 <xliff:g id="NETWORK_NAME">%1$s</xliff:g> 的连接..."</string>
+ <string name="fragment_status_disconnected">"已断开连接"</string>
+ <string name="fragment_status_failed">"失败"</string>
+ <string name="status_scanning">"正在扫描..."</string>
+ <string name="status_connecting">"正在连接..."</string>
+ <string name="status_authenticating">"正在验证..."</string>
+ <string name="status_obtaining_ip">"正在获取地址..."</string>
+ <string name="status_connected">"已连接"</string>
+ <string name="status_disconnecting">"正在断开连接..."</string>
+ <string name="status_disconnected">"已断开连接"</string>
+ <string name="status_failed">"失败"</string>
+ <string name="sound_and_display_settings">"声音和显示"</string>
+ <string name="sound_settings">"声音设置"</string>
+ <string name="sound_and_display_settings_summary">"设置铃声、通知、屏幕亮度"</string>
+ <string name="silent_mode_title">"静音模式"</string>
+ <string name="silent_mode_summary">"除媒体和闹钟之外的所有声音都被静音"</string>
+ <string name="ringtone_title">"手机铃声"</string>
+ <string name="ringtone_summary">"设置默认的来电铃声"</string>
+ <string name="ring_volume_title">"响铃音量"</string>
+ <string name="ring_volume_summary">"设置来电音量和通知音量"</string>
+ <string name="vibrate_title">"手机振动"</string>
+ <string name="vibrate_summary">"手机来电时振动"</string>
+ <string name="notification_sound_title">"通知铃声"</string>
+ <string name="notification_sound_summary">"设置默认的通知铃声"</string>
+ <string name="incoming_call_volume_title">"来电音量"</string>
+ <string name="notification_volume_title">"通知音量"</string>
+ <string name="checkbox_notification_same_as_incoming_call">"使用来电音量作为通知音量"</string>
+ <string name="notification_sound_dialog_title">"选择通知铃声"</string>
+ <string name="media_volume_title">"媒体音量"</string>
+ <string name="media_volume_summary">"设置音乐和视频的音量"</string>
+ <string name="dtmf_tone_enable_title">"屏幕按键音"</string>
+ <string name="dtmf_tone_enable_summary_on">"使用拨号面板时发出声音"</string>
+ <string name="dtmf_tone_enable_summary_off">"使用拨号面板时发出声音"</string>
+ <string name="sound_effects_enable_title">"操作音选择"</string>
+ <string name="sound_effects_enable_summary_on">"进行屏幕选择时发出声音"</string>
+ <string name="sound_effects_enable_summary_off">"进行屏幕选择时发出声音"</string>
+ <string name="play_media_notification_sounds_enable_title">"SD 卡通知"</string>
+ <string name="play_media_notification_sounds_enable_summary_on">"禁用 SD 卡通知声音"</string>
+ <string name="play_media_notification_sounds_enable_summary_off">"启用 SD 卡通知声音"</string>
+ <string name="sync_settings">"数据同步"</string>
+ <string name="sync_settings_summary">"选择同步哪些应用程序"</string>
+ <string name="display_settings">"显示设置"</string>
+ <string name="animations_title">"动画"</string>
+ <string name="animations_summary_on">"打开/关闭窗口时显示动画"</string>
+ <string name="animations_summary_off">"打开/关闭窗口时显示动画"</string>
+ <string name="brightness">"亮度"</string>
+ <string name="brightness_summary">"调整屏幕亮度"</string>
+ <string name="screen_timeout">"屏幕待机"</string>
+ <string name="screen_timeout_summary">"在屏幕自动关闭前调整延迟"</string>
+ <string name="sim_lock_settings">"SIM 卡锁定设置"</string>
+ <string name="sim_lock_settings_category">"设置 SIM 卡锁定"</string>
+ <string name="sim_lock_settings_title">"SIM 卡锁定"</string>
+ <string name="sim_pin_toggle">"锁定 SIM 卡"</string>
+ <string name="sim_lock_on">"需要 PIN 码才能使用手机"</string>
+ <string name="sim_lock_off">"需要 PIN 码才能使用手机"</string>
+ <string name="sim_pin_change">"更改 SIM 卡 PIN 码"</string>
+ <string name="sim_enter_pin">"SIM 卡 PIN 码"</string>
+ <string name="sim_enable_sim_lock">"锁定 SIM 卡"</string>
+ <string name="sim_disable_sim_lock">"解锁 SIM 卡"</string>
+ <string name="sim_enter_old">"旧 SIM 卡 PIN 码"</string>
+ <string name="sim_enter_new">"新 SIM 卡 PIN 码"</string>
+ <string name="sim_reenter_new">"重新键入新 PIN 码"</string>
+ <string name="sim_change_pin">"SIM 卡 PIN 码"</string>
+ <string name="sim_bad_pin">"PIN 码不正确!"</string>
+ <string name="sim_pins_dont_match">"PIN 码不匹配!"</string>
+ <string name="sim_change_failed">"无法更改 PIN 码。"\n"PIN 码可能不正确。"</string>
+ <string name="sim_change_succeeded">"SIM 卡 PIN 码更改成功"</string>
+ <string name="sim_lock_failed">"无法更改 SIM 卡锁定状态。"\n"PIN 码可能不正确。"</string>
+ <string name="sim_enter_ok">"确定"</string>
+ <string name="sim_enter_cancel">"取消"</string>
+ <string name="device_info_settings">"手机状态"</string>
+ <string name="system_update_settings_list_item_title">"系统更新"</string>
+ <string name="system_update_settings_list_item_summary">"检查系统更新"</string>
+ <string name="firmware_version">"固件版本"</string>
+ <string name="model_number">"型号"</string>
+ <string name="baseband_version">"Baseband 版本"</string>
+ <string name="kernel_version">"Kernel 版本"</string>
+ <string name="build_number">"内部版本号"</string>
+ <string name="device_info_not_available">"不可用"</string>
+ <string name="device_status_activity_title">"状态"</string>
+ <string name="device_status">"状态"</string>
+ <string name="device_status_summary">"IMEI、手机号、信号等"</string>
+ <string name="storage_settings_title">"SD 卡和手机存储"</string>
+ <string name="storage_settings_summary">"卸下 SD 卡,查看可用的存储空间"</string>
+ <string name="status_number">"手机号"</string>
+ <string name="status_network_type">"手机网络类型"</string>
+ <string name="status_data_state">"手机网络状态"</string>
+ <string name="status_service_state">"服务状态"</string>
+ <string name="status_signal_strength">"信号强度"</string>
+ <string name="status_roaming">"漫游"</string>
+ <string name="status_operator">"网络"</string>
+ <string name="status_wifi_mac_address">"Wi-Fi MAC 地址"</string>
+ <string name="status_bt_address">"蓝牙地址"</string>
+ <string name="status_unavailable">"不可用"</string>
+ <string name="status_network_traffic_stats">"网络使用"</string>
+ <string name="status_network_traffic_summary">"发送:<xliff:g id="NETWORK_TRAFFIC_0">%1$d packets, %2$d bytes%n</xliff:g> 接收:<xliff:g id="NETWORK_TRAFFIC_1">%3$d packets, %4$d bytes</xliff:g>"</string>
+ <string name="status_up_time">"正常使用时间"</string>
+ <string name="status_awake_time">"唤醒时间"</string>
+ <string name="internal_memory">"手机内部存储"</string>
+ <string name="sd_memory">"SD 卡"</string>
+ <string name="memory_available">"可用的空间"</string>
+ <string name="memory_size">"空间总量"</string>
+ <string name="sd_eject">"删除 SD 卡"</string>
+ <string name="sd_eject_summary">"删除 SD 卡以安全移除"</string>
+ <string name="sd_format">"格式化 SD 卡"</string>
+ <string name="sd_format_summary">"格式化(清除)SD 卡"</string>
+ <string name="sd_unavailable">"不可用"</string>
+ <string name="read_only">" (只读)"</string>
+ <string name="battery_status_title">"电池状态"</string>
+ <string name="battery_level_title">"电池级别"</string>
+ <string name="apn_settings">"APN"</string>
+ <string name="apn_edit">"编辑接入点"</string>
+ <string name="apn_not_set">"&lt;未设置&gt;"</string>
+ <string name="apn_name">"名称"</string>
+ <string name="apn_apn">"APN"</string>
+ <string name="apn_http_proxy">"代理"</string>
+ <string name="apn_http_port">"端口"</string>
+ <string name="apn_user">"用户名"</string>
+ <string name="apn_password">"密码"</string>
+ <string name="apn_server">"服务器"</string>
+ <string name="apn_mmsc">"MMSC"</string>
+ <string name="apn_mms_proxy">"彩信代理"</string>
+ <string name="apn_mms_port">"彩信端口"</string>
+ <string name="apn_mcc">"MCC"</string>
+ <string name="apn_mnc">"MNC"</string>
+ <string name="apn_type">"APN 类型"</string>
+ <string name="menu_delete">"删除 APN"</string>
+ <string name="menu_new">"新 APN"</string>
+ <string name="menu_save">"保存"</string>
+ <string name="menu_cancel">"放弃"</string>
+ <string name="error_title">"注意"</string>
+ <string name="error_name_empty">"“名称”字段不能为空。"</string>
+ <string name="error_apn_empty">"APN 不能为空。"</string>
+ <string name="error_mcc_not3">"MCC 字段必须为 3 位数。"</string>
+ <string name="error_mnc_not23">"MNC 字段必须为 2 位数或 3 位数。"</string>
+ <string name="master_clear_title">"已重设出厂数据"</string>
+ <string name="master_clear_summary">"清除手机上的所有数据"</string>
+ <string name="master_clear_desc">"此操作会将手机重设为其初始出厂状态,即清除所有数据和下载的应用程序!"</string>
+ <string name="master_clear_button_text">"重设手机"</string>
+ <string name="master_clear_final_desc">"是否要重设手机以清除所有数据和应用程序?该操作无法撤消!"</string>
+ <string name="master_clear_final_button_text">"清除全部内容"</string>
+ <string name="master_clear_gesture_prompt">"绘制解锁图案"</string>
+ <string name="master_clear_gesture_explanation">"您必须绘制解锁图案才能确认手机重设。"</string>
+ <string name="master_clear_failed">"未执行重设,因为 System Clear 服务不可用。"</string>
+ <string name="media_format_title">"格式化 SD 卡。"</string>
+ <string name="media_format_summary">"清除 SD 卡上的所有数据"</string>
+ <string name="media_format_desc">"该操作会清除手机上的 SD 卡。您会丢失卡上的所有数据。"</string>
+ <string name="media_format_button_text">"格式化 SD 卡"</string>
+ <string name="media_format_final_desc">"是否要格式化 SD 卡,以清除所有媒质?该操作不能撤消!"</string>
+ <string name="media_format_final_button_text">"清除所有内容"</string>
+ <string name="media_format_gesture_prompt">"绘制您的解锁图案"</string>
+ <string name="media_format_gesture_explanation">"您必须绘制解锁图案才能确认格式化 SD 卡。"</string>
+ <string name="call_settings_title">"通话设置"</string>
+ <string name="call_settings_summary">"设置语音信箱、呼叫转移、呼叫等待、呼叫者 ID"</string>
+ <string name="network_settings_title">"移动网络"</string>
+ <string name="network_settings_summary">"为漫游、网络、APN 设置选项"</string>
+ <string name="location_title">"我的位置源"</string>
+ <string name="location_network_based">"使用无线网络"</string>
+ <string name="location_networks_disabled">"使用无线网络查看应用程序(例如 Google 地图)中的位置"</string>
+ <string name="location_neighborhood_level">"通过 Wi-Fi 和/或移动网络确定的位置"</string>
+ <string name="location_gps">"启用 GPS 卫星设置"</string>
+ <string name="location_street_level">"定位时,精确到街道级别(取消选择可节约电量)"</string>
+ <string name="location_gps_disabled">"定位到街道级别(需要更多电量来观看天空)"</string>
+ <string name="about_settings">"关于手机"</string>
+ <string name="about_settings_summary">"查看法律信息、手机状态和软件版本"</string>
+ <string name="legal_information">"法律信息"</string>
+ <string name="contributors_title">"赞助商"</string>
+ <string name="copyright_title">"版权"</string>
+ <string name="license_title">"许可"</string>
+ <string name="terms_title">"条款"</string>
+ <string name="settings_license_activity_title">"开源许可"</string>
+ <string name="settings_license_activity_unavailable">"载入许可时出现问题。"</string>
+ <string name="settings_license_activity_loading">"正在载入..."</string>
+ <string name="lock_settings_title">"屏幕解锁图案"</string>
+ <string name="lockpattern_change_lock_pattern_label">"更改解锁图案"</string>
+ <string name="lockpattern_need_to_unlock">"确认保存的图案"</string>
+ <string name="lockpattern_need_to_unlock_wrong">"很抱歉,请重试:"</string>
+ <string name="lockpattern_recording_intro_header">"绘制解锁图案"</string>
+ <string name="lockpattern_recording_intro_footer">"按“菜单”获取帮助。"</string>
+ <string name="lockpattern_recording_inprogress">"完成后松开手指。"</string>
+ <string name="lockpattern_recording_incorrect_too_short">"连接至少 <xliff:g id="NUMBER">%d</xliff:g> 个点。请重试:"</string>
+ <string name="lockpattern_pattern_entered_header">"图案已记录!"</string>
+ <string name="lockpattern_need_to_confirm">"重新绘制图案以确认:"</string>
+ <string name="lockpattern_pattern_confirmed_header">"您的新解锁图案:"</string>
+ <string name="lockpattern_confirm_button_text">"确认"</string>
+ <string name="lockpattern_restart_button_text">"重新绘制"</string>
+ <string name="lockpattern_retry_button_text">"重试"</string>
+ <string name="lockpattern_continue_button_text">"继续"</string>
+ <string name="lockpattern_settings_title">"解锁图案"</string>
+ <string name="lockpattern_settings_enable_title">"需要图案"</string>
+ <string name="lockpattern_settings_enable_summary">"必须绘制图案才能解锁屏幕"</string>
+ <string name="lockpattern_settings_enable_visible_pattern_title">"使用可见的图案"</string>
+ <string name="lockpattern_settings_enable_tactile_feedback_title">"使用触觉反馈"</string>
+ <string name="lockpattern_settings_choose_lock_pattern">"设置解锁图案"</string>
+ <string name="lockpattern_settings_change_lock_pattern">"更改解锁图案"</string>
+ <string name="lockpattern_settings_help_how_to_record">"如何绘制解锁图案"</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_header">"错误尝试的次数太多!"</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_footer">"<xliff:g id="NUMBER">%d</xliff:g> 秒后重试。"</string>
+ <string name="skip_button_label">"取消"</string>
+ <string name="next_button_label">"下一步"</string>
+ <string name="lock_title">"保护您的手机"</string>
+ <string name="lock_intro_message"><font size="17">"通过创建个人屏幕解锁图案来保护您的手机不受未经授权的使用。"\n<font height="17">\n</font><b>"1"</b>"  在下一屏幕上,观看示例图案的绘制。"\n<font height="17">\n</font><b>"2"</b>"  准备就绪后,绘制您自己的个人解锁图案。尝试不同的图案,但至少要连接四个点。"\n<font height="17">\n</font><b>"3"</b>"  重新绘制您的图案以进行确认。"\n<font height="17">\n</font><b>"可以开始了吗?选择“下一步”"</b>"。"\n<font height="3">\n</font>"要让手机处于不受保护的状态,请选择“取消”。"</font></string>
+ <string name="lock_example_title">"示例图案"</string>
+ <string name="lock_example_message">"连接至少四个点。"\n\n"准备好绘制自己的图案后选择“下一步”。"</string>
+ <string name="manageapplications_settings_title">"管理应用程序"</string>
+ <string name="manageapplications_settings_summary">"管理和删除安装的应用程序"</string>
+ <string name="applications_settings">"应用程序"</string>
+ <string name="applications_settings_summary">"管理应用程序,设置快速启动快捷键"</string>
+ <string name="applications_settings_header">"应用程序设置"</string>
+ <string name="install_applications">"未知源"</string>
+ <string name="install_unknown_applications">"允许安装非市场应用程序"</string>
+ <string name="install_all_warning">"您的手机和个人数据很容易受到来自未知源的应用程序的攻击。您同意单方面承担由于使用这些应用程序而可能对您的手机造成的任何损坏或数据丢失的责任。"</string>
+ <string name="application_info_label">"应用程序信息"</string>
+ <string name="storage_label">"存储"</string>
+ <string name="auto_launch_label">"默认情况下启动"</string>
+ <string name="permissions_label">"权限"</string>
+ <string name="cache_header_label">"缓存"</string>
+ <string name="clear_cache_btn_text">"清除缓存"</string>
+ <string name="cache_size_label">"缓存"</string>
+ <string name="controls_label">"控件"</string>
+ <string name="force_stop">"强制停止"</string>
+ <string name="total_size_label">"总量"</string>
+ <string name="application_size_label">"应用程序"</string>
+ <string name="data_size_label">"数据"</string>
+ <string name="uninstall_text">"卸载"</string>
+ <string name="clear_user_data_text">"清除数据"</string>
+ <string name="auto_launch_enable_text">"您已选择默认情况下启动此应用程序以执行某些操作。"</string>
+ <string name="auto_launch_disable_text">"未设置默认值。"</string>
+ <string name="clear_activities">"清除默认值"</string>
+ <string name="unknown">"未知"</string>
+ <string name="sort_order_alpha">"排序"</string>
+ <string name="sort_order_size">"按大小排序"</string>
+ <string name="manage_space_text">"管理空间"</string>
+ <string name="filter">"过滤"</string>
+ <string name="filter_dlg_title">"选择过滤选项"</string>
+ <string name="filter_apps_all">"全部"</string>
+ <string name="filter_apps_third_party">"第三方"</string>
+ <string name="filter_apps_running">"正在运行"</string>
+ <string name="loading">"正在载入..."</string>
+ <string name="recompute_size">"正在重新计算大小..."</string>
+ <string name="clear_data_dlg_title">"删除"</string>
+ <string name="clear_data_dlg_text">"您保存在此应用程序中的所有信息都会永久删除。"</string>
+ <string name="dlg_ok">"确定"</string>
+ <string name="dlg_cancel">"取消"</string>
+ <string name="app_not_found_dlg_title">"未找到应用程序"</string>
+ <string name="app_not_found_dlg_text">"未在已安装的应用程序的列表中找到该应用程序。"</string>
+ <string name="clear_data_failed">"无法清除应用程序数据。"</string>
+ <string name="security_settings_desc">"此应用程序可访问您手机上的以下内容:"</string>
+ <string name="computing_size">"正在计算..."</string>
+ <string name="invalid_size_value">"无法计算包大小"</string>
+ <string name="empty_list_msg">"您尚未安装任何第三方应用程序。"</string>
+ <string name="language_settings">"区域和文本"</string>
+ <string name="language_settings_summary">"设置区域(语言和区域)、文本输入和自动纠错选项"</string>
+ <string name="language_category">"区域设置"</string>
+ <string name="text_category">"文本设置"</string>
+ <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_caps">"自动大写"</string>
+ <string name="auto_caps_summary">"将句子中的首字母大写"</string>
+ <string name="auto_punctuate">"自动加标点"</string>
+ <string name="hardkeyboard_category">"物理键盘设置"</string>
+ <string name="auto_punctuate_summary">"按两次空格键来插入“。”"</string>
+ <string name="show_password">"可见的密码"</string>
+ <string name="show_password_summary">"键入时显示密码"</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_add_menu_title">"添加"</string>
+ <string name="user_dict_settings_add_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">"用户词典中没有您定义的字词。您可以通过菜单添加字词。"</string>
+ <string name="testing">"测试"</string>
+ <string name="testing_phone_info">"手机信息"</string>
+ <string name="testing_battery_info">"电池信息"</string>
+ <string name="testing_battery_history">"电池历史记录"</string>
+ <string name="quick_launch_title">"快速启动"</string>
+ <string name="quick_launch_summary">"设置启动应用程序的键盘快捷键"</string>
+ <string name="quick_launch_assign_application">"分配应用程序"</string>
+ <string name="quick_launch_no_shortcut">"无快捷键"</string>
+ <string name="quick_launch_shortcut">"搜索 + <xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g>"</string>
+ <string name="quick_launch_clear_dialog_title">"清除"</string>
+ <string name="quick_launch_clear_dialog_message">"会清除快捷键 <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">"确定"</string>
+ <string name="quick_launch_clear_cancel_button">"取消"</string>
+ <string name="quick_launch_display_mode_applications">"应用程序"</string>
+ <string name="quick_launch_display_mode_shortcuts">"快捷键"</string>
+ <string name="input_methods_settings_title">"文本输入"</string>
+ <string name="input_methods_settings_summary">"管理文本输入选项"</string>
+ <string name="input_methods_settings_label_format">"%s 设置"</string>
+ <string name="development_settings_title">"开发"</string>
+ <string name="development_settings_summary">"设置应用程序开发选项"</string>
+ <string name="enable_adb">"USB 调试"</string>
+ <string name="enable_adb_summary">"连接 USB 后启用调试模式"</string>
+ <string name="keep_screen_on">"保持唤醒状态"</string>
+ <string name="keep_screen_on_summary">"充电时屏幕不会休眠"</string>
+ <string name="allow_mock_location">"允许模仿位置"</string>
+ <string name="allow_mock_location_summary">"允许模仿位置"</string>
+ <!-- no translation found for gadget_picker_title (98374951396755811) -->
+ <skip />
+ <!-- no translation found for widget_picker_title (9130684134213467557) -->
+ <skip />
+ <string name="battery_history_details_for">"有关用户 ID %d 的详情"</string>
+ <string name="battery_history_uid">"用户 ID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
+ <string name="battery_history_network_usage">"有关<xliff:g id="APP_NAME">%1$s</xliff:g>的网络使用详情:"</string>
+ <string name="battery_history_bytes_received">"收到的字节数:<xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_sent">"发送的字节数:<xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_total">"总字节数:<xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_cpu_usage">"有关<xliff:g id="APP_NAME">%1$s</xliff:g>的 CPU 使用详情:"</string>
+ <string name="battery_history_user_time">"用户时间:"</string>
+ <string name="battery_history_system_time">"系统时间:"</string>
+ <string name="battery_history_total_time">"合计时间:"</string>
+ <string name="battery_history_starts">"启动次数:<xliff:g id="STARTS">%1$d</xliff:g>"</string>
+ <string name="battery_history_days">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小时 <xliff:g id="MINUTES">%3$d</xliff:g> 分 <xliff:g id="SECONDS">%4$d</xliff:g> 秒"</string>
+ <string name="battery_history_hours">"<xliff:g id="HOURS">%1$d</xliff:g> 小时 <xliff:g id="MINUTES">%2$d</xliff:g> 分 <xliff:g id="SECONDS">%3$d</xliff:g> 秒"</string>
+ <string name="battery_history_minutes">"<xliff:g id="MINUTES">%1$d</xliff:g> 分 <xliff:g id="SECONDS">%2$d</xliff:g> 秒"</string>
+ <string name="battery_history_seconds">"<xliff:g id="SECONDS">%1$d</xliff:g> 秒"</string>
+ <string name="battery_history_packages_sharing_this_uid">"共享该用户 ID 的数据包:"</string>
+ <string name="battery_history_no_data">"没有可用的电池使用数据"</string>
+ <string name="battery_history_sensor">"传感器:"</string>
+ <!-- no translation found for battery_history_wakelock (608683447522396293) -->
+ <skip />
+ <string name="battery_history_used_by_packages">"包使用的传感器:"</string>
+ <string name="battery_history_sensor_usage">"<xliff:g id="PACKAGE">%2$s</xliff:g>使用了 <xliff:g id="COUNT">%1$d</xliff:g> 次"</string>
+ <string name="battery_history_sensor_usage_multi">"由以下某项使用过 <xliff:g id="COUNT">%1$d</xliff:g> 次:"</string>
+ <!-- no translation found for battery_history_awake_label (8449792868990080882) -->
+ <skip />
+ <!-- no translation found for battery_history_screen_on_label (1848936521786339362) -->
+ <skip />
+ <!-- no translation found for battery_history_phone_on_label (700191958853142297) -->
+ <skip />
+ <!-- no translation found for battery_history_awake (4350886665719031057) -->
+ <skip />
+ <string name="battery_history_screen_on">"屏幕开启所花费的时间:"</string>
+ <!-- no translation found for battery_history_phone_on (4891504401623839532) -->
+ <skip />
+ <string name="battery_history_screen_on_battery">"正在使用电池:"</string>
+ <string name="battery_history_screen_on_plugged">"已插入:"</string>
+ <string name="usage_stats_label">"使用情况统计"</string>
+ <string name="testing_usage_stats">"使用情况统计数据"</string>
+ <string name="display_order_text">"排序方式:"</string>
+ <string name="app_name_label">"应用程序"</string>
+ <string name="launch_count_label">"次数"</string>
+ <string name="usage_time_label">"使用时间"</string>
+</resources>
diff --git a/res/values-zh-rTW-nokeys/strings.xml b/res/values-zh-rTW-nokeys/strings.xml
new file mode 100644
index 0000000..4a765cc
--- /dev/null
+++ b/res/values-zh-rTW-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">"管理應用程式"</string>
+</resources>
diff --git a/res/values-zh-rTW/arrays.xml b/res/values-zh-rTW/arrays.xml
new file mode 100644
index 0000000..2ec9ed2
--- /dev/null
+++ b/res/values-zh-rTW/arrays.xml
@@ -0,0 +1,72 @@
+<?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>"美國"</item>
+ <item>"歐洲"</item>
+ <item>"非洲"</item>
+ <item>"亞洲"</item>
+ <item>"澳大利亞"</item>
+ <item>"太平洋"</item>
+ <item>"全部"</item>
+ </string-array>
+ <string-array name="screen_timeout_entries">
+ <item>"15 秒"</item>
+ <item>"30 秒"</item>
+ <item>"1 分鐘"</item>
+ <item>"2 分鐘"</item>
+ <item>"10 分鐘"</item>
+ <item>"從不逾時"</item>
+ </string-array>
+ <string-array name="wifi_security_entries">
+ <item>"自動"</item>
+ <item>"無"</item>
+ <item>"WEP"</item>
+ <item>"WPA Personal"</item>
+ <item>"WPA2 Personal"</item>
+ </string-array>
+ <string-array name="wifi_security_without_auto_entries">
+ <item>"無"</item>
+ <item>"WEP"</item>
+ <item>"WPA Personal"</item>
+ <item>"WPA2 Personal"</item>
+ </string-array>
+ <string-array name="wifi_wep_type">
+ <item>"自動"</item>
+ <item>"WEP ASCII"</item>
+ <item>"WEP (十六進位)"</item>
+ </string-array>
+ <string-array name="wifi_sleep_policy_entries">
+ <item>"關上螢幕時"</item>
+ <item>"插入時絕不"</item>
+ <item>"從不"</item>
+ </string-array>
+ <!-- no translation found for battery_history_type_spinner:0 (2193799199027871385) -->
+ <!-- no translation found for battery_history_type_spinner:1 (6401018715947316517) -->
+ <!-- no translation found for battery_history_type_spinner:2 (188092590354892392) -->
+ <!-- no translation found for battery_history_type_spinner:3 (8414109131222049141) -->
+ <!-- no translation found for battery_history_type_spinner:4 (1327904325081257093) -->
+ <!-- no translation found for battery_history_type_spinner:5 (4832254146664706277) -->
+ <!-- no translation found for battery_history_which_spinner:0 (3451981114763440074) -->
+ <!-- no translation found for battery_history_which_spinner:1 (166936313535197598) -->
+ <!-- no translation found for battery_history_which_spinner:2 (4793941382744963893) -->
+ <string-array name="usage_stats_display_order_types">
+ <item>"使用時間"</item>
+ <item>"啟動計數"</item>
+ <item>"應用程式名稱"</item>
+ </string-array>
+</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..c34d6a5
--- /dev/null
+++ b/res/values-zh-rTW/strings.xml
@@ -0,0 +1,672 @@
+<?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">"未知的"</string>
+ <string name="turn_on_radio">"開啟無線通訊"</string>
+ <string name="turn_off_radio">"關閉無線通訊"</string>
+ <string name="turn_on_qxdm">"啟用 QXDM SD 記錄"</string>
+ <string name="turn_off_qxdm">"停用 QXDM SD 記錄"</string>
+ <string name="radioInfo_menu_viewADN">"檢視 SIM 地址簿"</string>
+ <string name="radioInfo_menu_viewFDN">"檢視限制撥號號碼"</string>
+ <string name="radioInfo_menu_viewSDN">"檢視服務撥號號碼"</string>
+ <string name="radioInfo_menu_getPDP">"取得 PDP 清單"</string>
+ <string name="radioInfo_menu_enableData">"啟用資料連線"</string>
+ <string name="radioInfo_menu_disableData">"停用資料連線"</string>
+ <string name="radioInfo_menu_enableDataOnBoot">"開機顯示資料"</string>
+ <string name="radioInfo_menu_disableDataOnBoot">"開機不顯示資料"</string>
+ <string name="radioInfo_service_in">"服務中"</string>
+ <string name="radioInfo_service_out">"超出服務範圍"</string>
+ <string name="radioInfo_service_emergency">"只能撥打緊急電話"</string>
+ <string name="radioInfo_service_off">"無線通訊關閉"</string>
+ <string name="radioInfo_roaming_in">"漫遊"</string>
+ <string name="radioInfo_roaming_not">"非漫遊"</string>
+ <string name="radioInfo_phone_idle">"閒置"</string>
+ <string name="radioInfo_phone_ringing">"響鈴"</string>
+ <string name="radioInfo_phone_offhook">"通話中"</string>
+ <string name="radioInfo_data_disconnected">"連線中斷"</string>
+ <string name="radioInfo_data_connecting">"連線中"</string>
+ <string name="radioInfo_data_connected">"已連線"</string>
+ <string name="radioInfo_data_suspended">"待命"</string>
+ <string name="radioInfo_unknown">"未知的"</string>
+ <string name="radioInfo_display_packets">"pkts"</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">"卸載 SD 卡"</string>
+ <string name="sdcard_format">"將 SD 卡格式化"</string>
+ <string name="small_font">"小"</string>
+ <string name="medium_font">"中"</string>
+ <string name="large_font">"大"</string>
+ <string name="font_size_save">"確定"</string>
+ <string name="sdcard_setting">"SD 卡"</string>
+ <string name="battery_info_status_label">"電池狀態:"</string>
+ <string name="battery_info_scale_label">"電池計量:"</string>
+ <string name="battery_info_level_label">"電池計量:"</string>
+ <string name="battery_info_health_label">"電池壽命:"</string>
+ <string name="battery_info_technology_label">"電池技術:"</string>
+ <string name="battery_info_voltage_label">"電池電壓:"</string>
+ <string name="battery_info_voltage_units">"mV"</string>
+ <string name="battery_info_temperature_label">"電池溫度:"</string>
+ <string name="battery_info_temperature_units">"° C"</string>
+ <string name="battery_info_uptime">"開機時間:"</string>
+ <string name="battery_info_awake_battery">"電池的清醒時間:"</string>
+ <string name="battery_info_awake_plugged">"充電時的清醒時間:"</string>
+ <string name="battery_info_screen_on">"螢幕顯示時間:"</string>
+ <string name="battery_info_status_unknown">"未知的"</string>
+ <string name="battery_info_status_charging">"充電中"</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">"放電中"</string>
+ <string name="battery_info_status_not_charging">"未充電"</string>
+ <string name="battery_info_status_full">"電力充足"</string>
+ <string name="battery_info_health_unknown">"未知的"</string>
+ <string name="battery_info_health_good">"好"</string>
+ <string name="battery_info_health_overheat">"過熱"</string>
+ <string name="battery_info_health_dead">"電池耗盡"</string>
+ <string name="battery_info_health_over_voltage">"電壓過高"</string>
+ <string name="battery_info_health_unspecified_failure">"未知的錯誤"</string>
+ <string name="bluetooth">"藍牙"</string>
+ <string name="bluetooth_visibility">"無法測得"</string>
+ <string name="bluetooth_is_discoverable">"<xliff:g id="DISCOVERABLE_TIME_PERIOD">%1$s</xliff:g> 秒無法測得..."</string>
+ <string name="bluetooth_not_discoverable">"設定裝置為可偵測"</string>
+ <string name="bluetooth_devices">"藍牙裝置"</string>
+ <string name="bluetooth_device_name">"裝置名稱"</string>
+ <string name="bluetooth_name_not_set">"未設定名稱,使用帳戶名稱"</string>
+ <string name="bluetooth_scan_for_devices">"掃描裝置"</string>
+ <string name="bluetooth_disconnect_blank">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>即將斷線。"</string>
+ <string name="bluetooth_connected">"已連線"</string>
+ <string name="bluetooth_disconnected">"連線中斷"</string>
+ <string name="bluetooth_disconnecting">"連線中斷..."</string>
+ <string name="bluetooth_connecting">"連線中..."</string>
+ <!-- no translation found for bluetooth_unknown (1905151516611093010) -->
+ <skip />
+ <string name="bluetooth_not_connected">"與此裝置配對"</string>
+ <string name="bluetooth_pairing">"配對中..."</string>
+ <!-- no translation found for bluetooth_paired (1247541089000057726) -->
+ <skip />
+ <string name="bluetooth_device">"免持/頭戴式"</string>
+ <string name="progress_scanning">"掃描中"</string>
+ <string name="bluetooth_notif_ticker">"藍牙配對要求"</string>
+ <string name="bluetooth_notif_title">"配對要求"</string>
+ <string name="bluetooth_notif_message">"選取要配對的裝置 "</string>
+ <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>
+ <string name="choose_timezone">"選取時區"</string>
+ <string name="display_preview_label">"預覽:"</string>
+ <string name="display_font_size_label">"字型大小:"</string>
+ <!-- no translation found for intent_sender_data_label (8363026381459131554) -->
+ <skip />
+ <string name="intent_sender_sendbroadcast_text">"傳送 <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">"開始 <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">"帳戶:"</string>
+ <string name="proxy_clear_text">"清除"</string>
+ <string name="proxy_port_label">"連接埠"</string>
+ <string name="proxy_defaultView_text">"還原預設值"</string>
+ <string name="proxy_action_text">"儲存"</string>
+ <string name="proxy_hostname_label">"主機名稱"</string>
+ <string name="proxy_error">"注意"</string>
+ <string name="proxy_error_dismiss">"確定"</string>
+ <string name="proxy_error_invalid_host">"您輸入的主機名稱無效。"</string>
+ <string name="proxy_error_empty_port">"您必須輸入連接埠欄位。"</string>
+ <string name="proxy_error_empty_host_set_port">"若主機欄位空白,連接埠欄位也須空白。"</string>
+ <string name="proxy_error_invalid_port">"您輸入的連接埠無效。"</string>
+ <string name="radio_info_signal_location_label">"位置:"</string>
+ <string name="radio_info_neighboring_location_label">"附近的 CID:"</string>
+ <string name="radio_info_data_attempts_label">"嘗試資料:"</string>
+ <string name="radio_info_gprs_service_label">"GPRS 服務:"</string>
+ <string name="radio_info_roaming_label">"漫遊:"</string>
+ <string name="radio_info_imei_label">"IMEI:"</string>
+ <string name="radio_info_call_redirect_label">"來電轉接:"</string>
+ <string name="radio_info_ppp_resets_label">"開機之後 PPP 重設次數:"</string>
+ <string name="radio_info_gsm_disconnects_label">"GSM 連線中斷:"</string>
+ <string name="radio_info_current_network_label">"目前網路:"</string>
+ <string name="radio_info_data_successes_label">"資料成功傳輸:"</string>
+ <string name="radio_info_ppp_received_label">"PPP 已接收:"</string>
+ <string name="radio_info_gsm_service_label">"GSM 服務:"</string>
+ <string name="radio_info_signal_strength_label">"訊號強度:"</string>
+ <string name="radio_info_call_status_label">"通話狀態:"</string>
+ <string name="radio_info_ppp_sent_label">"PPP 傳送:"</string>
+ <string name="radio_info_radio_resets_label">"無線通訊重設:"</string>
+ <string name="radio_info_message_waiting_label">"簡訊等候中:"</string>
+ <string name="radio_info_phone_number_label">"電話號碼:"</string>
+ <string name="radio_info_band_mode_label">"選取無線通訊頻道"</string>
+ <string name="radio_info_network_type_label">"網路類型:"</string>
+ <string name="radio_info_set_perferred_label">"設定喜好網路類型:"</string>
+ <string name="radio_info_ping_ipaddr">"Ping IP 位址:"</string>
+ <string name="radio_info_ping_hostname">"Ping 主機名稱 (www.google.com.tw):"</string>
+ <string name="radio_info_http_client_test">"HTTP 用戶端測試:"</string>
+ <string name="radio_info_toggle_ciph_label">"選取加密"</string>
+ <string name="ping_test_label">"執行 ping 測試"</string>
+ <string name="radio_info_smsc_label">"SMSC:"</string>
+ <string name="radio_info_smsc_update_label">"更新"</string>
+ <string name="radio_info_smsc_refresh_label">"重新整理"</string>
+ <string name="radio_info_toggle_dns_check_label">"切換 DNS 檢查"</string>
+ <string name="band_mode_title">"設定 GSM/UMTS 頻道"</string>
+ <string name="band_mode_loading">"載入頻道清單..."</string>
+ <string name="band_mode_set">"設定"</string>
+ <string name="band_mode_failed">"失敗"</string>
+ <string name="band_mode_succeeded">"成功"</string>
+ <string name="sdcard_changes_instructions">"USB 纜線重新連接時,變更才會生效"</string>
+ <string name="sdcard_settings_screen_mass_storage_text">"啟用 USB 大量儲存裝置"</string>
+ <string name="sdcard_settings_total_bytes_label">"總容量 (bytes):"</string>
+ <string name="sdcard_settings_not_present_status">"沒有 SD 卡"</string>
+ <string name="sdcard_settings_available_bytes_label">"可用容量 (bytes):"</string>
+ <string name="sdcard_settings_mass_storage_status">"SD 卡已視為 USB 大量儲存裝置"</string>
+ <string name="sdcard_settings_unmounted_status">"您現在可以放心移除 SD 卡"</string>
+ <string name="sdcard_settings_bad_removal_status">"SD 卡仍在使用時便被移除!"</string>
+ <string name="sdcard_settings_used_bytes_label">"使用容量 (bytes):"</string>
+ <string name="sdcard_settings_scanning_status">"從 SD 卡掃描媒體中..."</string>
+ <string name="sdcard_settings_read_only_status">"SD 卡為唯讀狀態"</string>
+ <string name="next_label">"下一步"</string>
+ <string name="language_picker_title">"地區"</string>
+ <string name="select_your_language">"選取語言"</string>
+ <string name="activity_picker_label">"選取動作"</string>
+ <string name="device_info_label">"裝置資訊"</string>
+ <string name="battery_info_label">"電池資訊"</string>
+ <string name="battery_history_label">"電池記錄"</string>
+ <string name="display_label">"顯示"</string>
+ <string name="phone_info_label">"手機資訊"</string>
+ <string name="sd_card_settings_label">"SD 卡"</string>
+ <string name="proxy_settings_label">"Proxy 設定"</string>
+ <string name="cancel">"取消"</string>
+ <string name="settings_label">"設定"</string>
+ <string name="airplane_mode">"飛航模式"</string>
+ <string name="airplane_mode_summary">"停用所有的無線連線"</string>
+ <string name="airplane_mode_turning_on">"停用無線網路連線中..."</string>
+ <string name="airplane_mode_turning_off">"啟動無線網路連線中..."</string>
+ <string name="radio_controls_title">"無線網路控制"</string>
+ <string name="radio_controls_summary">"管理 Wi-Fi、藍牙、飛航模式與行動網路"</string>
+ <string name="date_and_time_settings_title">"日期與時間"</string>
+ <string name="date_and_time_settings_summary">"設定日期、時間、時區與格式"</string>
+ <string name="date_time_auto">"自動"</string>
+ <string name="date_time_auto_summaryOn">"使用網路提供的資料"</string>
+ <string name="date_time_auto_summaryOff">"使用網路提供的資料"</string>
+ <string name="date_time_24hour">"使用 24 小時格式"</string>
+ <string name="date_time_set_time">"設定時間"</string>
+ <string name="date_time_set_timezone">"選取時區"</string>
+ <string name="date_time_set_date">"設定日期"</string>
+ <string name="date_time_date_format">"選取日期格式"</string>
+ <string name="zone_list_menu_sort_alphabetically">"依照字母排序"</string>
+ <string name="zone_list_menu_sort_by_timezone">"依時區排序"</string>
+ <string name="security_settings_title">"安全與位置"</string>
+ <string name="security_settings_summary">"設定我的位置、螢幕解鎖、SIM 卡鎖定"</string>
+ <string name="security_passwords_title">"密碼"</string>
+ <string name="bluetooth_quick_toggle_title">"藍牙"</string>
+ <string name="bluetooth_quick_toggle_summary">"開啟藍牙"</string>
+ <string name="bluetooth_settings">"藍牙設定"</string>
+ <string name="bluetooth_settings_title">"藍牙設定"</string>
+ <string name="bluetooth_settings_summary">"管理連線、設定裝置名稱與可偵測性"</string>
+ <string name="bluetooth_pin_entry">"藍牙配對要求"</string>
+ <string name="bluetooth_device_info">"藍牙裝置資訊"</string>
+ <string name="bluetooth_enter_pin_msg">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"\n\n"輸入 PIN 進行配對。"\n"(請嘗試 0000 或 1234。)"</string>
+ <string name="bluetooth_error_title">"注意"</string>
+ <string name="bluetooth_pairing_error_message">"與<xliff:g id="DEVICE_NAME">%1$s</xliff:g>配對時發生問題。"</string>
+ <string name="bluetooth_pairing_pin_error_message">"由於輸入的 PIN 不正確,因此無法與<xliff:g id="DEVICE_NAME">%1$s</xliff:g>配對。"</string>
+ <string name="bluetooth_connecting_error_message">"連接至<xliff:g id="DEVICE_NAME">%1$s</xliff:g>時發生問題。"</string>
+ <string name="bluetooth_preference_scan_title">"掃描裝置"</string>
+ <string name="bluetooth_device_context_connect">"連線"</string>
+ <string name="bluetooth_device_context_disconnect">"斷線"</string>
+ <string name="bluetooth_device_context_pair_connect">"配對並連線"</string>
+ <string name="bluetooth_device_context_unpair">"解除配對"</string>
+ <string name="bluetooth_device_context_disconnect_unpair">"中斷連接並解除配對"</string>
+ <string name="bluetooth_device_context_connect_advanced">"選項..."</string>
+ <string name="bluetooth_connect_specific_profiles_title">"連線到..."</string>
+ <string name="bluetooth_profile_a2dp">"媒體"</string>
+ <string name="bluetooth_profile_headset">"電話"</string>
+ <string name="bluetooth_summary_connected_to_a2dp">"連接至媒體音訊"</string>
+ <string name="bluetooth_summary_connected_to_headset">"連接至電話音訊"</string>
+ <string name="bluetooth_summary_connected_to_a2dp_headset">"連接至電話和媒體音訊"</string>
+ <string name="bluetooth_device_advanced_title">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> 選項"</string>
+ <string name="bluetooth_device_advanced_online_mode_title">"連線"</string>
+ <string name="bluetooth_device_advanced_online_mode_summary">"連接至藍牙裝置"</string>
+ <string name="bluetooth_device_advanced_profile_header_title">"設定檔"</string>
+ <string name="bluetooth_a2dp_profile_summary_connected">"連接至媒體音訊"</string>
+ <string name="bluetooth_headset_profile_summary_connected">"連接至電話音訊"</string>
+ <string name="bluetooth_a2dp_profile_summary_use_for">"用作媒體音訊"</string>
+ <string name="bluetooth_headset_profile_summary_use_for">"用作電話音訊"</string>
+ <string name="wifi">"Wi-Fi"</string>
+ <string name="wifi_quick_toggle_title">"Wi-Fi"</string>
+ <string name="wifi_quick_toggle_summary">"開啟 Wi-Fi"</string>
+ <string name="wifi_settings">"Wi-Fi 設定"</string>
+ <string name="wifi_settings_category">"Wi-Fi 設定"</string>
+ <string name="wifi_settings_summary">"設定、管理無線存取點"</string>
+ <string name="forget_network">"清除"</string>
+ <string name="wifi_status">"狀態"</string>
+ <string name="wifi_link_speed">"速度"</string>
+ <string name="wifi_signal_3">"極佳"</string>
+ <string name="wifi_signal_2">"好"</string>
+ <string name="wifi_signal_1">"差"</string>
+ <string name="wifi_signal_0">"微弱"</string>
+ <string name="security">"安全性"</string>
+ <string name="wifi_security_open">"開啟"</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">"未知的"</string>
+ <string name="wifi_security_verbose_open">"開啟網路"</string>
+ <string name="wifi_security_verbose_wep">"以 WEP 加密"</string>
+ <string name="wifi_security_verbose_wpa">"以 WPA 保護連線"</string>
+ <string name="wifi_security_verbose_wpa2">"以 WPA2 保護連線"</string>
+ <string name="ip_address">"IP 位址"</string>
+ <string name="signal">"訊號強度"</string>
+ <string name="wifi_starting">"開啟中..."</string>
+ <string name="wifi_stopping">"關閉中..."</string>
+ <string name="wifi_error">"錯誤"</string>
+ <string name="error_starting">"無法開始 Wi-Fi"</string>
+ <string name="error_stopping">"無法停止 Wi-Fi"</string>
+ <string name="error_scanning">"無法掃描網路"</string>
+ <string name="error_connecting">"無法連線到此網路"</string>
+ <string name="error_saving">"無法儲存網路"</string>
+ <string name="connect">"連線"</string>
+ <string name="connect_to_blank">"連線到 <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+ <string name="please_type_passphrase">"無線網路密碼"</string>
+ <string name="please_type_hex_key">"WEP hex key (0-9,A-F)"</string>
+ <string name="wifi_show_password">"顯示密碼"</string>
+ <string name="scan_wifi">"掃描"</string>
+ <string name="summary_not_in_range">"不在範圍內"</string>
+ <string name="summary_remembered">"已記憶"</string>
+ <string name="summary_connection_failed">"連線失敗,選取此項再試一次。"</string>
+ <string name="wifi_access_points">"Wi-Fi 網路"</string>
+ <string name="wifi_type_ssid">"網路 SSID"</string>
+ <string name="wifi_security">"安全性"</string>
+ <string name="wifi_save_config">"儲存"</string>
+ <string name="wifi_password_unchanged">"(未變更)"</string>
+ <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_generic_connection_error">"連線到網路時發生問題。請再試一次。"</string>
+ <string name="wifi_menu_advanced">"進階"</string>
+ <string name="wifi_ip_settings_titlebar">"IP 設定"</string>
+ <string name="wifi_ip_settings_menu_save">"儲存"</string>
+ <string name="wifi_ip_settings_menu_cancel">"取消"</string>
+ <string name="wifi_ip_settings_invalid_ip">"請輸入有效的 IP 位址。"</string>
+ <string name="wifi_use_static_ip">"使用靜態 IP"</string>
+ <string name="wifi_ip_address">"IP 位址"</string>
+ <string name="wifi_dns1">"DNS 1"</string>
+ <string name="wifi_dns2">"DNS 2"</string>
+ <string name="wifi_gateway">"閘道"</string>
+ <string name="wifi_netmask">"網路遮罩"</string>
+ <string name="wifi_context_menu_connect">"連線到網路"</string>
+ <string name="wifi_context_menu_forget">"清除網路"</string>
+ <string name="wifi_context_menu_change_password">"變更密碼"</string>
+ <string name="wifi_advanced_titlebar">"進階"</string>
+ <string name="wifi_setting_num_channels_title">"管理網域"</string>
+ <string name="wifi_setting_num_channels_summary">"設定要使用的頻道號碼"</string>
+ <string name="wifi_setting_num_channels_error">"設定管理網域時發生問題。"</string>
+ <string name="wifi_setting_num_channels_channel_phrase">"<xliff:g id="NUM_CHANNELS">%1$d</xliff:g> 頻道"</string>
+ <string name="wifi_setting_sleep_policy_title">"Wi-Fi 休眠設定"</string>
+ <string name="wifi_setting_sleep_policy_summary">"指定何時要從 Wi-Fi 切換到行動數據"</string>
+ <string name="wifi_setting_sleep_policy_error">"休眠設定時發生問題。"</string>
+ <string name="wifi_advanced_mac_address_title">"MAC 位址"</string>
+ <string name="fragment_status_scanning">"掃描中..."</string>
+ <string name="fragment_status_connecting">"連線到 <xliff:g id="NETWORK_NAME">%1$s</xliff:g>..."</string>
+ <string name="fragment_status_authenticating">"驗證 <xliff:g id="NETWORK_NAME">%1$s</xliff:g> 中..."</string>
+ <string name="fragment_status_obtaining_ip">"從 <xliff:g id="NETWORK_NAME">%1$s</xliff:g> 取得 IP 位址中..."</string>
+ <string name="fragment_status_connected">"已連線到 <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</string>
+ <string name="fragment_status_disconnecting">"從 <xliff:g id="NETWORK_NAME">%1$s</xliff:g> 斷線中..."</string>
+ <string name="fragment_status_disconnected">"連線中斷"</string>
+ <string name="fragment_status_failed">"失敗"</string>
+ <string name="status_scanning">"掃描中..."</string>
+ <string name="status_connecting">"連線中..."</string>
+ <string name="status_authenticating">"認證中..."</string>
+ <string name="status_obtaining_ip">"取得位址中..."</string>
+ <string name="status_connected">"已連線"</string>
+ <string name="status_disconnecting">"連線中斷..."</string>
+ <string name="status_disconnected">"連線中斷"</string>
+ <string name="status_failed">"失敗"</string>
+ <string name="sound_and_display_settings">"音效與顯示"</string>
+ <string name="sound_settings">"音效設定"</string>
+ <string name="sound_and_display_settings_summary">"設定鈴聲、通知與螢幕亮度"</string>
+ <string name="silent_mode_title">"靜音模式"</string>
+ <string name="silent_mode_summary">"將媒體和鬧鐘以外的所有音效靜音"</string>
+ <string name="ringtone_title">"電話鈴聲"</string>
+ <string name="ringtone_summary">"設定預設來電鈴聲"</string>
+ <string name="ring_volume_title">"鈴聲音量"</string>
+ <string name="ring_volume_summary">"設定來電和通知的音量"</string>
+ <string name="vibrate_title">"手機震動"</string>
+ <string name="vibrate_summary">"來電震動"</string>
+ <string name="notification_sound_title">"通知鈴聲"</string>
+ <string name="notification_sound_summary">"設定預設通知鈴聲"</string>
+ <string name="incoming_call_volume_title">"來電音量"</string>
+ <string name="notification_volume_title">"通知音量"</string>
+ <string name="checkbox_notification_same_as_incoming_call">"通知使用來電音量"</string>
+ <string name="notification_sound_dialog_title">"選取通知鈴聲"</string>
+ <string name="media_volume_title">"媒體音量"</string>
+ <string name="media_volume_summary">"設定音樂與影片的音量"</string>
+ <string name="dtmf_tone_enable_title">"觸碰音效"</string>
+ <string name="dtmf_tone_enable_summary_on">"使用撥號面板時播放按鍵音效"</string>
+ <string name="dtmf_tone_enable_summary_off">"使用撥號面板時播放按鍵音效"</string>
+ <string name="sound_effects_enable_title">"可聽見選項"</string>
+ <string name="sound_effects_enable_summary_on">"使用螢幕選取時播放音效"</string>
+ <string name="sound_effects_enable_summary_off">"使用螢幕選取時播放音效"</string>
+ <string name="play_media_notification_sounds_enable_title">"SD 卡通知"</string>
+ <string name="play_media_notification_sounds_enable_summary_on">"停用 SD 卡通知音效"</string>
+ <string name="play_media_notification_sounds_enable_summary_off">"啟用 SD 卡通知音效"</string>
+ <string name="sync_settings">"資料同步化"</string>
+ <string name="sync_settings_summary">"選取要同步處理的應用程式"</string>
+ <string name="display_settings">"顯示設定"</string>
+ <string name="animations_title">"動畫"</string>
+ <string name="animations_summary_on">"開啟/關閉視窗時顯示動畫"</string>
+ <string name="animations_summary_off">"開啟/關閉視窗時顯示動畫"</string>
+ <string name="brightness">"亮度"</string>
+ <string name="brightness_summary">"調整螢幕亮度"</string>
+ <string name="screen_timeout">"螢幕逾時"</string>
+ <string name="screen_timeout_summary">"調整螢幕自動關閉前的延遲時間"</string>
+ <string name="sim_lock_settings">"SIM 卡鎖定設定"</string>
+ <string name="sim_lock_settings_category">"設定 SIM 卡鎖定"</string>
+ <string name="sim_lock_settings_title">"SIM 卡鎖定"</string>
+ <string name="sim_pin_toggle">"鎖定 SIM 卡"</string>
+ <string name="sim_lock_on">"需要輸入 PIN 才可使用電話"</string>
+ <string name="sim_lock_off">"需要輸入 PIN 才可使用電話"</string>
+ <string name="sim_pin_change">"變更 SIM PIN"</string>
+ <string name="sim_enter_pin">"SIM PIN"</string>
+ <string name="sim_enable_sim_lock">"鎖定 SIM 卡"</string>
+ <string name="sim_disable_sim_lock">"解除鎖定 SIM 卡"</string>
+ <string name="sim_enter_old">"舊的 SIM PIN"</string>
+ <string name="sim_enter_new">"新增 SIM PIN"</string>
+ <string name="sim_reenter_new">"重新輸入新的 PIN"</string>
+ <string name="sim_change_pin">"SIM PIN"</string>
+ <string name="sim_bad_pin">"PIN 錯誤!"</string>
+ <string name="sim_pins_dont_match">"PIN 不符合!"</string>
+ <string name="sim_change_failed">"無法變更 PIN。"\n"可能 PIN 不正確。"</string>
+ <string name="sim_change_succeeded">"成功變更 SIM PIN"</string>
+ <string name="sim_lock_failed">"無法變更 SIM 卡鎖定狀態。"\n"可能是 PIN 錯誤。"</string>
+ <string name="sim_enter_ok">"確定"</string>
+ <string name="sim_enter_cancel">"取消"</string>
+ <string name="device_info_settings">"手機狀態"</string>
+ <string name="system_update_settings_list_item_title">"系統更新"</string>
+ <string name="system_update_settings_list_item_summary">"檢查系統更新"</string>
+ <string name="firmware_version">"韌體版本"</string>
+ <string name="model_number">"模組號碼"</string>
+ <string name="baseband_version">"基頻版本"</string>
+ <string name="kernel_version">"核心版本"</string>
+ <string name="build_number">"版本號碼"</string>
+ <string name="device_info_not_available">"無法取得"</string>
+ <string name="device_status_activity_title">"狀態"</string>
+ <string name="device_status">"狀態"</string>
+ <string name="device_status_summary">"IMEI、電話號碼、訊號等。"</string>
+ <string name="storage_settings_title">"SD 卡與手機儲存"</string>
+ <string name="storage_settings_summary">"卸載 SD 卡,檢視可用儲存媒體。"</string>
+ <string name="status_number">"電話號碼"</string>
+ <string name="status_network_type">"行動網路類型"</string>
+ <string name="status_data_state">"行動網路狀態"</string>
+ <string name="status_service_state">"服務狀態"</string>
+ <string name="status_signal_strength">"訊號強度"</string>
+ <string name="status_roaming">"漫遊"</string>
+ <string name="status_operator">"網路"</string>
+ <string name="status_wifi_mac_address">"Wi-Fi MAC 位址"</string>
+ <string name="status_bt_address">"藍牙位址"</string>
+ <string name="status_unavailable">"無法取得"</string>
+ <string name="status_network_traffic_stats">"網路使用率"</string>
+ <string name="status_network_traffic_summary">"已傳送:<xliff:g id="NETWORK_TRAFFIC_0">%1$d packets, %2$d bytes%n</xliff:g>已接收:<xliff:g id="NETWORK_TRAFFIC_1">%3$d packets, %4$d bytes</xliff:g>"</string>
+ <string name="status_up_time">"開機時間"</string>
+ <string name="status_awake_time">"清醒時間"</string>
+ <string name="internal_memory">"手機內部記憶體"</string>
+ <string name="sd_memory">"SD 卡"</string>
+ <string name="memory_available">"可用空間"</string>
+ <string name="memory_size">"總空間"</string>
+ <string name="sd_eject">"卸載 SD 卡"</string>
+ <string name="sd_eject_summary">"必須先卸載 SD 卡,才能安全移除"</string>
+ <string name="sd_format">"將 SD 卡格式化"</string>
+ <string name="sd_format_summary">"將 SD 卡格式化 (清除)"</string>
+ <string name="sd_unavailable">"無法取得資訊"</string>
+ <string name="read_only">" (唯讀)"</string>
+ <string name="battery_status_title">"電池狀態"</string>
+ <string name="battery_level_title">"電池計量"</string>
+ <string name="apn_settings">"APN"</string>
+ <string name="apn_edit">"編輯存取點"</string>
+ <string name="apn_not_set">"(未設定)"</string>
+ <string name="apn_name">"名稱"</string>
+ <string name="apn_apn">"APN"</string>
+ <string name="apn_http_proxy">"Proxy"</string>
+ <string name="apn_http_port">"連接埠"</string>
+ <string name="apn_user">"使用者名稱"</string>
+ <string name="apn_password">"密碼"</string>
+ <string name="apn_server">"伺服器"</string>
+ <string name="apn_mmsc">"MMSC"</string>
+ <string name="apn_mms_proxy">"MMS proxy"</string>
+ <string name="apn_mms_port">"MMS 連接埠"</string>
+ <string name="apn_mcc">"MCC"</string>
+ <string name="apn_mnc">"MNC"</string>
+ <string name="apn_type">"APN 類型"</string>
+ <string name="menu_delete">"刪除 APN"</string>
+ <string name="menu_new">"新增 APN"</string>
+ <string name="menu_save">"儲存"</string>
+ <string name="menu_cancel">"放棄"</string>
+ <string name="error_title">"注意"</string>
+ <string name="error_name_empty">"名稱欄位不能空白。"</string>
+ <string name="error_apn_empty">"APN 不能空白。"</string>
+ <string name="error_mcc_not3">"MCC 欄位必須為 3 位。"</string>
+ <string name="error_mnc_not23">"MNC 欄位至少要 2 或 3 位。"</string>
+ <string name="master_clear_title">"出廠資料重設"</string>
+ <string name="master_clear_summary">"清除手機上所有資料"</string>
+ <string name="master_clear_desc">"此項操作會將手機回復至出廠設定,清除所有資料與下載的應用程式!"</string>
+ <string name="master_clear_button_text">"重設手機"</string>
+ <string name="master_clear_final_desc">"確定要重設手機,清除所有資料與應用程式?此項操作無法復原!"</string>
+ <string name="master_clear_final_button_text">"清除全部"</string>
+ <string name="master_clear_gesture_prompt">"畫出解鎖圖形"</string>
+ <string name="master_clear_gesture_explanation">"請畫出解鎖圖形,以確認重設手機。"</string>
+ <string name="master_clear_failed">"因「系統清除」服務異常,未成功執行重設。"</string>
+ <string name="media_format_title">"將 SD 卡格式化。"</string>
+ <string name="media_format_summary">"清除 SD 卡上的所有資料"</string>
+ <string name="media_format_desc">"此動作將會清除手機中 SD 卡上的所有資料。SD 卡上的所有資料將會遺失!"</string>
+ <string name="media_format_button_text">"將 SD 卡格式化"</string>
+ <string name="media_format_final_desc">"要將 SD 卡格式化、清除所有媒體嗎?此動作無法復原!"</string>
+ <string name="media_format_final_button_text">"全部清除"</string>
+ <string name="media_format_gesture_prompt">"畫出解鎖圖形"</string>
+ <string name="media_format_gesture_explanation">"您必須畫出解鎖圖形,以確認將 SD 卡格式化。"</string>
+ <string name="call_settings_title">"通話設定"</string>
+ <string name="call_settings_summary">"設定語音信箱、來電指定轉接、話中插接、本機號碼"</string>
+ <string name="network_settings_title">"行動網路"</string>
+ <string name="network_settings_summary">"設定漫遊、網路、APN 選項"</string>
+ <string name="location_title">"我的位置來源"</string>
+ <string name="location_network_based">"使用無線網路"</string>
+ <string name="location_networks_disabled">"使用無線網路,在應用程式中查詢位置 (例如 Google 地圖)"</string>
+ <string name="location_neighborhood_level">"位置根據 Wi-Fi 與/或行動網路決定"</string>
+ <string name="location_gps">"啟用 GPS 衛星接收器"</string>
+ <string name="location_street_level">"定位時,精準度設定為街道層級 (不選此項較省電)"</string>
+ <string name="location_gps_disabled">"切換到街道檢視 (需要更多電力及天候允許)"</string>
+ <string name="about_settings">"關於手機"</string>
+ <string name="about_settings_summary">"檢視法律資訊、手機狀態、軟體版本"</string>
+ <string name="legal_information">"法律資訊"</string>
+ <string name="contributors_title">"貢獻者"</string>
+ <string name="copyright_title">"版權"</string>
+ <string name="license_title">"授權"</string>
+ <string name="terms_title">"條款及細則"</string>
+ <string name="settings_license_activity_title">"開啟原始授權"</string>
+ <string name="settings_license_activity_unavailable">"載入授權時發生問題"</string>
+ <string name="settings_license_activity_loading">"載入中..."</string>
+ <string name="lock_settings_title">"螢幕解鎖圖形"</string>
+ <string name="lockpattern_change_lock_pattern_label">"變更解鎖圖形"</string>
+ <string name="lockpattern_need_to_unlock">"確認儲存的圖形"</string>
+ <string name="lockpattern_need_to_unlock_wrong">"抱歉,請再試一次:"</string>
+ <string name="lockpattern_recording_intro_header">"畫出解鎖圖形"</string>
+ <string name="lockpattern_recording_intro_footer">"按下 [選單] 尋求幫助。"</string>
+ <string name="lockpattern_recording_inprogress">"完成後手指離開。"</string>
+ <string name="lockpattern_recording_incorrect_too_short">"請連接至少 <xliff:g id="NUMBER">%d</xliff:g> 點。再試一次:"</string>
+ <string name="lockpattern_pattern_entered_header">"圖形已記錄!"</string>
+ <string name="lockpattern_need_to_confirm">"再次畫出圖形以確認:"</string>
+ <string name="lockpattern_pattern_confirmed_header">"新的解鎖圖形:"</string>
+ <string name="lockpattern_confirm_button_text">"確認"</string>
+ <string name="lockpattern_restart_button_text">"重畫"</string>
+ <string name="lockpattern_retry_button_text">"重試"</string>
+ <string name="lockpattern_continue_button_text">"繼續"</string>
+ <string name="lockpattern_settings_title">"解鎖圖形"</string>
+ <string name="lockpattern_settings_enable_title">"需要解鎖圖形"</string>
+ <string name="lockpattern_settings_enable_summary">"必須畫出解鎖圖形以解鎖螢幕"</string>
+ <string name="lockpattern_settings_enable_visible_pattern_title">"使用可見圖形"</string>
+ <string name="lockpattern_settings_enable_tactile_feedback_title">"使用觸覺回饋"</string>
+ <string name="lockpattern_settings_choose_lock_pattern">"設定解鎖圖形"</string>
+ <string name="lockpattern_settings_change_lock_pattern">"變更解鎖圖形"</string>
+ <string name="lockpattern_settings_help_how_to_record">"如何畫出解鎖圖形"</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_header">"錯誤嘗試太多!"</string>
+ <string name="lockpattern_too_many_failed_confirmation_attempts_footer">"<xliff:g id="NUMBER">%d</xliff:g> 秒後再試一次。"</string>
+ <string name="skip_button_label">"取消"</string>
+ <string name="next_button_label">"下一步"</string>
+ <string name="lock_title">"手機安全設定"</string>
+ <string name="lock_intro_message"><font size="17">" 建立個人螢幕解鎖圖形,避免您的手機在未授權狀態下被使用。"\n<font height="17">\n</font><b>" 1 "</b>"  在下個螢幕中,檢視範例圖形繪畫示範。"\n<font height="17">\n</font><b>" 2 "</b>"  您準備好後,便可畫出個人解鎖圖形。您可以嘗試不同的圖形,但需要至少連接四點。"\n<font height="17">\n</font><b>" 3 "</b>"  再次畫出圖形以確認。"\n<font height="17">\n</font><b>" 準備開始了嗎?選取 [下一步]"</b>"。"\n<font height="3">\n</font>" 若要保持未保護狀態,請選取 [取消]。"</font></string>
+ <string name="lock_example_title">"範例圖形"</string>
+ <string name="lock_example_message">"畫出圖形時,需要至少連接四個點。"\n" "\n"準備好要畫出您的解鎖圖形時,請選取 [下一步]。"</string>
+ <string name="manageapplications_settings_title">"管理應用程式"</string>
+ <string name="manageapplications_settings_summary">"管理及移除已安裝的應用程式"</string>
+ <string name="applications_settings">"應用程式"</string>
+ <string name="applications_settings_summary">"管理應用程式,設定快速啟動捷徑"</string>
+ <string name="applications_settings_header">"應用程式設定"</string>
+ <string name="install_applications">"未知的來源"</string>
+ <string name="install_unknown_applications">"允許安裝非市場應用程式"</string>
+ <string name="install_all_warning">"如果是未知來源的應用程式,便比較可能攻擊您的手機與個人資訊。若使用這些應用程式造成手機受損或資料遺失,您必須為此完全負責。"</string>
+ <string name="application_info_label">"應用程式資訊"</string>
+ <string name="storage_label">"儲存"</string>
+ <string name="auto_launch_label">"依預設值啟動"</string>
+ <string name="permissions_label">"許可"</string>
+ <string name="cache_header_label">"快取"</string>
+ <string name="clear_cache_btn_text">"清除快取"</string>
+ <string name="cache_size_label">"快取"</string>
+ <string name="controls_label">"控制項"</string>
+ <string name="force_stop">"強制停止"</string>
+ <string name="total_size_label">"總共"</string>
+ <string name="application_size_label">"應用程式"</string>
+ <string name="data_size_label">"資料"</string>
+ <string name="uninstall_text">"解除安裝"</string>
+ <string name="clear_user_data_text">"清除資料"</string>
+ <string name="auto_launch_enable_text">"您已設定在某些動作下啟動此應用程式。"</string>
+ <string name="auto_launch_disable_text">"沒有預設值。"</string>
+ <string name="clear_activities">"清除預設值"</string>
+ <string name="unknown">"未知的"</string>
+ <string name="sort_order_alpha">"排序"</string>
+ <string name="sort_order_size">"依大小排序"</string>
+ <string name="manage_space_text">"管理空間"</string>
+ <string name="filter">"篩選"</string>
+ <string name="filter_dlg_title">"選取篩選選項"</string>
+ <string name="filter_apps_all">"全部"</string>
+ <string name="filter_apps_third_party">"第三方"</string>
+ <string name="filter_apps_running">"執行中"</string>
+ <string name="loading">"載入中..."</string>
+ <string name="recompute_size">"重新計算大小..."</string>
+ <string name="clear_data_dlg_title">"刪除"</string>
+ <string name="clear_data_dlg_text">"所有儲存在此應用程式的資訊都會被永久刪除。"</string>
+ <string name="dlg_ok">"確定"</string>
+ <string name="dlg_cancel">"取消"</string>
+ <string name="app_not_found_dlg_title">"找不到應用程式"</string>
+ <string name="app_not_found_dlg_text">"在已安裝程式清單中找不到此應用程式。"</string>
+ <string name="clear_data_failed">"無法清除應用程式資料。"</string>
+ <string name="security_settings_desc">"此應用程式可存取您電話中的下列項目:"</string>
+ <string name="computing_size">"計算中..."</string>
+ <string name="invalid_size_value">"無法計算封裝大小"</string>
+ <string name="empty_list_msg">"您尚未安裝任何的第三方應用程式。"</string>
+ <string name="language_settings">"地區與文字"</string>
+ <string name="language_settings_summary">"設定地區 (語言和地區)、文字輸入和文字自動校正選項"</string>
+ <string name="language_category">"地區設定"</string>
+ <string name="text_category">"文字設定"</string>
+ <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_caps">"自動大寫"</string>
+ <string name="auto_caps_summary">"句子首字字母大寫"</string>
+ <string name="auto_punctuate">"自動標點"</string>
+ <string name="hardkeyboard_category">"實體鍵盤設定"</string>
+ <string name="auto_punctuate_summary">"按空白鍵兩次可插入「.」"</string>
+ <string name="show_password">"密碼可見"</string>
+ <string name="show_password_summary">"顯示輸入的密碼"</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_add_menu_title">"新增"</string>
+ <string name="user_dict_settings_add_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">"您的使用者字典中沒有任何字詞。您可以透過選單新增字詞。"</string>
+ <string name="testing">"測試中"</string>
+ <string name="testing_phone_info">"手機資訊"</string>
+ <string name="testing_battery_info">"電池資訊"</string>
+ <string name="testing_battery_history">"電池記錄"</string>
+ <string name="quick_launch_title">"快速啟動"</string>
+ <string name="quick_launch_summary">"設定啟動應用程式的鍵盤捷徑"</string>
+ <string name="quick_launch_assign_application">"分配應用程式"</string>
+ <string name="quick_launch_no_shortcut">"沒有捷徑"</string>
+ <string name="quick_launch_shortcut">"搜尋 + <xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g>"</string>
+ <string name="quick_launch_clear_dialog_title">"清除"</string>
+ <string name="quick_launch_clear_dialog_message">"<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">"確定"</string>
+ <string name="quick_launch_clear_cancel_button">"取消"</string>
+ <string name="quick_launch_display_mode_applications">"應用程式"</string>
+ <string name="quick_launch_display_mode_shortcuts">"捷徑"</string>
+ <string name="input_methods_settings_title">"文字輸入法"</string>
+ <string name="input_methods_settings_summary">"管理輸入法選項"</string>
+ <string name="input_methods_settings_label_format">"%s 設定"</string>
+ <string name="development_settings_title">"開發"</string>
+ <string name="development_settings_summary">"設定應用程式開發的選項"</string>
+ <string name="enable_adb">"USB 除錯中"</string>
+ <string name="enable_adb_summary">"USB 連線時進入除錯模式"</string>
+ <string name="keep_screen_on">"保持清醒"</string>
+ <string name="keep_screen_on_summary">"充電時螢幕不會進入休眠"</string>
+ <string name="allow_mock_location">"允許模擬位置"</string>
+ <string name="allow_mock_location_summary">"允許模擬位置"</string>
+ <!-- no translation found for gadget_picker_title (98374951396755811) -->
+ <skip />
+ <!-- no translation found for widget_picker_title (9130684134213467557) -->
+ <skip />
+ <string name="battery_history_details_for">"UID %d 的詳細資料"</string>
+ <string name="battery_history_uid">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
+ <string name="battery_history_network_usage">"<xliff:g id="APP_NAME">%1$s</xliff:g> 的網路使用率詳細資料:"</string>
+ <string name="battery_history_bytes_received">"已接收的位元組數:<xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_sent">"已傳送的位元組數:<xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_bytes_total">"總容量 (bytes):<xliff:g id="BYTES">%1$d</xliff:g>"</string>
+ <string name="battery_history_cpu_usage">"<xliff:g id="APP_NAME">%1$s</xliff:g> 的 CPU 使用率詳細資料:"</string>
+ <string name="battery_history_user_time">"使用者時間:"</string>
+ <string name="battery_history_system_time">"系統時間:"</string>
+ <string name="battery_history_total_time">"總計時間:"</string>
+ <string name="battery_history_starts">"啟動次數:<xliff:g id="STARTS">%1$d</xliff:g>"</string>
+ <string name="battery_history_days">"<xliff:g id="DAYS">%1$d</xliff:g> 天,<xliff:g id="HOURS">%2$d</xliff:g> 小時,<xliff:g id="MINUTES">%3$d</xliff:g> 分鐘,<xliff:g id="SECONDS">%4$d</xliff:g> 秒"</string>
+ <string name="battery_history_hours">"<xliff:g id="HOURS">%1$d</xliff:g> 小時,<xliff:g id="MINUTES">%2$d</xliff:g> 分鐘,<xliff:g id="SECONDS">%3$d</xliff:g> 秒"</string>
+ <string name="battery_history_minutes">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘,<xliff:g id="SECONDS">%2$d</xliff:g> 秒"</string>
+ <string name="battery_history_seconds">"<xliff:g id="SECONDS">%1$d</xliff:g> 秒"</string>
+ <string name="battery_history_packages_sharing_this_uid">"共用此 UID 的封裝:"</string>
+ <string name="battery_history_no_data">"沒有電池使用資料"</string>
+ <string name="battery_history_sensor">"感應器:"</string>
+ <!-- no translation found for battery_history_wakelock (608683447522396293) -->
+ <skip />
+ <string name="battery_history_used_by_packages">"程式使用的感應器:"</string>
+ <string name="battery_history_sensor_usage">"使用次數:<xliff:g id="COUNT">%1$d</xliff:g>,使用的封裝:<xliff:g id="PACKAGE">%2$s</xliff:g>"</string>
+ <string name="battery_history_sensor_usage_multi">"使用次數:<xliff:g id="COUNT">%1$d</xliff:g>,使用者為下列其中之一:"</string>
+ <!-- no translation found for battery_history_awake_label (8449792868990080882) -->
+ <skip />
+ <!-- no translation found for battery_history_screen_on_label (1848936521786339362) -->
+ <skip />
+ <!-- no translation found for battery_history_phone_on_label (700191958853142297) -->
+ <skip />
+ <!-- no translation found for battery_history_awake (4350886665719031057) -->
+ <skip />
+ <string name="battery_history_screen_on">"螢幕開啟時間:"</string>
+ <!-- no translation found for battery_history_phone_on (4891504401623839532) -->
+ <skip />
+ <string name="battery_history_screen_on_battery">"使用電池:"</string>
+ <string name="battery_history_screen_on_plugged">"插入時間:"</string>
+ <string name="usage_stats_label">"使用統計資料"</string>
+ <string name="testing_usage_stats">"使用統計資料"</string>
+ <string name="display_order_text">"排序依據:"</string>
+ <string name="app_name_label">"應用程式"</string>
+ <string name="launch_count_label">"計數"</string>
+ <string name="usage_time_label">"使用時間"</string>
+</resources>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
new file mode 100644
index 0000000..d9480c2
--- /dev/null
+++ b/res/values/arrays.xml
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2007 The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources>
+ <!-- Choices for timezone picker first level.
+ These values will be used as search terms for TimeZone displayName
+ strings. --> <skip />
+ <!-- The time zone picker screen has two levels. The first level allows the user to choose a region. -->
+ <string-array name="timezone_filters">
+ <!-- The next level of the time zoner picker should show time zones from the Americas. -->
+ <item>America</item>
+ <!-- The next level of the time zoner picker should show time zones from Europe. -->
+ <item>Europe</item>
+ <!-- The next level of the time zoner picker should show time zones from Africa. -->
+ <item>Africa</item>
+ <!-- The next level of the time zoner picker should show time zones from Asia. -->
+ <item>Asia</item>
+ <!-- The next level of the time zoner picker should show time zones from Australia. -->
+ <item>Australia</item>
+ <!-- The next level of the time zoner picker should show time zones from Pacific. -->
+ <item>Pacific</item>
+ <!-- The next level of the time zoner picker should show time zones from ALL regions. -->
+ <item>All</item>
+ </string-array>
+
+ <!-- There is a setting to control the format of dates displayed throughout the system. This is in the Date & Time Settings screen. Unfortunately, these cannot be changed at all. --> <skip />
+ <!-- Do not translate. This is fed directly to the formatter. -->
+ <string-array name="date_format_values">
+ <!-- Do not translate. This is fed directly to the formatter. -->
+ <item>MM-dd-yyyy</item>
+ <!-- Do not translate. This is fed directly to the formatter. -->
+ <item>dd-MM-yyyy</item>
+ <!-- Do not translate. This is fed directly to the formatter. -->
+ <item>MMM dd, yyyy</item>
+ <!-- Do not translate. This is fed directly to the formatter. -->
+ <item>dd-MMM-yyyy</item>
+ <!-- Do not translate. This is fed directly to the formatter. -->
+ <item>yyyy-MM-dd</item>
+ </string-array>
+
+ <!-- Display settings. The delay in inactivity before the screen is turned off. These are shown ain a list dialog. -->
+ <string-array name="screen_timeout_entries">
+ <item>15 seconds</item>
+ <item>30 seconds</item>
+ <item>1 minute</item>
+ <item>2 minutes</item>
+ <item>10 minutes</item>
+ <!-- Choosing this means the screen will only turn off after the user manually does so. There will be no inactivity check. -->
+ <item>Never timeout</item>
+ </string-array>
+
+ <!-- Do not translate. -->
+ <string-array name="screen_timeout_values">
+ <!-- Do not translate. -->
+ <item>15000</item>
+ <!-- Do not translate. -->
+ <item>30000</item>
+ <!-- Do not translate. -->
+ <item>60000</item>
+ <!-- Do not translate. -->
+ <item>120000</item>
+ <!-- Do not translate. -->
+ <item>600000</item>
+ <!-- Do not translate. -->
+ <item>-1</item>
+ </string-array>
+
+ <!-- Wi-Fi settings -->
+
+ <!-- Match this with code. --> <skip />
+ <!-- Wi-Fi settings. The type of security a Wi-Fi network has. The user can choose this when he adds a manual network, or configures an existing network. -->
+ <string-array name="wifi_security_entries">
+ <!-- Let the phone figure out the security type auutomatically. -->
+ <item>Auto</item>
+ <!-- The Wi-Fi network does not have any security. -->
+ <item>None</item>
+ <!-- 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>
+ <!-- The Wi-Fi network has WPA2 personal security. WPA Personal is a tech term, and might be better left untranslated? -->
+ <item>WPA2 Personal</item>
+ </string-array>
+
+ <!-- Match this with code. --> <skip />
+ <!-- Wi-Fi settings. The type of security a Wi-Fi network has. The user can choose this when he adds a manual network, or configures an existing network. -->
+ <string-array name="wifi_security_without_auto_entries">
+ <!-- The Wi-Fi network does not have any security. -->
+ <item>None</item>
+ <!-- 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>
+ <!-- The Wi-Fi network has WPA2 personal security. WPA Personal is a tech term, and might be better left untranslated? -->
+ <item>WPA2 Personal</item>
+ </string-array>
+
+ <!-- Match this with code. --> <skip />
+ <!-- Wi-Fi settings. Presented as a list dialog to the user. He chooses the type of WEP key he entered. -->
+ <string-array name="wifi_wep_type">
+ <!-- This means the phone should figure out the type automatically the best it can. -->
+ <item>Auto</item>
+ <!-- Do not translate. -->
+ <item>WEP ASCII</item>
+ <!-- WEP key that is in hexadecimal. -->
+ <item>WEP hexadecimal</item>
+ </string-array>
+
+ <!-- Wi-Fi settings. Presented as a list dialog to the user to choose the Wi-Fi sleep policy. -->
+ <string-array name="wifi_sleep_policy_entries">
+ <!-- Wi-Fi should go to sleep when the screen turns off. -->
+ <item>When screen turns off</item>
+ <!-- When plugged in, never go to sleep. When on battery, go to sleep when screen turns off. -->
+ <item>Never when plugged in</item>
+ <!-- Never go to sleep. -->
+ <item>Never</item>
+ </string-array>
+
+ <!-- Match with wifi_sleep_policy_entries and the values of the settings in Settings class. --> <skip />
+ <!-- Do not translate. -->
+ <string-array name="wifi_sleep_policy_values">
+ <!-- Do not translate. -->
+ <item>0</item>
+ <!-- Do not translate. -->
+ <item>1</item>
+ <!-- Do not translate. -->
+ <item>2</item>
+ </string-array>
+
+ <!-- Match with constants in BatteryHistory class -->
+ <string-array name="battery_history_type_spinner">
+ <item>CPU usage</item>
+ <item>Network usage</item>
+ <item>GPS usage</item>
+ <item>Sensor usage</item>
+ <item>Partial wake usage</item>
+ <item>Other usage</item>
+ </string-array>
+
+ <!-- Match with constants in BatteryStats class -->
+ <string-array name="battery_history_which_spinner">
+ <item>Since last unplugged</item>
+ <item>Total since boot</item>
+ <item>Total in all time</item>
+ </string-array>
+
+ <!-- Display options for UsageStats class -->
+ <string-array name="usage_stats_display_order_types">
+ <item>Usage Time</item>
+ <item>Launch Count</item>
+ <item>Application Name</item>
+ </string-array>
+
+</resources>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
new file mode 100644
index 0000000..9bf79f9
--- /dev/null
+++ b/res/values/attrs.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+ <declare-styleable name="WifiEncryptionState">
+ <attr name="state_encrypted" format="boolean" />
+ </declare-styleable>
+</resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
new file mode 100644
index 0000000..a170c92
--- /dev/null
+++ b/res/values/colors.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+ <color name="black">#000</color>
+</resources>
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
new file mode 100644
index 0000000..ecf6e02
--- /dev/null
+++ b/res/values/strings.xml
@@ -0,0 +1,1503 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- Device Info --> <skip />
+ <!-- Device Info screen. Used for a status item's value when the proper value is not known -->
+ <string name="device_info_default">Unknown</string>
+
+ <!-- Phone info -->
+ <!-- Phone Info screen. Button label to turn on the radio . Only shown in diagnostic screen, so precise translation is not needed. -->
+ <string name="turn_on_radio">Turn on radio</string>
+ <!-- Phone Info screen. Button label to turn off the radio . Only shown in diagnostic screen, so precise translation is not needed. -->
+ <string name="turn_off_radio">Turn off radio</string>
+ <!-- Phone Info screen. Button label to turn on the log for QXDM SD . Only shown in diagnostic screen, so precise translation is not needed. -->
+ <string name="turn_on_qxdm">Enable QXDM SD log</string>
+ <!-- Phone Info screen. Button label to turn off the log for QXDM SD . Only shown in diagnostic screen, so precise translation is not needed. -->
+ <string name="turn_off_qxdm">Disable QXDM SD log</string>
+
+ <!-- Phone Info screen. Menu item label. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_menu_viewADN">View SIM address book</string>
+ <!-- Phone Info screen. Menu item label. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_menu_viewFDN">View Fixed Dialing Numbers</string>
+ <!-- Phone Info screen. Menu item label. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_menu_viewSDN">View Service Dialing Numbers</string>
+ <!-- Phone Info screen. Menu item label. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_menu_getPDP">Get PDP list</string>
+ <!-- Phone Info screen. Menu item label. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_menu_enableData">Enable data connection</string>
+ <!-- Phone Info screen. Menu item label. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_menu_disableData">Disable data connection</string>
+ <!-- Phone Info screen. Menu item label. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_menu_enableDataOnBoot">Enable data on boot</string>
+ <!-- Phone Info screen. Menu item label. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_menu_disableDataOnBoot">Disable data on boot</string>
+
+ <!-- Phone Info screen. Status label. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_service_in">In service</string>
+ <!-- Phone Info screen. Status label. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_service_out">Out of service</string>
+ <!-- Phone Info screen. Status label. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_service_emergency">Emergency calls only</string>
+ <!-- Phone Info screen. Status label. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_service_off">Radio off</string>
+
+ <!-- Phone Info screen. Status label. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_roaming_in">Roaming</string>
+ <!-- Phone Info screen. Status label. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_roaming_not">Not roaming</string>
+
+ <!-- Phone Info screen. Status label. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_phone_idle">Idle</string>
+ <!-- Phone Info screen. Status label. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_phone_ringing">Ringing</string>
+ <!-- Phone Info screen. Status label. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_phone_offhook">Call in progress</string>
+
+ <!-- Phone Info screen. Status label. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_data_disconnected">Disconnected</string>
+ <!-- Phone Info screen. Status label. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_data_connecting">Connecting</string>
+ <!-- Phone Info screen. Status label. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_data_connected">Connected</string>
+ <!-- Phone Info screen. Status label. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_data_suspended">Suspended</string>
+
+ <!-- Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_unknown">unknown</string>
+ <!-- Phone Info screen. Units shown after a value. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_display_packets">pkts</string>
+ <!-- Phone Info screen. Units shown after a value. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_display_bytes">bytes</string>
+ <!-- Phone Info screen. Units shown after a value. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_display_dbm">dBm</string>
+ <!-- Phone Info screen. Units shown after a value. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_display_asu">asu</string>
+ <!-- Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_lac">LAC</string>
+ <!-- Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radioInfo_cid">CID</string>
+
+ <!-- Used for diagnostic info screens, precise translation isn't needed. Unmounts the SD card from the phone, meaning it will become available for an attached computer -->
+ <string name="sdcard_unmount">Unmount SD card</string>
+
+ <!-- Used for diagnostic info screens, precise translation isn't needed. Formats the SD card in the phone, meaning it will be erased and reformatted -->
+ <string name="sdcard_format">Format SD card</string>
+
+ <!-- choice for the font size spinner -->
+ <string name="small_font">Small</string>
+ <!-- choice for the font size spinner -->
+ <string name="medium_font">Medium</string>
+ <!-- choice for the font size spinner -->
+ <string name="large_font">Large</string>
+
+ <!-- Do not translate. label for font size preview. Does not need to be translated. -->
+ <string name="font_size_preview_text">Servez à ce monsieur une bière et des kiwis.</string>
+ <!-- Button. Chosen when they want to save the chosen text size. -->
+ <string name="font_size_save">OK</string>
+
+ <!-- Title for a notification shown. -->
+ <string name="sdcard_setting">SD card</string>
+
+
+ <!-- Battery Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_status_label">Battery status:</string>
+ <!-- Battery Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_scale_label">Battery scale:</string>
+ <!-- Battery Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_level_label">Battery level:</string>
+ <!-- Battery Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_health_label">Battery health:</string>
+ <!-- Battery Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_technology_label">Battery technology:</string>
+ <!-- Battery Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_voltage_label">Battery voltage:</string>
+ <!-- Battery Info screen. Units shown after a value. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_voltage_units">mV</string>
+ <!-- Battery Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_temperature_label">Battery temperature:</string>
+ <!-- Battery Info screen. Units shown after a value. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_temperature_units">\u00B0 C</string>
+ <!-- Battery Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_uptime">Time since boot:</string>
+ <!-- Battery Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_awake_battery">Awake time on battery:</string>
+ <!-- Battery Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_awake_plugged">Awake time when charging:</string>
+ <!-- Battery Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_screen_on">Screen ON time:</string>
+
+
+ <!-- Battery Info screen. Value for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_status_unknown">Unknown</string>
+ <!-- Battery Info screen. Value for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_status_charging">Charging</string>
+ <!-- Battery Info screen. Units shown after a value. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_status_charging_ac">(AC)</string>
+ <!-- Battery Info screen. Units shown after a value. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_status_charging_usb">(USB)</string>
+ <!-- Battery Info screen. Value for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_status_discharging">Discharging</string>
+ <!-- Battery Info screen. Value for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_status_not_charging">Not charging</string>
+ <!-- Battery Info screen. Value for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_status_full">Full</string>
+
+ <!-- Battery Info screen. Value for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_health_unknown">Unknown</string>
+ <!-- Battery Info screen. Value for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_health_good">Good</string>
+ <!-- Battery Info screen. Value for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_health_overheat">Overheat</string>
+ <!-- Battery Info screen. Value for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_health_dead">Dead</string>
+ <!-- Battery Info screen. Value for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_health_over_voltage">Over voltage</string>
+ <!-- Battery Info screen. Value for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="battery_info_health_unspecified_failure">Unknown error</string>
+
+ <!-- Used as setting title (for checkbox) on second screen after selecting Bluetooth settings -->
+ <string name="bluetooth">Bluetooth</string>
+ <!-- Bluetooth settings screen, check box label when the Bluetooth device can be seen by others -->
+ <string name="bluetooth_visibility">Discoverable</string>
+ <!-- Bluetooth settings screen, summary after selecting Discoverable check box -->
+ <string name="bluetooth_is_discoverable">Discoverable for <xliff:g id="discoverable_time_period">%1$s</xliff:g> seconds\u2026</string>
+ <!-- Bluetooth settings screen, Discoverable checkbox summary text -->
+ <string name="bluetooth_not_discoverable">Make device discoverable</string>
+ <!-- Bluetooth settings screen, heading above the list of nearby bluetooth devices -->
+ <string name="bluetooth_devices">Bluetooth devices</string>
+ <!-- Bluetooth settings screen, title for the current bluetooth name setting -->
+ <string name="bluetooth_device_name">Device name</string>
+ <!-- Bluetooth settings screen, summary text when there isn't a name set (for the name setting) -->
+ <string name="bluetooth_name_not_set">No name set, using account name</string>
+ <!-- Bluetooth settings screen, menu item to scan for nearby bluetooth devices -->
+ <string name="bluetooth_scan_for_devices">Scan for devices</string>
+ <!-- Bluetooth settings. Message for disconnecting from a bluetooth device -->
+ <string name="bluetooth_disconnect_blank"><xliff:g id="device_name">%1$s</xliff:g> will be disconnected.</string>
+ <!-- Bluetooth settings. Message when cnonected to a device -->
+ <string name="bluetooth_connected">Connected</string>
+ <!-- Bluetooth settings. Message when a device is disconnected -->
+ <string name="bluetooth_disconnected">Disconnected</string>
+ <!-- Bluetooth settings. Message when disconnecting from a device -->
+ <string name="bluetooth_disconnecting">Disconnecting\u2026</string>
+ <!-- Bluetooth settings. Message when connecting to a device -->
+ <string name="bluetooth_connecting">Connecting\u2026</string>
+ <!-- Bluetooth settings. Message when the device state is unknown -->
+ <string name="bluetooth_unknown"></string>
+ <!--Bluetooth settings screen, summary text under individual Bluetooth devices when not paired yet -->
+ <string name="bluetooth_not_connected">Pair with this device</string>
+ <!--Bluetooth settings screen, summary text under individual Bluetooth devices when pairing -->
+ <string name="bluetooth_pairing">Pairing\u2026</string>
+ <!--Bluetooth settings screen, summary text under individual Bluetooth devices when paired with one -->
+ <string name="bluetooth_paired">Paired but not connected</string>
+ <!--Bluetooth settings screen, summary text under individual Bluetooth devices that are hands free or a headset -->
+ <string name="bluetooth_device">handsfree/headset</string>
+ <!--Bluetooth settings screen, text that appears in heading bar when scanning for devices -->
+ <string name="progress_scanning">Scanning</string>
+ <!-- Notification ticker text (shown in the status bar) when a Bluetooth device wants to pair with us -->
+ <string name="bluetooth_notif_ticker">Bluetooth pairing request</string>
+ <!-- Notification title when a Bluetooth device wants to pair with us -->
+ <string name="bluetooth_notif_title">Pairing request</string>
+ <!-- Notification message when a Bluetooth device wants to pair with us -->
+ <string name="bluetooth_notif_message">Select to pair with\u0020</string>
+
+
+ <!-- Do not translate. Used for diagnostic screens, precise translation is not necessary -->
+ <string name="bluetooth_scan_text">Empty button\u2026</string>
+ <!-- Do not translate. Used for diagnostic screens, precise translation is not necessary -->
+ <string name="bluetooth_settings_text">Empty button\u2026</string>
+ <!-- Do not translate. Used for diagnostic screens, precise translation is not necessary -->
+ <string name="bluetooth_enable_text">Empty button\u2026</string>
+
+ <!-- Do not translate. Used for diagnostic screens, precise translation is not necessary -->
+ <string name="bluetooth_device_info_connectButton_text">Turn on Bluetooth</string>
+ <!-- Do not translate. Used for diagnostic screens, precise translation is not necessary -->
+ <string name="bluetooth_device_info_deviceInfo_text"></string>
+
+ <!-- Date & time settings screen title -->
+ <string name="date_and_time">Date &amp; time settings</string>
+ <!-- Date/time settings. Summary of the checkbox for choosing between 12 hour time or 24 hour time. Sample of 12-hour time -->
+ <string name="date_time_12_hour_sample">1:00 pm</string>
+ <!-- Date/time settings. Summary of the checkbox for choosing between 12 hour time or 24 hour time. Sample of 24-hour time -->
+ <string name="date_time_24_hour_sample">13:00</string>
+ <!-- Do not translate. Title to change time -->
+ <string name="date_time_changeTime_text">Change time</string>
+ <!-- Do not translate. Title to change date -->
+ <string name="date_time_changeDate_text">Date</string>
+ <!-- The title of the activity to pick a time zone. -->
+ <string name="choose_timezone">Select time zone</string>
+ <!-- Do not translate. Used as the value for a setting. -->
+ <string name="default_date_format"><xliff:g id="default_date_format">MM/dd/yyyy</xliff:g></string>
+
+ <!-- Label of preview text when tweaking font size -->
+ <string name="display_preview_label">Preview:</string>
+ <!-- Label for chosen font size -->
+ <string name="display_font_size_label">Font size:</string>
+
+ <!-- Used for diagnostic screens, precise translation is not necessary -->
+ <string name="intent_sender_data_label"><xliff:g id="data">Data:</xliff:g></string>
+ <!-- Used for diagnostic screens, precise translation is not necessary -->
+ <string name="intent_sender_sendbroadcast_text">Send <xliff:g id="broadcast">broadcast</xliff:g></string>
+ <!-- Used for diagnostic screens, precise translation is not necessary -->
+ <string name="intent_sender_action_label"><xliff:g id="action">Action</xliff:g>:</string>
+ <!-- Used for diagnostic screens, precise translation is not necessary -->
+ <string name="intent_sender_startactivity_text">Start <xliff:g id="activity">activity</xliff:g></string>
+ <!-- Used for diagnostic screens, precise translation is not necessary -->
+ <string name="intent_sender_resource_label"><xliff:g id="resource">Resource</xliff:g>: </string>
+ <!-- Used for diagnostic screens, precise translation is not necessary -->
+ <string name="intent_sender_account_label">Account: </string>
+
+ <!-- HTTP proxy settings. Button to clear the proxy box. -->
+ <string name="proxy_clear_text">Clear</string>
+ <!-- HTTP proxy settings. The port number label. -->
+ <string name="proxy_port_label">Port</string>
+ <!-- HTTP proxy settings. The button to restore the defaults. -->
+ <string name="proxy_defaultView_text">Restore defaults</string>
+ <!-- HTTP proxy settings. The button to save. -->
+ <string name="proxy_action_text">Save</string>
+ <!-- HTTP proxy settings. The text field for the hostname -->
+ <string name="proxy_hostname_label">Hostname</string>
+ <!-- HTTP proxy settings. Title if there is an error-->
+ <string name="proxy_error">Attention</string>
+ <!-- HTTP proxy settings. Button to get rid of error box-->
+ <string name="proxy_error_dismiss">OK</string>
+ <!-- HTTP proxy settings. The error if the hostname is not valid -->
+ <string name="proxy_error_invalid_host">The hostname you typed is not valid.</string>
+ <!-- HTTP proxy settings. Error msg -->
+ <string name="proxy_error_empty_port">You must complete the port field.</string>
+ <!-- HTTP proxy settings. Error msg -->
+ <string name="proxy_error_empty_host_set_port">The port field must be empty if the host field is empty.</string>
+ <!-- HTTP proxy settings. Error msg -->
+ <string name="proxy_error_invalid_port">The port you typed is not valid.</string>
+
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_signal_location_label">Location:</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_neighboring_location_label">Neighboring CID:</string>
+ <!-- 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>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_imei_label">IMEI:</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_call_redirect_label">Call redirect:</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_ppp_resets_label">Number of PPP reset since boot:</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_gsm_disconnects_label">GSM disconnects:</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_current_network_label">Current network:</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_data_successes_label">Data successes:</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_ppp_received_label">PPP received:</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_gsm_service_label">GSM service:</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_signal_strength_label">Signal strength:</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_call_status_label">Call status:</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_ppp_sent_label">PPP sent:</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_radio_resets_label">Radio resets:</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_message_waiting_label">Message waiting:</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_phone_number_label">Phone number:</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_band_mode_label">Select radio band</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_network_type_label">Network type:</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_set_perferred_label">Set preferred network type:</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_ping_ipaddr">Ping IpAddr:</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_ping_hostname">Ping Hostname(www.google.com):</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_http_client_test">HTTP Client test:</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_toggle_ciph_label">Toggle ciphering</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="ping_test_label">Run ping test</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_smsc_label">SMSC:</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_smsc_update_label">Update</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_smsc_refresh_label">Refresh</string>
+ <!-- Radio Info screen. Label for a status item. Used for diagnostic info screens, precise translation isn't needed -->
+ <string name="radio_info_toggle_dns_check_label">Toggle DNS check</string>
+
+ <!-- Band Mode Selection -->
+ <!-- Band mode screen. Title of activity. -->
+ <string name="band_mode_title">Set GSM/UMTS band</string>
+ <!-- Band mode screen. Loading message. -->
+ <string name="band_mode_loading">Loading band list\u2026</string>
+ <!-- Band mode screen. Button caption to set the bandmode. -->
+ <string name="band_mode_set">Set</string>
+ <!-- Band mode screen. Status message when unsuccessful. -->
+ <string name="band_mode_failed">Unsuccessful</string>
+ <!-- Band mode screen. Statusm essage when successful. -->
+ <string name="band_mode_succeeded">Successful</string>
+
+ <!-- Instructions after the user changes the mass storage settings -->
+ <string name="sdcard_changes_instructions">Changes take effect when USB cable is reconnected</string>
+ <!-- Enable USB mass storage mode checkbox title -->
+ <string name="sdcard_settings_screen_mass_storage_text">Enable USB mass storage</string>
+ <!-- The label for total bytes on SD card -->
+ <string name="sdcard_settings_total_bytes_label">Total bytes:</string>
+ <!-- Message when there is no SD card present -->
+ <string name="sdcard_settings_not_present_status">No SD card</string>
+ <!-- Th label for the available (free) sapce on the SD card -->
+ <string name="sdcard_settings_available_bytes_label">Available bytes:</string>
+ <!-- Message when the SD card is being used by the computer as mass storage -->
+ <string name="sdcard_settings_mass_storage_status">SD card is being used as a mass storage device</string>
+ <!-- Message when it is safe to remove the SD card -->
+ <string name="sdcard_settings_unmounted_status">It is now safe to remove the SD card</string>
+ <!-- Error message when the SD card was removed without properly unmounting -->
+ <string name="sdcard_settings_bad_removal_status">SD card was removed while still in use!</string>
+ <!-- Label for used bytes on the SD card -->
+ <string name="sdcard_settings_used_bytes_label">Used bytes:</string>
+ <!-- Message when it is scanning the SD card for new files -->
+ <string name="sdcard_settings_scanning_status">Scanning SD card for media\u2026</string>
+ <!-- Message when the SD card is mounted as read only -->
+ <string name="sdcard_settings_read_only_status">SD card mounted read-only</string>
+
+ <!-- SetupWizard strings used by DateTimeSettingsSetupWizard. The button label for going to the next screen. -->
+ <string name="next_label">Next</string>
+
+ <!-- LocalePicker -->
+ <!-- Title for the locale picker activity -->
+ <string name="language_picker_title">Locale</string>
+ <!-- Locale picker screen. Label for choosing the locale -->
+ <string name="select_your_language">Select your language</string>
+
+ <!-- The title of the dialog to pick an activity. This is shown when there are multiple activities that can do a particular action. For example, suppose you click on the "Share" menu item in the Browser. Since you can share the webpage URL via many communication methods, this dialog would come up with choices like "Email", "IM", etc. This is a generic message, and the previous example is a single possible scenario (so please don't assume it's for the browser or anything :) ). -->
+ <string name="activity_picker_label">Select activity</string>
+ <!-- Do not translate. -->
+ <string name="debug_intent_sender_label">Debug intent sender</string>
+ <!-- The title of the activity to see random device info. -->
+ <string name="device_info_label">Device info</string>
+ <!-- The title of the activity to see battery info. -->
+ <string name="battery_info_label">Battery info</string>
+ <!-- The title of the activity to see battery history. -->
+ <string name="battery_history_label">Battery history</string>
+ <!-- The title of the activity to adjust display settings -->
+ <string name="display_label">Display</string>
+ <!-- The title of the activity to see phone info -->
+ <string name="phone_info_label">Phone info</string>
+ <!-- The title of the activity to adjust SD card settings-->
+ <string name="sd_card_settings_label">SD card</string>
+ <!-- The title of the activity to adjust proxy settings -->
+ <string name="proxy_settings_label">Proxy settings</string>
+
+ <!-- ======================================================================================= -->
+ <!-- NEW STUFF -->
+ <!-- ======================================================================================= -->
+
+ <!-- Button label for generic cancel action -->
+ <string name="cancel">Cancel</string>
+
+ <!-- Main Settings screen title -->
+ <string name="settings_label">Settings</string>
+ <!-- Wireless controls settings screen, setting check box label -->
+ <string name="airplane_mode">Airplane mode</string>
+ <!-- Wireless controls settings screen, setting option summary text -->
+ <string name="airplane_mode_summary">Disable all wireless connections</string>
+ <!-- Wireless controls settings screen, setting option summary text as airplane mode is being enabled (so it is disabling all wireless connections) -->
+ <string name="airplane_mode_turning_on">Disabling wireless connections\u2026</string>
+ <!-- Wireless controls settings screen, setting option summary text as airplane mode is being disabled (so it is re-enabling all the wireless conenctions) -->
+ <string name="airplane_mode_turning_off">Enabling wireless connections\u2026</string>
+ <!-- Main Settings screen settings title for things like Wi-Fi, bluetooth, airplane mode. This will take you to another screen with those settings. -->
+ <string name="radio_controls_title">Wireless controls</string>
+ <!-- Main Settings screen settings summary text for the "Wireless controls" setting -->
+ <string name="radio_controls_summary">Manage Wi-Fi, Bluetooth, airplane mode, &amp; mobile networks</string>
+
+
+ <!-- Date and time settings -->
+ <!-- Main Settings screen setting option name to go into the date and time settings-->
+ <string name="date_and_time_settings_title">Date &amp; time</string>
+ <!-- Main Settings screen setting option summary text for the item to go into the date and time settings. -->
+ <string name="date_and_time_settings_summary">Set date, time, time zone &amp; formats</string>
+ <!-- Date & time setting screen setting check box title if the date and time should be determined automatically -->
+ <string name="date_time_auto">Automatic</string>
+ <!-- Date & time setting screen setting option summary text when Automatic check box is selected (that is, when date and time should be determined automatically) -->
+ <string name="date_time_auto_summaryOn">Use network-provided values</string>
+ <!-- Date & time setting screen setting option summary text when Automatic check box is clear -->
+ <string name="date_time_auto_summaryOff">Use network-provided values</string>
+ <!-- Date & time setting screen setting check box title -->
+ <string name="date_time_24hour">Use 24-hour format</string>
+ <!-- Date & time setting screen setting option title -->
+ <string name="date_time_set_time">Set time</string>
+ <!-- Date & time setting screen setting option title -->
+ <string name="date_time_set_timezone">Select time zone</string>
+ <!-- Date & time setting screen setting option title -->
+ <string name="date_time_set_date">Set date</string>
+ <!-- Date & time setting screen setting option title. This setting allows the user to choose how the date should be displayed in apps (what ordering for month and day, etc.) -->
+ <string name="date_time_date_format">Select date format</string>
+ <!-- Menu item on Select time zone screen -->
+ <string name="zone_list_menu_sort_alphabetically">Sort alphabetically</string>
+ <!-- Menu item on Select time zone screen -->
+ <string name="zone_list_menu_sort_by_timezone">Sort by time zone</string>
+
+ <!-- Main Settings screen setting option title for the item to take you the security and location screen -->
+ <string name="security_settings_title">Security &amp; location</string>
+ <!-- Main Settings screen setting option summary text for the item tot ake you to the security and location screen -->
+ <string name="security_settings_summary">Set My Location, screen unlock, SIM card lock</string>
+ <!-- In the security screen, the header title for settings related to Passwords-->
+ <string name="security_passwords_title">Passwords</string>
+
+ <!-- Bluetooth settings -->
+ <!-- Bluetooth settings check box title on Main Settings screen -->
+ <string name="bluetooth_quick_toggle_title">Bluetooth</string>
+ <!-- Bluetooth settings check box summary for turning on bluetooth -->
+ <string name="bluetooth_quick_toggle_summary">Turn on Bluetooth</string>
+ <!--Used as title on second screen after selecting Bluetooth settings -->
+ <string name="bluetooth_settings">Bluetooth settings</string>
+ <!--Wireless controls screen, settings title for the item to take you to the bluetooth settings screen -->
+ <string name="bluetooth_settings_title">Bluetooth settings</string>
+ <!--Wireless controls screen, settings summary for the item tot ake you to the bluetooth settings screen -->
+ <string name="bluetooth_settings_summary">Manage connections, set device name &amp; discoverability</string>
+
+ <!-- Title for the dialog to enter PIN. -->
+ <string name="bluetooth_pin_entry">Bluetooth pairing request</string>
+ <!-- Title for the bluetooth device info screen. -->
+ <string name="bluetooth_device_info">Bluetooth device info</string>
+ <!-- Message when bluetooth dialog for pin entry is shwoing -->
+ <string name="bluetooth_enter_pin_msg"><xliff:g id="device_name">%1$s</xliff:g>\n\nType PIN to pair.\n(Try 0000 or 1234.)</string>
+
+ <!-- Title for BT error dialogs. -->
+ <string name="bluetooth_error_title">Attention</string>
+ <!-- Message for the error dialog when BT pairing fails generically. -->
+ <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 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>
+
+ <!-- Do not translate -->
+ <string name="bluetooth_device_info_alias">Device alias</string>
+ <!-- Do not translate -->
+ <string name="bluetooth_device_info_no_alias">Type alias here\u2026</string>
+ <!-- Do not translate -->
+ <string name="bluetooth_device_info_delete">Remove this device</string>
+ <!-- Do not translate -->
+ <string name="bluetooth_device_info_sdp">List supported services</string>
+
+ <!-- Bluetooth settings: The title of the preference (list item) that initiates a scan for devices -->
+ <string name="bluetooth_preference_scan_title">Scan for devices</string>
+
+ <!-- Bluetooth settings. Context menu item for a device. Action will connect to all profiles on the device. -->
+ <string name="bluetooth_device_context_connect">Connect</string>
+ <!-- Bluetooth settings. Context menu item for a device. Action will disconnect from all profiles on the device. -->
+ <string name="bluetooth_device_context_disconnect">Disconnect</string>
+ <!-- Bluetooth settings. Context menu item for a device. Action will first pair, and then connect to all profiles on the device. -->
+ <string name="bluetooth_device_context_pair_connect">Pair &amp; connect</string>
+ <!-- Bluetooth settings. Context menu item for a device. Action will remove pairing with the device. -->
+ <string name="bluetooth_device_context_unpair">Unpair</string>
+ <!-- Bluetooth settings. Context menu item for a device. Action will disconnect and remove pairing with the device. -->
+ <string name="bluetooth_device_context_disconnect_unpair">Disconnect &amp; unpair</string>
+ <!-- Bluetooth settings. Context menu item for a device. Action will take the user to another screen where they can choose exactly which profiles to connect to. -->
+ <string name="bluetooth_device_context_connect_advanced">Options\u2026</string>
+
+ <!-- Bluetooth settings. The title of the screen to pick which profiles to connect to on the device. For example, headphones may have both A2DP and headset, this allows the user to choose which one he wants to connect to. -->
+ <string name="bluetooth_connect_specific_profiles_title">Connect to\u2026</string>
+
+ <!-- Bluetooth settings. The user-visible string that is used whenever referring to the A2DP profile. -->
+ <string name="bluetooth_profile_a2dp">Media</string>
+ <!-- Bluetooth settings. The user-visible string that is used whenever referring to the headset or handsfree profile. -->
+ <string name="bluetooth_profile_headset">Phone</string>
+
+ <!-- Bluetooth settings. The summary string when a device is connected to the A2DP profile. -->
+ <string name="bluetooth_summary_connected_to_a2dp">Connected to media audio</string>
+ <!-- Bluetooth settings. The summary string when a device is connected to the headset profile. -->
+ <string name="bluetooth_summary_connected_to_headset">Connected to phone audio</string>
+ <!-- Bluetooth settings. The summary string when a device is connected to the A2DP and headset profiles. -->
+ <string name="bluetooth_summary_connected_to_a2dp_headset">Connected to phone and media audio</string>
+
+ <!-- Bluetooth settings. Connection options screen. The title of the screen. -->
+ <string name="bluetooth_device_advanced_title"><xliff:g id="device_name">%1$s</xliff:g> options</string>
+ <!-- Bluetooth settings. Connection options screen. The title of the checkbox that controls whether the device is in "online" mode or "offline" mode. This essentially is the checkbox that controls whether any checks / unchecks on a profile should be applied immediately, or next time the device is connected. -->
+ <string name="bluetooth_device_advanced_online_mode_title">Connect</string>
+ <!-- Bluetooth settings. Connection options screen. The summary of the online mode checkbox. This describes what the setting does in the context of the screen. -->
+ <string name="bluetooth_device_advanced_online_mode_summary">Connect to Bluetooth device</string>
+ <!-- Bluetooth settings. Connection options screen. The title of the header that is above all of the profiles. -->
+ <string name="bluetooth_device_advanced_profile_header_title">Profiles</string>
+ <!-- Bluetooth settings. Connection options screen. The summary for the A2DP checkbox preference when A2DP is connected. -->
+ <string name="bluetooth_a2dp_profile_summary_connected">Connected to media audio</string>
+ <!-- Bluetooth settings. Connection options screen. The summary for the headset checkbox preference when headset is connected. -->
+ <string name="bluetooth_headset_profile_summary_connected">Connected to phone audio</string>
+
+ <!-- Bluetooth settings. Connection options screen. The summary for the A2DP checkbox preference that describes how checking it will set the A2DP profile as preferred. -->
+ <string name="bluetooth_a2dp_profile_summary_use_for">Use for media audio</string>
+ <!-- Bluetooth settings. Connection options screen. The summary for the headset checkbox preference that describes how checking it will set the headset profile as preferred. -->
+ <string name="bluetooth_headset_profile_summary_use_for">Use for phone audio</string>
+
+ <!-- Wi-Fi settings -->
+ <!-- Used in the 2nd-level settings screen to turn on Wi-Fi -->
+ <string name="wifi">Wi-Fi</string>
+ <!-- Used in the 1st-level settings screen to turn on Wi-Fi -->
+ <string name="wifi_quick_toggle_title">Wi-Fi</string>
+ <!-- Used in the 1st-level settings screen as the turn-on summary -->
+ <string name="wifi_quick_toggle_summary">Turn on Wi-Fi</string>
+ <!-- Used in the 1st-level settings screen to go to the 2nd-level settings screen -->
+ <string name="wifi_settings">Wi-Fi settings</string>
+ <!-- Title of the Wi-fi settings screen -->
+ <string name="wifi_settings_category">Wi-Fi settings</string>
+ <!--Wireless controls setting screen, Wi-Fi settings summary text -->
+ <string name="wifi_settings_summary">Set up &amp; manage wireless access points</string>
+ <!-- Button caption to forget a wifi network -->
+ <string name="forget_network">Forget</string>
+ <!-- Label for status of connection -->
+ <string name="wifi_status">Status</string>
+ <!-- Label for link speed (wifi) -->
+ <string name="wifi_link_speed">Speed</string>
+ <!-- Verbose wifi signal strength. This is the best out of 4 levels. -->
+ <string name="wifi_signal_3">Excellent</string>
+ <!-- Verbose wifi signal strength. This is the 2nd best out of 4 levels. -->
+ <string name="wifi_signal_2">Good</string>
+ <!-- Verbose wifi signal strength. This is the 3rd best out of 4 levels. -->
+ <string name="wifi_signal_1">Fair</string>
+ <!-- Verbose wifi signal strength. This is the worst out of 4 levels. -->
+ <string name="wifi_signal_0">Poor</string>
+ <!-- Label for the security of a wifi network -->
+ <string name="security">Security</string>
+ <!-- Value for the wifi security. This means no encryption. -->
+ <string name="wifi_security_open">Open</string>
+ <!-- Value for the wifi security -->
+ <string name="wifi_security_wep">WEP</string>
+ <!-- Value for the wifi security -->
+ <string name="wifi_security_wpa">WPA</string>
+ <!-- Value for the wifi security -->
+ <string name="wifi_security_wpa2">WPA2</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. -->
+ <string name="wifi_security_verbose_open">Open network</string>
+ <!-- Verbose security type of a wifi network. -->
+ <string name="wifi_security_verbose_wep">Secured with WEP</string>
+ <!-- Verbose security type of a wifi network. -->
+ <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>
+ <!-- Wi-Fi IP addrress label -->
+ <string name="ip_address">IP address</string>
+ <!-- Label for the signal strength -->
+ <string name="signal">Signal strength</string>
+ <!--Wireless controls setting screen, Wi-Fi check box summary text when turning Wi-Fi on -->
+ <string name="wifi_starting">Turning on\u2026</string>
+ <!--Wireless controls setting screen, Wi-Fi check box summary text when turning Wi-Fi off -->
+ <string name="wifi_stopping">Turning off\u2026</string>
+ <!-- Generic error message , probably not used-->
+ <string name="wifi_error">Error</string>
+ <!-- Error message when Wi-Fi can't start -->
+ <string name="error_starting">Unable to start Wi-Fi</string>
+ <!-- Error message when Wi-Fi can't stop -->
+ <string name="error_stopping">Unable to stop Wi-Fi</string>
+ <!-- Error message when Wi-Fi can't scan for networks -->
+ <string name="error_scanning">Unable to scan for networks</string>
+ <!-- Error message when Wi-Fi can't connect -->
+ <string name="error_connecting">Unable to connect to the network</string>
+ <!-- Error message when Wi-Fi can't save the network -->
+ <string name="error_saving">Unable to save the network</string>
+ <!-- Button label to connect to a wifi network-->
+ <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 wireless password -->
+ <string name="please_type_passphrase">Wireless password</string>
+ <!--Wi-Fi settings screen, connect to network dialog box, field label and hint text -->
+ <string name="please_type_hex_key">WEP hex key (0-9, A-F)</string>
+ <!--Wi-Fi settings screen, connect to network dialog box, check box label -->
+ <string name="wifi_show_password">Show password.</string>
+ <!--Wi-Fi settings screen menu option -->
+ <string name="scan_wifi">Scan</string>
+ <!-- Wifi network summary when not in nearby -->
+ <string name="summary_not_in_range">Not in range</string>
+ <!-- Wifi network summary when the network is configured previously -->
+ <string name="summary_remembered">Remembered</string>
+ <!-- Wifi network summary when there was an error connecting -->
+ <string name="summary_connection_failed">Connection unsuccessful, select to try again</string>
+ <!-- Header for the list of wifi networks-->
+ <string name="wifi_access_points">Wi-Fi networks</string>
+ <!-- Caption for entering the SSID of a wifi network -->
+ <string name="wifi_type_ssid">Network SSID</string>
+ <!-- The label for security -->
+ <string name="wifi_security">Security</string>
+ <!-- Button caption to save a configuration wifi -->
+ <string name="wifi_save_config">Save</string>
+ <!-- An edit field's grayed out value when it has not been modified -->
+ <string name="wifi_password_unchanged">(unchanged)</string>
+ <!-- Action message to add a wifi network -->
+ <string name="wifi_add_other_network">Add Wi-Fi network</string>
+ <!-- Checkbox title for option to notify user when open networks are nearby -->
+ <string name="wifi_notify_open_networks">Network notification</string>
+ <!-- Checkbox summary for option to notify user when open networks are nearby -->
+ <string name="wifi_notify_open_networks_summary">Notify me when an open network is available</string>
+ <!-- This dialog will use the error_title as the title. -->
+ <string name="wifi_password_incorrect_error">The network password you typed is not correct. Please try again.</string>
+ <!-- Generic error message -->
+ <string name="wifi_generic_connection_error">There is a problem connecting to the network. Please try again.</string>
+ <!--Wi-Fi settings screen menu option -->
+ <string name="wifi_menu_advanced">Advanced</string>
+ <!-- Title of the screen to adjust IP settings -->
+ <string name="wifi_ip_settings_titlebar">IP settings</string>
+ <!-- Menu ietm to save the IP settings -->
+ <string name="wifi_ip_settings_menu_save">Save</string>
+ <!-- Menu ietm to cancel the IP settings -->
+ <string name="wifi_ip_settings_menu_cancel">Cancel</string>
+ <!-- Error message if the IP address is not valid -->
+ <string name="wifi_ip_settings_invalid_ip">Please type a valid IP address.</string>
+ <!-- Checkbox for whether to use a static IP address -->
+ <string name="wifi_use_static_ip">Use static IP</string>
+ <!-- Label for the IP address -->
+ <string name="wifi_ip_address">IP address</string>
+ <!-- Label for the DNS (first one) -->
+ <string name="wifi_dns1">DNS 1</string>
+ <!-- Label for the DNS (second one)-->
+ <string name="wifi_dns2">DNS 2</string>
+ <!-- Label for the gateway of the network -->
+ <string name="wifi_gateway">Gateway</string>
+ <!-- Label for the netmask of the network -->
+ <string name="wifi_netmask">Netmask</string>
+ <!--Wi-Fi settings screen, network context menu item -->
+ <string name="wifi_context_menu_connect">Connect to network</string>
+ <!--Wi-Fi settings screen, network context menu item -->
+ <string name="wifi_context_menu_forget">Forget network</string>
+ <!--Wi-Fi settings screen, network context menu item -->
+ <string name="wifi_context_menu_change_password">Change password</string>
+
+ <!-- Wi-Fi settings screen, advanced, settings section. This is a header shown above advanced wifi settings. -->
+ <string name="wifi_advanced_titlebar">Advanced</string>
+ <!-- Wi-Fi settings screen, setting title for choosing the number of channels to be used -->
+ <string name="wifi_setting_num_channels_title">Regulatory domain</string>
+ <!-- Wi-Fi settings screen, setting summary for choosing the number of channels to be used -->
+ <string name="wifi_setting_num_channels_summary">Set the number of channels to use</string>
+ <!-- Wi-Fi settings screen, generic error message when the regulatory domain could not be set. -->
+ <string name="wifi_setting_num_channels_error">There was a problem setting the regulatory domain.</string>
+ <!-- Wi-Fi settings screen, label to be appended to the count in displaying the list of valid channel counts -->
+ <string name="wifi_setting_num_channels_channel_phrase"><xliff:g id="num_channels">%1$d</xliff:g> channels</string>
+
+ <!-- Wi-Fi settings screen, setting title for setting the wifi sleep policy -->
+ <string name="wifi_setting_sleep_policy_title">Wi-Fi sleep policy</string>
+ <!-- Wi-Fi settings screen, setting summary for setting the wifi sleep policy -->
+ <string name="wifi_setting_sleep_policy_summary">Specify when to switch from Wi-Fi to mobile data</string>
+ <!-- Wi-Fi settings screen, generic error message when the sleep policy could not be set. -->
+ <string name="wifi_setting_sleep_policy_error">There was a problem setting the sleep policy.</string>
+
+ <!-- Wi-Fi settings screen, advanced, title of the item to show the Wi-Fi device's MAC address. -->
+ <string name="wifi_advanced_mac_address_title">MAC address</string>
+
+ <!-- Status message of Wi-Fi when it is scanning -->
+ <string name="fragment_status_scanning">Scanning\u2026</string>
+ <!-- Status message of Wi-Fi when it is connecting to a particular network -->
+ <string name="fragment_status_connecting">Connecting to <xliff:g id="network_name">%1$s</xliff:g>\u2026</string>
+ <!-- Status message of Wi-Fi when it is authenticating with a network -->
+ <string name="fragment_status_authenticating">Authenticating with <xliff:g id="network_name">%1$s</xliff:g>\u2026</string>
+ <!-- Status message of Wi-Fi when it is obtaining the IP address from a netwrok -->
+ <string name="fragment_status_obtaining_ip">Obtaining IP address from <xliff:g id="network_name">%1$s</xliff:g>\u2026</string>
+ <!-- Status message of Wi-Fi when it is connect to a network -->
+ <string name="fragment_status_connected">Connected to <xliff:g id="network_name">%1$s</xliff:g></string>
+ <!-- Status message of Wi-Fi when it is disconnecting from a network -->
+ <string name="fragment_status_disconnecting">Disconnecting from <xliff:g id="network_name">%1$s</xliff:g>\u2026</string>
+ <!-- Status message of Wi-Fi when it is disconnected from a network-->
+ <string name="fragment_status_disconnected">Disconnected</string>
+ <!-- Status message of Wi-Fi when it is a failure (connection) -->
+ <string name="fragment_status_failed">Unsuccessful</string>
+
+ <!-- Status message of Wi-Fi when it is scanning -->
+ <string name="status_scanning">Scanning\u2026</string>
+ <!-- Status message of Wi-Fi when it is connecting (but the network is not known right now) -->
+ <string name="status_connecting">Connecting\u2026</string>
+ <!-- Status message of Wi-Fi when it is authenticating (but the network is not known right now) -->
+ <string name="status_authenticating">Authenticating\u2026</string>
+ <!--Wi-Fi settings screen, summary text for network when connecting -->
+ <string name="status_obtaining_ip">Obtaining address\u2026</string>
+ <!--Wi-Fi settings screen, summary text for network when connected -->
+ <string name="status_connected">Connected</string>
+ <!-- Status message of Wi-Fi when it is disconnecting (but the network is not known right now) -->
+ <string name="status_disconnecting">Disconnecting\u2026</string>
+ <!-- Status message of Wi-Fi when it is disconnected (but the network is not known right now) -->
+ <string name="status_disconnected">Disconnected</string>
+ <!-- Status message of Wi-Fi when it is a failure (but the network is not known right now) -->
+ <string name="status_failed">Unsuccessful</string>
+
+ <!-- Sound and alerts settings -->
+ <!-- Main Settings screen setting option name to go into the sound and display settings screen -->
+ <string name="sound_and_display_settings">Sound &amp; display</string>
+ <!-- Sound settings screen heading -->
+ <string name="sound_settings">Sound settings</string>
+ <!-- Main Settings screen setting option summary text for the item to go into the soudn and display settings screen-->
+ <string name="sound_and_display_settings_summary">Set ringtones, notifications, screen brightness</string>
+ <!-- Sound settings screen, setting option name checkbox -->
+ <string name="silent_mode_title">Silent mode</string>
+ <!-- Sound settings screen, setting option summary text -->
+ <string name="silent_mode_summary">All sounds except media &amp; alarms are silenced</string>
+ <!-- Sound settings screen, setting option name to pick ringtone (a list dialog comes up)-->
+ <string name="ringtone_title">Phone ringtone</string>
+ <!-- Sound settings screen, setting option summary text -->
+ <string name="ringtone_summary">Set your default incoming call ringtone</string>
+ <!-- Sound settings screen, setting option name -->
+ <string name="ring_volume_title">Ringer volume</string>
+ <!-- Sound settings screen, setting option summary text -->
+ <string name="ring_volume_summary">Set volume for incoming calls and notifications</string>
+ <!-- Sound settings screen, setting option name checkbox -->
+ <string name="vibrate_title">Phone vibrate</string>
+ <!-- Sound settings screen, setting option summary text -->
+ <string name="vibrate_summary">Vibrate phone for incoming calls</string>
+ <!-- Sound settings screen, setting option name -->
+ <string name="notification_sound_title">Notification ringtone</string>
+ <!-- Sound settings screen, setting option summary text -->
+ <string name="notification_sound_summary">Set your default notification ringtone</string>
+ <!-- Sound settings screen, the title of the volume bar to adjust the incoming call volume -->
+ <string name="incoming_call_volume_title">Incoming call volume</string>
+ <!-- Sound settings screen, the title of the volume bar to adjust the notification volume -->
+ <string name="notification_volume_title">Notification volume</string>
+ <!-- Sound settings screen, the caption of the checkbox for having the notification volume be
+ the same as the incoming call volume. -->
+ <string name="checkbox_notification_same_as_incoming_call">Use incoming call volume for notifications</string>
+ <!-- Sound settings screen, setting option title-->
+ <string name="notification_sound_dialog_title">Select notification ringtone</string>
+ <!-- Sound settings screen, setting option name -->
+ <string name="media_volume_title">Media volume</string>
+ <!-- Sound settings screen, setting option summary text -->
+ <string name="media_volume_summary">Set volume for music and videos</string>
+ <!-- Sound settings screen, setting check box label -->
+ <string name="dtmf_tone_enable_title">Audible touch tones</string>
+ <!-- Sound settings screen, setting option summary text when check box is selected -->
+ <string name="dtmf_tone_enable_summary_on">Play tones when using dial pad</string>
+ <!-- Sound settings screen, setting option summary text when check box is clear -->
+ <string name="dtmf_tone_enable_summary_off">Play tones when using dial pad</string>
+ <!-- Sound settings screen, setting check box label -->
+ <string name="sound_effects_enable_title">Audible selection</string>
+ <!-- Sound settings screen, setting option summary text when check box is selected -->
+ <string name="sound_effects_enable_summary_on">Play sound when making screen selection</string>
+ <!-- Sound settings screen, setting option summary text when check box is clear -->
+ <string name="sound_effects_enable_summary_off">Play sound when making screen selection</string>
+ <!-- Sound settings screen, setting check box label -->
+ <string name="play_media_notification_sounds_enable_title">SD card notifications</string>
+ <!-- Sound settings screen, setting option summary text when check box is selected -->
+ <string name="play_media_notification_sounds_enable_summary_on">Disable SD card notification sounds</string>
+ <!-- Sound settings screen, setting option summary text when check box is clear -->
+ <string name="play_media_notification_sounds_enable_summary_off">Enable SD card notification sounds</string>
+
+ <!-- Main Settings screen setting option name to go into the screen for data sync settings-->
+ <string name="sync_settings">Data synchronization</string>
+ <!-- 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>
+
+ <!-- Display settings -->
+ <!-- Sound & display settings screen, section header for settings related to display -->
+ <string name="display_settings">Display settings</string>
+ <!-- Sound & display settings screen, animations check box label -->
+ <string name="animations_title">Animation</string>
+ <!-- Sound & display settings screen, animations option summary text when check box is selected -->
+ <string name="animations_summary_on">Show animation when opening/closing windows</string>
+ <!-- Sound & display settings screen, animations option summary text when check box is clear -->
+ <string name="animations_summary_off">Show animation when opening/closing windows</string>
+ <!-- Sound & display settings screen, setting option name to change brightness -->
+ <string name="brightness">Brightness</string>
+ <!-- Sound & display settings screen, setting option summary to change brightness -->
+ <string name="brightness_summary">Adjust the brightness of the screen</string>
+ <!-- Sound & display settings screen, setting option name to change screen timeout -->
+ <string name="screen_timeout">Screen timeout</string>
+ <!-- Sound & display settings screen, setting option summary to change screen timeout -->
+ <string name="screen_timeout_summary">Adjust the delay before the screen automatically turns off</string>
+
+ <!-- SIM lock settings title -->
+ <string name="sim_lock_settings">SIM card lock settings</string>
+ <!-- Security & location settings screen, setting option name -->
+ <string name="sim_lock_settings_category">Set up SIM card lock</string>
+ <!-- Security & location settings screen, section heading for settings related to sim card locking -->
+ <string name="sim_lock_settings_title">SIM card lock</string>
+ <!-- SIM card lock settings screen, setting check box label -->
+ <string name="sim_pin_toggle">Lock SIM card</string>
+ <!-- SIM card lock settings screen, setting option summary text when SIM lock check box is selected -->
+ <string name="sim_lock_on">Require PIN to use phone</string>
+ <!-- SIM card lock settings screen, setting option summary text when SIM lock check box is clear -->
+ <string name="sim_lock_off">Require PIN to use phone</string>
+ <!-- SIM card lock settings screen, setting option name to change the SIM PIN -->
+ <string name="sim_pin_change">Change SIM PIN</string>
+ <!-- SIM card lock settings screen, SIM PIN dialog message instruction -->
+ <string name="sim_enter_pin">SIM PIN</string>
+ <!-- SIM card lock settings screen, SIM PIN dialog message instruction -->
+ <string name="sim_enable_sim_lock">Lock SIM card</string>
+ <!-- SIM card lock settings screen, SIM PIN dialog message instruction -->
+ <string name="sim_disable_sim_lock">Unlock SIM card</string>
+ <!-- SIM card lock settings screen, SIM PIN dialog message instruction -->
+ <string name="sim_enter_old">Old SIM PIN</string>
+ <!-- SIM card lock settings screen, SIM PIN dialog message instruction -->
+ <string name="sim_enter_new">New SIM PIN</string>
+ <string name="sim_reenter_new">Re-type new PIN</string>
+ <!-- SIM card lock settings screen, SIM PIN dialog message instruction -->
+ <string name="sim_change_pin">SIM PIN</string>
+ <!-- SIM card lock settings screen, SIM PIN dialog message when wrong PIN is entered -->
+ <string name="sim_bad_pin">Incorrect PIN!</string>
+ <!-- SIM card lock settings screen, SIM PIN dialog message when PINs don't match -->
+ <string name="sim_pins_dont_match">PINs don\'t match!</string>
+ <!-- SIM card lock settings screen, toast after not entering correct SIM PIN -->
+ <string name="sim_change_failed">Unable to change PIN.\nPossibly incorrect PIN.</string>
+ <!-- SIM card lock settings screen, SIM PIN dialog message when the entered PIN is correct-->
+ <string name="sim_change_succeeded">SIM PIN changed successfully</string>
+ <!-- SIM card lock settings screen, toast after not entering correct SIM PIN -->
+ <string name="sim_lock_failed">Unable to change SIM card lock state.\nPossibly incorrect PIN.</string>
+ <!-- SIM card lock settings screen, SIM PIN dialog button labels: -->
+ <string name="sim_enter_ok">OK</string>
+ <!-- SIM card lock settings screen, SIM PIN dialog button labels: -->
+ <string name="sim_enter_cancel">Cancel</string>
+
+ <!-- Advanced (used for diagnostics) device info activity title -->
+ <string name="device_info_settings">Phone status</string>
+
+ <!-- About phone screen, list item title. Takes the user to the screen for seeing and installing system updates. -->
+ <string name="system_update_settings_list_item_title">System updates</string>
+ <!-- About phone screen, list item summary. Takes the user to the screen for seeing and installing system updates. -->
+ <string name="system_update_settings_list_item_summary">Check for system updates</string>
+
+ <!-- About phone screen, status item label -->
+ <string name="firmware_version">Firmware version</string>
+ <!-- About phone screen, status item label-->
+ <string name="model_number">Model number</string>
+ <!-- About phone screen, setting option name-->
+ <string name="baseband_version">Baseband version</string>
+ <!-- About phone screen, setting option name-->
+ <string name="kernel_version">Kernel version</string>
+ <!-- About phone screen, setting option name-->
+ <string name="build_number">Build number</string>
+
+ <!-- About phone screen, show when a value of some status item is unavailable. -->
+ <string name="device_info_not_available">Not available</string>
+ <!-- About phone screen, phone status screen title -->
+ <string name="device_status_activity_title">Status</string>
+ <!-- About phone screen, title of the item to go into the Phone status screen -->
+ <string name="device_status">Status</string>
+ <!-- About phone screen, summary of the item to go into the phone status screen -->
+ <string name="device_status_summary">IMEI, phone number, signal, etc.</string>
+ <!-- Main settings screen item's title to go into the SD card and storage settings screen-->
+ <string name="storage_settings_title">SD card &amp; phone storage</string>
+ <!-- Main settings screen item's summary for the SD card and storage settings -->
+ <string name="storage_settings_summary">Unmount SD card, view available storage</string>
+ <!-- Do not translate. About phone, status item title -->
+ <string name="status_imei">IMEI</string>
+ <!-- Do not translate. About phone, status item title -->
+ <string name="status_imei_sv">IMEI SV</string>
+ <!-- About phone, status item title. The phone number of the current device.-->
+ <string name="status_number">Phone number</string>
+ <!-- About phone, status item title for the type of data phone network we're connected to, for example 3G or Edge or GPRS -->
+ <string name="status_network_type">Mobile network type</string>
+ <!-- About phone, status item title. The status of data access. For example, the value may be "Connected" -->
+ <string name="status_data_state">Mobile network state</string>
+ <!-- About phone, status item title. The status of whether we have service. for example, the value may be "In service" -->
+ <string name="status_service_state">Service state</string>
+ <!-- About phone, status item title. The current cell tower signal strength -->
+ <string name="status_signal_strength">Signal strength</string>
+ <!-- About phone, status item title, The status for roaming. For example, the value might be "Not roaming" -->
+ <string name="status_roaming">Roaming</string>
+ <!-- About phone, status item title. The cell carrier that the user is connected to. -->
+ <string name="status_operator">Network</string>
+ <!-- About phone, status item title. The MAC address of the Wi-Fi network adapter. -->
+ <string name="status_wifi_mac_address">Wi-Fi MAC address</string>
+ <!-- About phone, status item title. The bluetooth adapter's hardware address-->
+ <string name="status_bt_address">Bluetooth address</string>
+ <!-- About phone, status item value if the actual value is not available. -->
+ <string name="status_unavailable">Unavailable</string>
+ <!-- About phone, status item title. How many packets and bytes have been sent and received across all network interfaces. -->
+ <string name="status_network_traffic_stats">Network usage</string>
+ <!-- About phone, status item summary. How many packets and bytes have been sent and received across all network interfaces. -->
+ <string name="status_network_traffic_summary">Sent: <xliff:g id="network_traffic">%1$d packets, %2$d bytes%n</xliff:g>Rcvd: <xliff:g id="network_traffic">%3$d packets, %4$d bytes</xliff:g></string>
+ <!-- About phone, status item title. How long the device has been running since its last reboot. -->
+ <string name="status_up_time">Up time</string>
+ <!-- About phone, status item title. How much time the device has had its main CPU awake. -->
+ <string name="status_awake_time">Awake time</string>
+ <!-- SD card & phone storage settings screen heading. This is displayed above items that pertain to the phone's internal storage -->
+ <string name="internal_memory">Internal phone storage</string>
+ <!-- SD card & phone storage settings screen heading. This is displayed above items that pertain to the SD card -->
+ <string name="sd_memory">SD card</string>
+ <!-- SD card & phone storage settings title. The amount of free space for some storage partition. For example, this is listed under both the "Internal phone storage" section and the "SD card" section. -->
+ <string name="memory_available">Available space</string>
+ <!-- SD card & phone storage settings screen heading. The total amount of storage space for some storage partition. For example, this is listed under both the "Internal phone storage" section and the "SD card" section -->
+ <string name="memory_size">Total space</string>
+ <!-- SD card & phone storage settings item title that will result in the phone unmounting the SD card. This will be done before the user phyiscally removes the SD card from the phone. Kind of like the "Safely remove" on some operating systems. -->
+ <string name="sd_eject">Unmount SD card</string>
+ <!-- SD card & phone storage settings item title that will result in the phone unmounting the SD card. This will be done before the user phyiscally removes the SD card from the phone. Kind of like the "Safely remove" on some operating systems. -->
+ <string name="sd_eject_summary">Unmount the SD card for safe removal</string>
+ <!-- SD card & phone storage settings item title that will result in the phone formatting the SD card. -->
+ <string name="sd_format">Format SD card</string>
+ <!-- SD card & phone storage settings item title that will result in the phone unmounting the SD card. -->
+ <string name="sd_format_summary">Format (erase) the SD card</string>
+ <!-- SD card status when it is not available status -->
+ <string name="sd_unavailable">Unavailable</string>
+ <!-- SD card status when it is mounted as read only -->
+ <string name="read_only">\u0020(Read-only)</string>
+ <!-- Phone info screen, section titles: -->
+ <string name="battery_status_title">Battery status</string>
+ <!-- Phone info screen, section titles: -->
+ <string name="battery_level_title">Battery level</string>
+
+ <!-- APN Settings -->
+ <!-- APN settings screen title -->
+ <string name="apn_settings">APNs</string>
+ <!-- Screen title after user selects APNs setting option -->
+ <string name="apn_edit">Edit access point</string>
+ <!-- Edit access point label summary text when no value has been set -->
+ <string name="apn_not_set">&lt;Not set&gt;</string>
+ <!-- Edit access point labels: A label the user can give to the APN to allow him to differentiate it from the others -->
+ <string name="apn_name">Name</string>
+ <!-- Edit access point labels: The actual access point name-->
+ <string name="apn_apn">APN</string>
+ <!-- Edit access point labels: The addess of the proxy to use for this APN -->
+ <string name="apn_http_proxy">Proxy</string>
+ <!-- Edit access point labels: The port number of the proxy to use for this APN -->
+ <string name="apn_http_port">Port</string>
+ <!-- Edit access point labels: The username that will be used when conencting to this APN-->
+ <string name="apn_user">Username</string>
+ <!-- Edit access point labels: The password that will be used when connecting to this APN -->
+ <string name="apn_password">Password</string>
+ <!-- Edit access point labels: The server address to conenct to for this APN -->
+ <string name="apn_server">Server</string>
+ <!-- Edit access point labels: -->
+ <string name="apn_mmsc">MMSC</string>
+ <!-- Edit access point labels: The proxy to use for MMS (multimedia messages)-->
+ <string name="apn_mms_proxy">MMS proxy</string>
+ <!-- Edit access point labels: The port on the proxy used for MMS-->
+ <string name="apn_mms_port">MMS port</string>
+ <!-- Edit access point labels: -->
+ <string name="apn_mcc">MCC</string>
+ <!-- Edit access point labels: -->
+ <string name="apn_mnc">MNC</string>
+ <!-- Edit access point labels: The type of APN -->
+ <string name="apn_type">APN type</string>
+ <!-- Edit access point screen menu option to delete this APN -->
+ <string name="menu_delete">Delete APN</string>
+ <!-- APNs screen menu option to create a brand spanking new APN -->
+ <string name="menu_new">New APN</string>
+ <!-- Edit access point screen menu option to save the user's changes for this APN to the persistent storage -->
+ <string name="menu_save">Save</string>
+ <!-- Edit access point screen menu option to discard the user's changes for this APN -->
+ <string name="menu_cancel">Discard</string>
+ <!-- APN error dialog title -->
+ <string name="error_title">Attention</string>
+ <!-- APN error dialog messages: -->
+ <string name="error_name_empty">The Name field cannot be empty.</string>
+ <!-- APN error dialog messages: -->
+ <string name="error_apn_empty">The APN cannot be empty.</string>
+ <!-- APN error dialog messages: -->
+ <string name="error_mcc_not3">MCC field must be 3 digits.</string>
+ <!-- APN error dialog messages: -->
+ <string name="error_mnc_not23">MNC field must be 2 or 3 digits.</string>
+ <!-- The message of dialog indicated restoring default APN settings in progress -->
+ <string name="restore_default_apn">Restoring default APN settings</string>
+ <!-- APNs screen menu option to reset default APN settings -->
+ <string name="menu_restore">Reset to default</string>
+ <!-- APNs screen toast message to inform reset default APN settings is completed -->
+ <string name="restore_default_apn_completed">Reset default APN settings completed</string>
+
+ <!-- Master Clear -->
+ <!-- SD card & phone storage settings screen, setting option name under Internal phone storage heading -->
+ <string name="master_clear_title">Factory data reset</string>
+ <!-- SD card & phone storage settings screen, setting option summary text under Internal phone storage heading -->
+ <string name="master_clear_summary">Erases all data on phone</string>
+ <!-- SD card & phone storage settings screen, message on screen after user selects Factory data reset -->
+ <string name="master_clear_desc">This action will reset the phone to its initial factory state, erasing all data and downloaded applications!</string>
+ <!-- SD card & phone storage settings screen, button on screen after user selects Factory data reset -->
+ <string name="master_clear_button_text">Reset phone</string>
+ <!-- SD card & phone storage settings screen, message on screen after user selects Reset phone button -->
+ <string name="master_clear_final_desc">Reset phone, erasing all your data and applications? Action cannot be reversed!</string>
+ <!-- SD card & phone storage settings screen, button on screen after user selects Reset phone button -->
+ <string name="master_clear_final_button_text">Erase everything</string>
+ <!-- Message to draw an unlock pattern before clearing the device -->
+ <string name="master_clear_gesture_prompt">Draw your unlock pattern</string>
+ <!-- Explanation of drawing unlockp attern to reset phone -->
+ <string name="master_clear_gesture_explanation">You must draw your unlock pattern to confirm a phone reset.</string>
+ <!-- Master clear failed message -->
+ <string name="master_clear_failed">No reset was performed because the System Clear service is not available.</string>
+
+ <!-- Media Format -->
+ <!-- SD card & phone storage settings screen, setting option name under Internal phone storage heading -->
+ <string name="media_format_title">Format SD card.</string>
+ <!-- SD card & phone storage settings screen, setting option summary text under Internal phone storage heading -->
+ <string name="media_format_summary">Erases all data on the SD card</string>
+ <!-- SD card & phone storage settings screen, message on screen after user selects Factory data reset -->
+ <string name="media_format_desc">This action will erase the SD card in the phone. You will lose ALL data on the card!</string>
+ <!-- SD card & phone storage settings screen, button on screen after user selects Factory data reset -->
+ <string name="media_format_button_text">Format SD card</string>
+ <!-- SD card & phone storage settings screen, message on screen after user selects Format media button -->
+ <string name="media_format_final_desc">Format SD card, erasing all your media? Action cannot be reversed!</string>
+ <!-- SD card & phone storage settings screen, button on screen after user selects Format media button -->
+ <string name="media_format_final_button_text">Erase everything</string>
+ <!-- Message to draw an unlock pattern before clearing the device -->
+ <string name="media_format_gesture_prompt">Draw your unlock pattern</string>
+ <!-- Explanation of drawing unlock pattern to format card -->
+ <string name="media_format_gesture_explanation">You must draw your unlock pattern to confirm an SD card format.</string>
+
+ <!-- Main settings screen, Call settings title for item to go into the call settings -->
+ <string name="call_settings_title">Call settings</string>
+ <!-- Main settings screen, Call settings summary for item to go into call settings -->
+ <string name="call_settings_summary">Set up voicemail, call forwarding, call waiting, caller ID</string>
+
+ <!-- Wireless controls, item title to go into the network settings -->
+ <string name="network_settings_title">Mobile networks</string>
+ <!-- Wireless controls, the item summary for the user to go into the network settings -->
+ <string name="network_settings_summary">Set options for roaming, networks, APNs</string>
+
+ <!-- Security & location settings screen, section header for settings relating to location -->
+ <string name="location_title">My Location sources</string>
+ <!-- Security & location settings screen, setting check box label if the user wants to use wireless network-based positioning (cell ID, wifi, etc.) -->
+ <string name="location_network_based">Use wireless networks</string>
+ <!-- Security & location settings screen, setting summary when Use wireless networks check box is clear -->
+ <string name="location_networks_disabled">See location in applications (such as Maps) using wireless networks</string>
+ <!-- Security & location settings screen, setting summary when Use wireless networks check box is selected -->
+ <string name="location_neighborhood_level">Location determined by Wi-Fi and/or mobile networks</string>
+ <!-- Security & location settings screen, setting check box label if the GPS receiver should be enabled -->
+ <string name="location_gps">Enable GPS satellites</string>
+ <!-- Security & location settings screen, setting summary when Enable GPS satellites check box is selected -->
+ <string name="location_street_level">When locating, accurate to street level (deselect to conserve battery)</string>
+ <!-- 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>
+
+ <!-- About -->
+ <!-- Main settings screen, setting title for the user to go into the About phone screen -->
+ <string name="about_settings">About phone</string>
+ <!-- Main settings screen, setting summary for the user to go into the About phone screen-->
+ <string name="about_settings_summary">View legal info, phone status, software version</string>
+ <!-- About phone settings screen, setting option name to go to dialog that shows legal info -->
+ <string name="legal_information">Legal information</string>
+ <!-- About phone settings screen, setting option name to see a list of contributors -->
+ <string name="contributors_title">Contributors</string>
+ <!-- Note: this may be replaced by a more-specific title of the activity that will get launched --> <skip />
+ <!-- About phone settings screen, setting option name to see copyright-related info -->
+ <string name="copyright_title">Copyright</string>
+ <!-- Note: this may be replaced by a more-specific title of the activity that will get launched --> <skip />
+ <!-- About phone settings screen, setting option name to see licensing info -->
+ <string name="license_title">License</string>
+ <!-- Note: this may be replaced by a more-specific title of the activity that will get launched --> <skip />
+ <!-- About phone settings screen, setting option name to see terms and conditions -->
+ <string name="terms_title">Terms and conditions</string>
+
+ <!-- Title for actual Settings license activity. --> <skip />
+ <!-- About phone settings, Legal information setting option name and title of dialog box holding license info -->
+ <string name="settings_license_activity_title">Open source licenses</string>
+ <!-- About phone settings screen, Open source license dialog message when licenses cannot be loaded -->
+ <string name="settings_license_activity_unavailable">There is a problem loading the licenses.</string>
+ <!-- About phone settings screen, Open source license dialog title until license is fully loaded -->
+ <string name="settings_license_activity_loading">Loading\u2026</string>
+
+ <!-- Lock Pattern settings -->
+ <!-- Security & location settings screen, header -->
+ <string name="lock_settings_title">Screen unlock pattern</string>
+ <!-- Security & location settings screen, setting option name -->
+ <string name="lockpattern_change_lock_pattern_label">Change unlock pattern</string>
+ <!-- Security & location settings screen, change unlock pattern screen instruction when the user chooses "Change unlock pattern". We first ask the user toe nter the current pattern, and this is the message seen -->
+ <string name="lockpattern_need_to_unlock">Confirm saved pattern</string>
+ <!-- Do not translate. -->
+ <string name="lockpattern_need_to_unlock_footer"></string>
+ <!-- Security & location settings screen, change unlock pattern screen instruction if user draws incorrect pattern -->
+ <string name="lockpattern_need_to_unlock_wrong">Sorry, try again:</string>
+ <!-- Do not translate. -->
+ <string name="lockpattern_need_to_unlock_wrong_footer"></string>
+ <!-- Security & location settings screen, change unlock pattern screen instruction on top of screen. This si when they are supposed to draw a new unlock pattern (for example, if they are changing their unlock patterns)..-->
+ <string name="lockpattern_recording_intro_header">Draw an unlock pattern</string>
+ <!-- Security & location settings screen, change unlock pattern screen hint on bottom of screen. We are telling them to press the menu button to see more options or help. -->
+ <string name="lockpattern_recording_intro_footer">Press Menu for help.</string>
+ <!-- Security & location settings screen, change unlock pattern screen instruction on top of screen while drawing pattern -->
+ <string name="lockpattern_recording_inprogress">Release finger when done.</string>
+ <!-- Security & location settings screen, change unlock pattern screen instruction on top of screen if user doesn't connect enough dots -->
+ <string name="lockpattern_recording_incorrect_too_short">Connect at least <xliff:g id="number">%d</xliff:g> dots. Try again:</string>
+ <!-- Security & location settings screen, change unlock pattern screen message on top of screen after drawing pattern -->
+ <string name="lockpattern_pattern_entered_header">Pattern recorded!</string>
+ <!-- Security & location settings screen, change unlock pattern screen instruction on top of screen to confirm pattern -->
+ <string name="lockpattern_need_to_confirm">Draw pattern again to confirm:</string>
+ <string name="lockpattern_pattern_confirmed_header">Your new unlock pattern:</string>
+ <!-- Security & location settings screen, change unlock pattern screen button, on bottom of screen. After they draw a pattern and release their finger, we display the pattern so they remember. When they are ready to draw it once again to confirm it, they press this button. -->
+ <string name="lockpattern_confirm_button_text">Confirm</string>
+ <!-- Security & location settings screen, change unlock pattern screen button, on bottom of screen. After they draw a pattern and release their finger, we display the pattern so they remember. If they are nto satisfied with this pattern, they click this button to redraw the pattern. -->
+ <string name="lockpattern_restart_button_text">Redraw</string>
+ <!-- Security & location settings screen, change unlock pattern screen button, on bottom of screen. If they are supposed to enter their current pattern before being able to draw another one, and they screw up, they hit this button to try again -->
+ <string name="lockpattern_retry_button_text">Retry</string>
+ <!-- Security & location settings screen, change unlock pattern screen button, on bottom of screen. Once they draw a new pattern and confirm it by drawing it again, they press this button to exit -->
+ <string name="lockpattern_continue_button_text">Continue</string>
+ <!-- Security & location settings screen, unlock screen activity title -->
+ <string name="lockpattern_settings_title">Unlock pattern</string>
+ <!-- Security & location settings screen, setting check box title if the unlock pattern MUST be drawn everytime they turn on the screen -->
+ <string name="lockpattern_settings_enable_title">Require pattern</string>
+ <!-- Security & location settings screen, setting summary for the checkbox "Require pattern" -->
+ <string name="lockpattern_settings_enable_summary">Must draw pattern to unlock screen</string>
+ <!-- Security & location settings screen, setting check box title. This setting controls whether a visible green line is drawn as the user moves his finger around while drawing the unlock pattern. If checked, this line is drawn. If unchecked, there is nothing drawn so the user does not reveal his pattern while he unlocks the phone.-->
+ <string name="lockpattern_settings_enable_visible_pattern_title">Use visible pattern</string>
+ <!-- Security & location settings screen, setting check box title. This setting controls whether tactile feedback will be produced when the user draws the pattern.-->
+ <string name="lockpattern_settings_enable_tactile_feedback_title">Use tactile feedback</string>
+ <!-- Security & location settings screen, setting option name when user has never set an unlock pattern -->
+ <string name="lockpattern_settings_choose_lock_pattern">Set unlock pattern</string>
+ <!-- Security & location settings screen, setting option name when user has previously set an unlock pattern and wants to change to a new pattern -->
+ <string name="lockpattern_settings_change_lock_pattern">Change unlock pattern</string>
+ <!-- Security & location settings screen, the help instructions (an animation) caption -->
+ <string name="lockpattern_settings_help_how_to_record">How to draw an unlock pattern</string>
+ <!-- Security & location settings screen, change unlock pattern screen instruction on top of screen after too many incorrect attempts -->
+ <string name="lockpattern_too_many_failed_confirmation_attempts_header">Too many incorrect attempts!</string>
+ <!-- Security & location settings screen, change unlock pattern screen countdown hint on bottom of screen after too many incorrect attempts -->
+ <string name="lockpattern_too_many_failed_confirmation_attempts_footer">Try again in <xliff:g id="number">%d</xliff:g> seconds.</string>
+
+ <!-- ChooseLockPatternTutorial --> <skip />
+ <!-- ChooseLockPatternTutorial, button labels: This is to cancel the tutorial -->
+ <string name="skip_button_label">Cancel</string>
+ <!-- ChooseLockPatternTutorial, button labels: Continue to the next page of the tutorial -->
+ <string name="next_button_label">Next</string>
+ <!-- ChooseLockPatternTutorial, tutorial screen title -->
+ <string name="lock_title">Securing your phone</string>
+ <!-- ChooseLockPatternTutorial, tutorial screen text -->
+ <string name="lock_intro_message"><font size="17">Protect your phone from unauthorized use by creating a personal screen unlock pattern.
+ \n<font height="17">\n</font><b>1</b>\u00A0 On the next screen, watch while an example pattern is drawn.
+ \n<font height="17">\n</font><b>2</b>\u00A0 When ready, draw your own personal unlock pattern. Experiment with different patterns but connect at least four dots.
+ \n<font height="17">\n</font><b>3</b>\u00A0 Redraw your pattern to confirm.
+ \n<font height="17">\n</font><b>Ready to start? Select \u201CNext\u201D</b>.
+ \n<font height="3">\n</font>To leave your phone unprotected, select \u201CCancel\u201D.</font>
+ </string>
+
+ <!-- ChooseLockPatternExample --> <skip />
+ <!-- ChooseLockPatternExample, screen title that shows an example pattern -->
+ <string name="lock_example_title">Example pattern</string>
+ <!-- ChooseLockPatternExample, screen hint text at bottom of screen. These are instructions and rules for drawing a good patttern -->
+ <string name="lock_example_message">Connect at least four dots.\n
+ \nSelect \u201CNext\u201D when you\u2019re ready to draw your own pattern.
+ </string>
+
+ <!-- Applications Settings --> <skip />
+ <!-- Applications settings screen, setting option name for the user to go to the screen to manage installed applications -->
+ <string name="manageapplications_settings_title">Manage applications</string>
+ <!-- Applications settings screen, setting option summary for the user to go to the screen to manage installed applications -->
+ <string name="manageapplications_settings_summary">Manage and remove installed applications</string>
+ <!-- Applications settings title, on main settings screen. If clicked, the user is taken to a settings screen full of application settings-->
+ <string name="applications_settings">Applications</string>
+ <!-- Applications settings summary, on main settings screen. The summary for the "Applications" item on the main settings screen. Describes what settings are accessible from the "Applications" screen. -->
+ <string name="applications_settings_summary">Manage applications, set up quick launch shortcuts</string>
+ <!-- Applications settings screen heading. The header for the Application settings screen. -->
+ <string name="applications_settings_header">Application settings</string>
+ <!-- Applications settings screen, setting check box title. If checked, the system allows installation of applications that are downloaded from random places, such as web sites. -->
+ <string name="install_applications">Unknown sources</string>
+ <!-- Applications settings screen, setting check box summary. This is the summary for "Unknown sources" checkbox -->
+ <string name="install_unknown_applications">Allow install of non-Market applications</string>
+ <!-- Applications settings screen, message text of alert that appears if user selects the "Unknown sources" check box -->
+ <string name="install_all_warning">Your phone and personal data are more vulnerable to attack by applications
+ from unknown sources. You agree that you are solely responsible for any
+ damage to your phone or loss of data that may result from using
+ these applications.</string>
+ <!-- Manage applications, individual application info screen title. For example, if they click on "Browser" in "Manage applications", the title of the next screen will be this -->
+ <string name="application_info_label">Application info</string>
+ <!-- Manage applications, individual application info screen, section heading for stuff relating to an app's storage settings. -->
+ <string name="storage_label">Storage</string>
+ <!-- Manage applications, individual application info screen, heading for settings related to controlling whether this app is the default for some actions -->
+ <string name="auto_launch_label">Launch by default</string>
+ <!-- Manage applications, individual application info screen, heading for settings related to the app's permissions. for example, it may list all the permissions the app has. -->
+ <string name="permissions_label">Permissions</string>
+ <!-- Manage applications, Header name used for cache information -->
+ <string name="cache_header_label">Cache</string>
+ <!-- Manage applications, text label for button -->
+ <string name="clear_cache_btn_text">Clear cache</string>
+ <!-- Manage applications, label that appears next to the cache size -->
+ <string name="cache_size_label">Cache</string>
+ <!-- Manage applications, Header name used for other controls -->
+ <string name="controls_label">Controls</string>
+ <!-- Manage applications, text label for button to kill / force stop an application -->
+ <string name="force_stop">Force stop</string>
+ <!-- Manage applications, individual application info screen,label under Storage heading. The total storage space taken up by this app. -->
+ <string name="total_size_label">Total</string>
+ <!-- Manage applications, individual application info screen, label under Storage heading. The amount of space taken up by the application itself (for example, the java compield files and things like that) -->
+ <string name="application_size_label">Application</string>
+ <!-- Manage applications, individual application info screen, label under Storage heading. The amount of sapce taken up by the app's data (for example, downloaded emails or something like that) -->
+ <string name="data_size_label">Data</string>
+ <!-- Manage applications, individual application info screen, button label under Storage heading. Button to remove the application from the system. -->
+ <string name="uninstall_text">Uninstall</string>
+ <!-- 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, 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 -->
+ <string name="auto_launch_disable_text">No defaults set.</string>
+ <!-- Manage applications, individual application screen, button label under Launch by default heading. This is used to clear any default actions that may be assigned to this app. -->
+ <string name="clear_activities">Clear defaults</string>
+ <!-- Manage apps, individual app screen, substituted for the application's label when the app's label CAN NOT be determined.-->
+ <string name="unknown">Unknown</string>
+ <!-- Manage applications screen, menu item. Sorts all of the apps in the list alphabetically. -->
+ <string name="sort_order_alpha">Sort</string>
+ <!-- Manage applications screen, menu item. Sorts all of the apps in the list based on their file size. This is used to uninstall when space is getting low. -->
+ <string name="sort_order_size">Sort by size</string>
+ <!-- Manage applications screen, individual app screen, button label when the user wants to manage the space taken up by an app. -->
+ <string name="manage_space_text">Manage space</string>
+ <!-- Text for menu option in ManageApps screen to present various menu options -->
+ <string name="filter">Filter</string>
+ <!-- Title of dialog for presenting filter options -->
+ <string name="filter_dlg_title">Select filter options</string>
+ <!-- Text for filter option in ManageApps screen to display all installed
+ applications -->
+ <string name="filter_apps_all">All</string>
+ <!-- Text for filter option in ManageApps screen to display third party
+ applications only -->
+ <string name="filter_apps_third_party">Third-party</string>
+ <!-- Text for filter option in ManageApps screen to display list of running
+ packages only. -->
+ <string name="filter_apps_running">Running</string>
+ <string name="loading">Loading\u2026</string>
+ <!-- Manage app screen, shown when the activity is busy recomputing the size of each app -->
+ <string name="recompute_size">Recomputing size\u2026</string>
+ <!-- Manage applications, individual application screen, confirmation dialog title. Displays when user selects to "Clear data". -->
+ <string name="clear_data_dlg_title">Delete</string>
+ <!-- Manage applications, individual application screen, confirmation dialog message. Displays when user selects to "Clear data". It warns the user of the consequences of clearing the data for an app. -->
+ <string name="clear_data_dlg_text">All information you\'ve saved in this application will be deleted permanently.</string>
+ <!-- Manage applications, individual application screen, confirmation dialog button. Displays when user selects to "Clear data". Goes through with the clearing of the data. -->
+ <string name="dlg_ok">OK</string>
+ <!-- Manage applications, individual application screen, confirmation dialog button. Displays when user selects to "Clear data". -->
+ <string name="dlg_cancel">Cancel</string>
+ <!-- Manage applications, individual application dialog box title. Shown when the user somehow got into a state where it wants to manage some app that isn't found. -->
+ <string name="app_not_found_dlg_title">Application not found</string>
+ <!-- Manage applications, individual application dialog box message. Shown when the user somehow got into a state where it wants to manage some app that isn't found. -->
+ <string name="app_not_found_dlg_text"> The application was not
+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, 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>
+
+ <!-- Language Settings --> <skip />
+ <!-- Title of setting on main settings screen. This item will take the user to the screen to tweak settings realted to locale and text -->
+ <string name="language_settings">Locale &amp; text</string>
+ <!-- Summary of setting on main settings screen. This item will take the user to the screen to tweak settings realted to locale and text -->
+ <string name="language_settings_summary">Set locale (language and region), text input and auto-correction options</string>
+ <!-- On Text & language settings screen, heading. Inside the "Locale & text" screen, this is the header for settings that are for locale changes. -->
+ <string name="language_category">Locale setting</string>
+ <!-- On Text & language settings screen, heading. Inside the "Locale & text" screen, this is the header for settings that relate to text (autotext, autoreplace, autocapitalization). -->
+ <string name="text_category">Text settings</string>
+ <!-- On Text & language settings screen, setting option name. title of the setting to take the user to a screen to select the locale. -->
+ <string name="phone_language">Select locale</string>
+ <!-- On Text & language settings screen, setting option name. summary of the setting to take the user to a screen to select the locale. -->
+ <string name="phone_language_summary">Select language and region</string>
+ <!-- On Text & language settings screen, setting option name. title of the setting to enable autoreplace of entered text. auto replace is a feature that will automatically correct mistyped words. -->
+ <string name="auto_replace">Auto-replace</string>
+ <!-- On Text & language settings screen, setting summary. This is the summary for the "Auto-replace" setting. -->
+ <string name="auto_replace_summary">Correct mistyped words</string>
+ <!-- On Text & language settings screen, setting option name. title of the setting to enable autocapitalization of entered text. for example, after the user finishes a sentence, the next letter he types will automatically be capitalizated. -->
+ <string name="auto_caps">Auto-cap</string>
+ <!-- On Text & language settings screen, setting summary. Summary for the Auto-cap setting. -->
+ <string name="auto_caps_summary">Capitalize first letter in sentences</string>
+ <!-- On Text & language settings screen, setting option name. title of the setting to enable automatic punctuation of entered text. for example, it will change an entered "youre" to "you're". -->
+ <string name="auto_punctuate">Auto-punctuate</string>
+ <!-- On Text & language settings screen, category for physical keyboard text entry options. -->
+ <string name="hardkeyboard_category">Physical keyboard settings</string>
+ <!-- On Text & language settings screen, setting summary for the Auto-punctuate setting. -->
+ <string name="auto_punctuate_summary">Press Space key twice to insert \u0022.\u0022</string>
+ <!-- On Security & location settings screen, setting check box name. Title of the checkbox to set whether password edit fields will show the most recent character typed and then hide it, or just hide it right away. By hide, I mean mask it out. -->
+ <string name="show_password">Visible passwords</string>
+ <!-- On Security & location settings screen, setting check box summary. Summary for the visible passwords setting. -->
+ <string name="show_password_summary">Show password as you type</string>
+
+ <!-- User dictionary settings --><skip />
+ <!-- User dictionary settings, The titlebar text of the User dictionary settings screen. -->
+ <string name="user_dict_settings_titlebar">User dictionary</string>
+ <!-- User dictionary settings, The title of the list item to go into the User dictionary settings screen. -->
+ <string name="user_dict_settings_title">User dictionary</string>
+ <!-- User dictionary settings. The summary of the listem item to go into the User dictionary settings screen. -->
+ <string name="user_dict_settings_summary">Add &amp; remove words from user dictionary</string>
+ <!-- User dictionary settings. The title of the menu item to add a new word to the user dictionary. -->
+ <string name="user_dict_settings_add_menu_title">Add</string>
+ <!-- User dictionary settings. The title of the dialog to add a new word to the user dictionary. -->
+ <string name="user_dict_settings_add_dialog_title">Add to dictionary</string>
+ <!-- User dictionary settings. The title of the context menu item to edit the current word -->
+ <string name="user_dict_settings_context_menu_edit_title">Edit</string>
+ <!-- User dictionary settings. The title of the context menu item to delete the current word -->
+ <string name="user_dict_settings_context_menu_delete_title">Delete</string>
+ <!-- User dictionary settings. The text to show when there are no user-defined words in the dictionary -->
+ <string name="user_dict_settings_empty_text">You do not have any words in the user dictionary. You can add a word through the menu.</string>
+
+ <!-- This is for diagnostics screen. The title of a screen with various items realted to launching screens that will giev the user info. For example, it contains "Phone information" and "Battery information" -->
+ <string name="testing">Testing</string>
+ <!-- In the Testing screen. The item title of the activity that shows a bunch of phone-related information. -->
+ <string name="testing_phone_info">Phone information</string>
+ <!-- In the Testing screen. The item title of the activity that shows a bunch of battery-related information. -->
+ <string name="testing_battery_info">Battery information</string>
+ <!-- In the Testing screen. The item title of the activity that shows a bunch of historical battery-related information. -->
+ <string name="testing_battery_history">Battery history</string>
+ <!-- Do not translate. In the Testing screen. The item title of the activity that shows a bunch of SIM-related operations. -->
+ <string name="testing_sim_toolkit">SIM toolkit</string>
+
+ <!-- The title of the item to go into the Quick launch settings. -->
+ <string name="quick_launch_title">Quick launch</string>
+ <!-- The summary of the item to go into the Quick launch settings. This is a description of what Quick launch offers. -->
+ <string name="quick_launch_summary">Set keyboard shortcuts to launch applications</string>
+ <!-- On the Quick launch settings screen, title of the item for shortcut letters that are not assigned to an application yet. Quick launch is assigning a global shortcut to launch a specific app. -->
+ <string name="quick_launch_assign_application">Assign application</string>
+ <!-- On the Quick launch settings screen, summary text for the item of letters that are not assigned. See the quick launch "Assign application" for a description of quick launch -->
+ <string name="quick_launch_no_shortcut">No shortcut</string>
+ <!-- On the Quick launch settings screen, summary text under the item for each assigned letter. -->
+ <string name="quick_launch_shortcut">Search + <xliff:g id="shortcut_letter">%1$s</xliff:g></string>
+ <!-- On the Quick launch settings screen, title of "Clear shortcut" confirmation dialog. This is reached by longpressing an item for a shortcut letter. This allows the user to clear the assigned applicatino for that shortcut letter. -->
+ <string name="quick_launch_clear_dialog_title">Clear</string>
+ <!-- On the Quick launch settings screen, message in the "Clear shortcut" confirmation dialog. See the title for this dialog for more info. -->
+ <string name="quick_launch_clear_dialog_message">Your shortcut for <xliff:g id="shortcut_letter">%1$s</xliff:g> (<xliff:g id="application_name">%2$s</xliff:g>) will be cleared.</string>
+ <!-- Clear dialog for quick launch setting box button labels: -->
+ <string name="quick_launch_clear_ok_button">OK</string>
+ <!-- Clear dialog for quick launch setting box button labels: -->
+ <string name="quick_launch_clear_cancel_button">Cancel</string>
+ <!-- Quick launch screen, when assigning an app to a shortcut, this menu item to show a list of all applications. -->
+ <string name="quick_launch_display_mode_applications">Applications</string>
+ <!-- Quick launch screen, when assigning an app to a shortcut, this menu item to show a list of all shortcutable applications -->
+ <string name="quick_launch_display_mode_shortcuts">Shortcuts</string>
+
+ <!-- Input methods Settings -->
+ <string name="input_methods_settings_title">Text input</string>
+ <string name="input_methods_settings_summary">Manage text input options</string>
+ <!-- Input Methods Settings localized format string for generating the appropriate "Foo settings" menu label for the Input Method named "Foo" -->
+ <string name="input_methods_settings_label_format">%s settings</string>
+
+ <!-- Development Settings. the title for the item to take the user to Development settings. Development settings are settings meant for application developers. -->
+ <string name="development_settings_title">Development</string>
+ <!-- Development Settings summary. The summary of the item to take the user to Development settings. Development settings are settings meant for application developers. -->
+ <string name="development_settings_summary">Set options for application development</string>
+ <!-- Setting checkbox title for Whether to enable USB debugging support on the phone. -->
+ <string name="enable_adb">USB debugging</string>
+ <!-- Setting checkbox summary for Whether to enable USB debugging support on the phone -->
+ <string name="enable_adb_summary">Debug mode when USB is connected</string>
+ <!-- Setting Checkbox title whether to keep the screen on when plugged in to a power source -->
+ <string name="keep_screen_on">Stay awake</string>
+ <!-- setting Checkbox summary whether to keep the screen on when plugged in -->
+ <string name="keep_screen_on_summary">Screen will never sleep while charging</string>
+ <!-- Setting Checkbox title whether to allow mock locations -->
+ <string name="allow_mock_location">Allow mock locations</string>
+ <!-- setting Checkbox summary whether to allow mock locations -->
+ <string name="allow_mock_location_summary">Allow mock locations</string>
+
+ <!-- Title for the screen that lets the user choose a gadget to add to the home screen
+ (or other screens that can host gadgets). Note to translators: we're still determining
+ the final name for Gadgets/Widgets, so please translate both for now. -->
+ <string name="gadget_picker_title">Choose gadget</string>
+ <!-- Title for the screen that lets the user choose a widget to add to the home screen
+ (or other screens that can host widgets). Note to translators: we're still determining
+ the final name for Gadgets/Widgets, so please translate both for now. -->
+ <string name="widget_picker_title">Choose widget</string>
+
+ <!-- Used to display "Details for UID 1234" in BatteryHistory -->
+ <string name="battery_history_details_for">Details for UID %d</string>
+
+ <!-- Used to name a set of apps that share a user id in BatteryHistory -->
+ <string name="battery_history_uid">UID <xliff:g id="user_id">%1$d</xliff:g></string>
+
+ <!-- Used as a title for the network usage details screen in BatteryHistory -->
+ <string name="battery_history_network_usage">Network usage details for <xliff:g id="app_name">%1$s</xliff:g>:</string>
+
+ <!-- Used to show the number of bytes received by an app over the network in BatteryHistory -->
+ <string name="battery_history_bytes_received">Bytes received: <xliff:g id="bytes">%1$d</xliff:g></string>
+
+ <!-- Used to show the number of bytes sent by an app over the network in BatteryHistory -->
+ <string name="battery_history_bytes_sent">Bytes sent: <xliff:g id="bytes">%1$d</xliff:g></string>
+
+ <!-- Used to show the number of bytes sent and received by an app over the network in BatteryHistory -->
+ <string name="battery_history_bytes_total">Total bytes: <xliff:g id="bytes">%1$d</xliff:g></string>
+
+ <!-- Used as a title for the cpu usage details screen in BatteryHistory -->
+ <string name="battery_history_cpu_usage">CPU usage details for <xliff:g id="app_name">%1$s</xliff:g>:</string>
+
+ <!-- Used to show the time spent in user code for a given app in BatteryHistory -->
+ <string name="battery_history_user_time">User time: </string>
+
+ <!-- Used to show the time spent in system code for a given app in BatteryHistory -->
+ <string name="battery_history_system_time">System time: </string>
+
+ <!-- Used to show the time spent in user or system code for a given app in BatteryHistory -->
+ <string name="battery_history_total_time">Total time: </string>
+
+ <!-- Used to show the number of times an app has been started in BatteryHistory -->
+ <string name="battery_history_starts">Starts: <xliff:g id="starts">%1$d</xliff:g></string>
+
+ <!-- Used to show an amount of time in the form "d days, h hours, m minutes, s seconds" in BatteryHistory -->
+ <string name="battery_history_days"><xliff:g id="days">%1$d</xliff:g> 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>
+
+ <!-- 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>
+
+ <!-- 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>
+
+ <!-- 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>
+
+ <!-- Used to head a list of packages that share a given user id BatteryHistory -->
+ <string name="battery_history_packages_sharing_this_uid">Packages sharing this UID:</string>
+
+ <!-- Used when no battery data available in BatteryHistory -->
+ <string name="battery_history_no_data">No battery usage data available</string>
+
+ <!-- Used for Sensor detail screen in BatteryHistory -->
+ <string name="battery_history_sensor">Sensor:</string>
+
+ <!-- Used for Wakelock detail screen in BatteryHistory -->
+ <string name="battery_history_wakelock">Partial Wakelock:</string>
+
+ <!-- Used for Sensor detail screen in BatteryHistory -->
+ <string name="battery_history_used_by_packages">Sensor used by packages:</string>
+
+ <!-- Used for Sensor detail screen in BatteryHistory -->
+ <string name="battery_history_sensor_usage">Used <xliff:g id="count">%1$d</xliff:g> times by <xliff:g id="package">%2$s</xliff:g></string>
+
+ <!-- Used for Sensor detail screen in BatteryHistory -->
+ <string name="battery_history_sensor_usage_multi">Used <xliff:g id="count">%1$d</xliff:g> times by one of:</string>
+
+ <!-- Used for label of awake bar in BatteryHistory -->
+ <string name="battery_history_awake_label">Running</string>
+
+ <!-- Used for label of screen on bar in BatteryHistory -->
+ <string name="battery_history_screen_on_label">Screen on</string>
+
+ <!-- Used for label of phone on bar in BatteryHistory -->
+ <string name="battery_history_phone_on_label">Phone on</string>
+
+ <!-- Used for awake time message in BatteryHistory -->
+ <string name="battery_history_awake">Time spent without sleeping:</string>
+
+ <!-- Used for Screen on time message in BatteryHistory -->
+ <string name="battery_history_screen_on">Time spent with screen on:</string>
+
+ <!-- Used for Phone on time message in BatteryHistory -->
+ <string name="battery_history_phone_on">Time spent with phone on:</string>
+
+ <!-- Used for Screen on time message in BatteryHistory -->
+ <string name="battery_history_screen_on_battery">On battery:</string>
+
+ <!-- XXX remove? Used for Screen on time message in BatteryHistory -->
+ <string name="battery_history_screen_on_plugged">Plugged in:</string>
+
+ <!-- XXX remove? Strings used for displaying usage statistics -->
+ <string name="usage_stats_label">Usage statistics</string>
+
+ <!-- In the Testing screen. The item title of the activity that shows usage statistics. -->
+ <string name="testing_usage_stats">Usage statistics</string>
+ <!-- label for text to indicate sort options -->
+ <string name="display_order_text">Sort by:</string>
+ <!-- label for application name -->
+ <string name="app_name_label">Application</string>
+ <!-- label for launch count -->
+ <string name="launch_count_label">Count</string>
+ <!-- label for usage time -->
+ <string name="usage_time_label">Usage time</string>
+</resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
new file mode 100644
index 0000000..33e43bb
--- /dev/null
+++ b/res/values/styles.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* //device/apps/Preferences/assets/res/any/styles.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources>
+
+ <style name="info_label">
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:textAppearance">@style/TextAppearance.info_label</item>
+ <item name="android:paddingRight">4dip</item>
+ </style>
+
+ <style name="info_value">
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:textAppearance">@style/TextAppearance.info_value</item>
+ </style>
+
+ <style name="info_small">
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:textAppearance">@style/TextAppearance.info_small</item>
+ </style>
+
+ <style name="info_layout">
+ <item name="android:orientation">vertical</item>
+ <item name="android:paddingLeft">10dip</item>
+ <item name="android:paddingTop">10dip</item>
+ <item name="android:paddingRight">10dip</item>
+ <item name="android:paddingBottom">10dip</item>
+ <item name="android:layout_width">fill_parent</item>
+ <item name="android:layout_height">fill_parent</item>
+ </style>
+
+ <style name="entry_layout">
+ <item name="android:orientation">horizontal</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ </style>
+
+ <style name="form_value">
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_width">fill_parent</item>
+ </style>
+
+
+ <style name="TextAppearance" parent="android:TextAppearance">
+ </style>
+
+ <style name="TextAppearance.info_label">
+ <item name="android:textSize">14sp</item>
+ <item name="android:textStyle">bold</item>
+ </style>
+
+ <style name="TextAppearance.info_small">
+ <item name="android:textSize">12sp</item>
+ <item name="android:textStyle">normal</item>
+ </style>
+
+ <style name="TextAppearance.info_value">
+ <item name="android:textSize">14sp</item>
+ <item name="android:textStyle">normal</item>
+ </style>
+
+</resources>
diff --git a/res/xml/apn_editor.xml b/res/xml/apn_editor.xml
new file mode 100644
index 0000000..34029d1
--- /dev/null
+++ b/res/xml/apn_editor.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
+ android:title="@string/apn_edit">
+ <EditTextPreference
+ android:title="@string/apn_name"
+ android:dialogTitle="@string/apn_name"
+ android:key="apn_name"
+ android:singleLine="true"
+ />
+ <EditTextPreference
+ android:title="@string/apn_apn"
+ android:dialogTitle="@string/apn_apn"
+ android:key="apn_apn"
+ android:singleLine="true"
+ />
+ <EditTextPreference
+ android:title="@string/apn_http_proxy"
+ android:dialogTitle="@string/apn_http_proxy"
+ android:key="apn_http_proxy"
+ android:singleLine="true"
+ />
+ <EditTextPreference
+ android:title="@string/apn_http_port"
+ android:dialogTitle="@string/apn_http_port"
+ android:key="apn_http_port"
+ android:singleLine="true"
+ />
+ <EditTextPreference
+ android:title="@string/apn_user"
+ android:dialogTitle="@string/apn_user"
+ android:key="apn_user"
+ android:singleLine="true"
+ />
+ <EditTextPreference
+ android:title="@string/apn_password"
+ android:dialogTitle="@string/apn_password"
+ android:key="apn_password"
+ android:singleLine="true"
+ />
+ <EditTextPreference
+ android:title="@string/apn_server"
+ android:dialogTitle="@string/apn_server"
+ android:key="apn_server"
+ android:singleLine="true"
+ />
+ <EditTextPreference
+ android:title="@string/apn_mmsc"
+ android:dialogTitle="@string/apn_mmsc"
+ android:key="apn_mmsc"
+ android:singleLine="true"
+ />
+ <EditTextPreference
+ android:title="@string/apn_mms_proxy"
+ android:dialogTitle="@string/apn_mms_proxy"
+ android:key="apn_mms_proxy"
+ android:singleLine="true"
+ />
+ <EditTextPreference
+ android:title="@string/apn_mms_port"
+ android:dialogTitle="@string/apn_mms_port"
+ android:key="apn_mms_port"
+ android:singleLine="true"
+ />
+ <EditTextPreference
+ android:title="@string/apn_mcc"
+ android:dialogTitle="@string/apn_mcc"
+ android:key="apn_mcc"
+ android:singleLine="true"
+ />
+ <EditTextPreference
+ android:title="@string/apn_mnc"
+ android:dialogTitle="@string/apn_mnc"
+ android:key="apn_mnc"
+ android:singleLine="true"
+ />
+ <EditTextPreference
+ android:title="@string/apn_type"
+ android:dialogTitle="@string/apn_type"
+ android:key="apn_type"
+ android:singleLine="true"
+ />
+</PreferenceScreen>
diff --git a/res/xml/apn_settings.xml b/res/xml/apn_settings.xml
new file mode 100644
index 0000000..86a336c
--- /dev/null
+++ b/res/xml/apn_settings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
+ android:title="@string/apn_settings" android:key="apn_list">
+</PreferenceScreen>
diff --git a/res/xml/application_settings.xml b/res/xml/application_settings.xml
new file mode 100644
index 0000000..8d0a7cb
--- /dev/null
+++ b/res/xml/application_settings.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/applications_settings_header"
+ android:summary="@string/applications_settings_summary"
+ android:key="applications_settings">
+
+ <CheckBoxPreference
+ android:key="toggle_install_applications"
+ android:title="@string/install_applications"
+ android:summaryOff="@string/install_unknown_applications"
+ android:summaryOn="@string/install_unknown_applications"
+ android:persistent="false" />
+
+ <PreferenceScreen
+ android:key="quick_launch"
+ android:title="@string/quick_launch_title"
+ android:summary="@string/quick_launch_summary">
+ <intent android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.quicklaunch.QuickLaunchSettings" />
+ </PreferenceScreen>
+
+ <PreferenceScreen
+ android:title="@string/manageapplications_settings_title"
+ android:summary="@string/manageapplications_settings_summary">
+ <intent android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.ManageApplications" />
+ </PreferenceScreen>
+
+ <PreferenceScreen
+ android:title="@string/development_settings_title"
+ android:summary="@string/development_settings_summary">
+ <intent android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.DevelopmentSettings" />
+ </PreferenceScreen>
+
+</PreferenceScreen>
+
diff --git a/res/xml/bluetooth_device_advanced.xml b/res/xml/bluetooth_device_advanced.xml
new file mode 100644
index 0000000..5611595
--- /dev/null
+++ b/res/xml/bluetooth_device_advanced.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <PreferenceCategory
+ android:key="title" />
+
+ <CheckBoxPreference
+ android:key="online_mode"
+ android:title="@string/bluetooth_device_advanced_online_mode_title"
+ android:persistent="false" />
+
+ <PreferenceCategory
+ android:key="profile_container"
+ android:title="@string/bluetooth_device_advanced_profile_header_title">
+
+ <!-- Profile checkboxes will be added here programmatically. -->
+
+ </PreferenceCategory>
+
+</PreferenceScreen>
diff --git a/res/xml/bluetooth_settings.xml b/res/xml/bluetooth_settings.xml
new file mode 100644
index 0000000..131f7a0
--- /dev/null
+++ b/res/xml/bluetooth_settings.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/bluetooth_settings" >
+
+ <CheckBoxPreference
+ android:key="bt_checkbox"
+ android:title="@string/bluetooth"
+ android:summary="@string/bluetooth_quick_toggle_summary" />
+
+ <com.android.settings.bluetooth.BluetoothNamePreference
+ android:key="bt_name"
+ android:title="@string/bluetooth_device_name"
+ android:summary="@string/bluetooth_name_not_set"
+ android:dialogTitle="@string/bluetooth_device_name"
+ android:dependency="bt_checkbox"
+ android:persistent="false"
+ android:singleLine="true" />
+
+ <CheckBoxPreference
+ android:key="bt_discoverable"
+ android:title="@string/bluetooth_visibility"
+ android:dependency="bt_checkbox"
+ android:summaryOn="@string/bluetooth_is_discoverable"
+ android:summaryOff="@string/bluetooth_not_discoverable"
+ android:persistent="false" />
+
+ <Preference
+ android:key="bt_scan"
+ android:dependency="bt_checkbox"
+ android:title="@string/bluetooth_preference_scan_title" />
+
+ <com.android.settings.ProgressCategory
+ android:key="bt_device_list"
+ android:title="@string/bluetooth_devices"
+ android:dependency="bt_checkbox"
+ android:orderingFromXml="false" />
+
+</PreferenceScreen>
diff --git a/res/xml/date_time_prefs.xml b/res/xml/date_time_prefs.xml
new file mode 100644
index 0000000..5e696de
--- /dev/null
+++ b/res/xml/date_time_prefs.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/date_and_time">
+ <CheckBoxPreference android:key="auto_time"
+ android:title="@string/date_time_auto"
+ android:summaryOn="@string/date_time_auto_summaryOn"
+ android:summaryOff="@string/date_time_auto_summaryOff"
+ />
+ <Preference android:key="date"
+ android:title="@string/date_time_set_date"
+ android:summary="03/10/2008"
+ />
+ <PreferenceScreen android:key="timezone"
+ android:title="@string/date_time_set_timezone"
+ android:summary="GMT-8:00"
+ />
+ <Preference android:key="time"
+ android:title="@string/date_time_set_time"
+ android:summary="12:00am"
+ />
+ <CheckBoxPreference android:key="24 hour"
+ android:title="@string/date_time_24hour"
+ android:summaryOn="@string/date_time_24_hour_sample"
+ android:summaryOff="@string/date_time_12_hour_sample"/>
+ <ListPreference
+ android:key="date_format"
+ android:title="@string/date_time_date_format"
+ android:summary="mm/dd/yyyy"/>
+</PreferenceScreen>
diff --git a/res/xml/development_prefs.xml b/res/xml/development_prefs.xml
new file mode 100644
index 0000000..77c100a
--- /dev/null
+++ b/res/xml/development_prefs.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/development_settings_title">
+
+ <CheckBoxPreference
+ android:key="enable_adb"
+ android:title="@string/enable_adb"
+ android:summary="@string/enable_adb_summary"/>
+
+ <CheckBoxPreference
+ android:key="keep_screen_on"
+ android:title="@string/keep_screen_on"
+ android:summary="@string/keep_screen_on_summary"/>
+
+ <CheckBoxPreference
+ android:key="allow_mock_location"
+ android:title="@string/allow_mock_location"
+ android:summary="@string/allow_mock_location_summary"/>
+
+</PreferenceScreen>
diff --git a/res/xml/device_info_memory.xml b/res/xml/device_info_memory.xml
new file mode 100644
index 0000000..b7ec3c1
--- /dev/null
+++ b/res/xml/device_info_memory.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <PreferenceCategory android:title="@string/sd_memory">
+ <Preference android:key="memory_sd_size"
+ style="?android:attr/preferenceInformationStyle"
+ android:title="@string/memory_size"
+ android:summary="00"/>
+ <Preference android:key="memory_sd_avail"
+ style="?android:attr/preferenceInformationStyle"
+ android:title="@string/memory_available"
+ android:summary="00"/>
+ <Preference android:key="memory_sd_unmount"
+ android:title="@string/sd_eject"
+ android:summary="@string/sd_eject_summary"/>
+ <Preference android:key="memory_sd_format"
+ android:title="@string/sd_format"
+ android:summary="@string/sd_format_summary"/>
+ </PreferenceCategory>
+
+ <PreferenceCategory android:title="@string/internal_memory">
+ <Preference android:key="memory_internal_avail"
+ style="?android:attr/preferenceInformationStyle"
+ android:title="@string/memory_available"
+ android:summary="00"/>
+ <PreferenceScreen
+ android:title="@string/master_clear_title"
+ android:summary="@string/master_clear_summary">
+ <intent android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.MasterClear" />
+ </PreferenceScreen>
+ </PreferenceCategory>
+
+</PreferenceScreen>
diff --git a/res/xml/device_info_settings.xml b/res/xml/device_info_settings.xml
new file mode 100644
index 0000000..205e588
--- /dev/null
+++ b/res/xml/device_info_settings.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/about_settings">
+
+ <!-- System update settings - launches activity -->
+ <PreferenceScreen android:key="system_update_settings"
+ android:title="@string/system_update_settings_list_item_title"
+ android:summary="@string/system_update_settings_list_item_summary">
+ <intent android:action="android.settings.SYSTEM_UPDATE_SETTINGS" />
+ </PreferenceScreen>
+
+ <!-- Device status - launches activity -->
+ <PreferenceScreen android:key="status_info"
+ android:title="@string/device_status"
+ android:summary="@string/device_status_summary">
+ <intent android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.deviceinfo.Status" />
+ </PreferenceScreen>
+
+ <!-- Legal Information -->
+ <PreferenceScreen
+ android:key="container"
+ android:title="@string/legal_information">
+
+ <!-- Title for this other screen -->
+ <PreferenceCategory android:title="@string/legal_information" />
+
+ <!-- Note: The titles given here probably won't be used. Instead, we programmatically
+ fill the title with the label of the activity with the corresponding action.
+ If there is not an activity for an action, the item will be removed from the
+ list. -->
+
+ <!-- Copyright information -->
+ <PreferenceScreen
+ android:key="copyright"
+ android:title="@string/copyright_title">
+ <intent android:action="android.settings.COPYRIGHT" />
+ </PreferenceScreen>
+
+ <!-- License information -->
+ <PreferenceScreen
+ android:key="license"
+ android:title="@string/license_title">
+ <intent android:action="android.settings.LICENSE" />
+ </PreferenceScreen>
+
+ <!-- Terms and conditions -->
+ <PreferenceScreen
+ android:key="terms"
+ android:title="@string/terms_title">
+ <intent android:action="android.settings.TERMS" />
+ </PreferenceScreen>
+
+ </PreferenceScreen>
+
+ <!-- Contributors -->
+ <PreferenceScreen
+ android:key="contributors"
+ android:title="@string/contributors_title">
+ <intent android:action="android.settings.TEAM" />
+ </PreferenceScreen>
+
+ <!-- Device hardware model -->
+ <Preference android:key="device_model"
+ style="?android:preferenceInformationStyle"
+ android:title="@string/model_number"
+ android:summary="@string/device_info_default"/>
+
+ <!-- Device firmware version -->
+ <Preference android:key="firmware_version"
+ style="?android:preferenceInformationStyle"
+ android:title="@string/firmware_version"
+ android:summary="@string/device_info_default"/>
+
+ <!-- Device Baseband version -->
+ <Preference android:key="baseband_version"
+ style="?android:preferenceInformationStyle"
+ android:title="@string/baseband_version"
+ android:summary="@string/device_info_default"/>
+
+ <!-- Device Kernel version -->
+ <Preference android:key="kernel_version"
+ style="?android:preferenceInformationStyle"
+ android:title="@string/kernel_version"
+ android:summary="@string/device_info_default"/>
+
+ <!-- Detailed build version -->
+ <Preference android:key="build_number"
+ style="?android:preferenceInformationStyle"
+ android:title="@string/build_number"
+ android:summary="@string/device_info_default"/>
+
+</PreferenceScreen>
diff --git a/res/xml/device_info_status.xml b/res/xml/device_info_status.xml
new file mode 100644
index 0000000..9537795
--- /dev/null
+++ b/res/xml/device_info_status.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/device_status_activity_title">
+
+ <Preference android:key="battery_status"
+ style="?android:attr/preferenceInformationStyle"
+ android:title="@string/battery_status_title"
+ android:summary="@string/device_info_not_available"
+ android:persistent="false" />
+ <Preference android:key="battery_level"
+ style="?android:attr/preferenceInformationStyle"
+ android:title="@string/battery_level_title"
+ android:summary="@string/device_info_not_available"
+ android:persistent="false" />
+ <Preference android:key="number"
+ style="?android:attr/preferenceInformationStyle"
+ android:title="@string/status_number"
+ android:summary="@string/device_info_not_available"
+ android:persistent="false" />
+ <Preference android:key="operator_name"
+ style="?android:attr/preferenceInformationStyle"
+ android:title="@string/status_operator"
+ android:summary="@string/device_info_not_available"
+ android:persistent="false" />
+ <Preference android:key="signal_strength"
+ style="?android:attr/preferenceInformationStyle"
+ android:title="@string/status_signal_strength"
+ android:summary="@string/device_info_not_available"
+ android:persistent="false" />
+ <Preference android:key="network_type"
+ style="?android:attr/preferenceInformationStyle"
+ android:title="@string/status_network_type"
+ android:summary="@string/device_info_not_available"
+ android:persistent="false" />
+ <Preference android:key="service_state"
+ style="?android:attr/preferenceInformationStyle"
+ android:title="@string/status_service_state"
+ android:summary="@string/device_info_not_available"
+ android:persistent="false" />
+ <Preference android:key="roaming_state"
+ style="?android:attr/preferenceInformationStyle"
+ android:title="@string/status_roaming"
+ android:summary="@string/device_info_not_available"
+ android:persistent="false" />
+ <Preference android:key="data_state"
+ style="?android:attr/preferenceInformationStyle"
+ android:title="@string/status_data_state"
+ android:summary="@string/device_info_not_available"
+ android:persistent="false" />
+ <Preference android:key="imei"
+ style="?android:attr/preferenceInformationStyle"
+ android:title="@string/status_imei"
+ android:summary="@string/device_info_not_available"
+ android:persistent="false" />
+ <Preference android:key="imei_sv"
+ style="?android:attr/preferenceInformationStyle"
+ android:title="@string/status_imei_sv"
+ android:summary="@string/device_info_not_available"
+ android:persistent="false" />
+ <Preference android:key="wifi_mac_address"
+ style="?android:attr/preferenceInformationStyle"
+ android:title="@string/status_wifi_mac_address"
+ android:summary="@string/device_info_not_available"
+ android:persistent="false" />
+ <Preference android:key="bt_address"
+ style="?android:attr/preferenceInformationStyle"
+ android:title="@string/status_bt_address"
+ android:summary="@string/device_info_not_available"
+ android:persistent="false" />
+ <Preference android:key="network_traffic_stats"
+ style="?android:attr/preferenceInformationStyle"
+ android:title="@string/status_network_traffic_stats"
+ android:summary="@string/device_info_not_available"
+ android:persistent="false" />
+ <Preference android:key="up_time"
+ style="?android:attr/preferenceInformationStyle"
+ android:title="@string/status_up_time"
+ android:summary="@string/device_info_not_available"
+ android:persistent="false" />
+ <Preference android:key="awake_time"
+ style="?android:attr/preferenceInformationStyle"
+ android:title="@string/status_awake_time"
+ android:summary="@string/device_info_not_available"
+ android:persistent="false" />
+
+</PreferenceScreen>
diff --git a/res/xml/input_methods_prefs.xml b/res/xml/input_methods_prefs.xml
new file mode 100644
index 0000000..9a4f527
--- /dev/null
+++ b/res/xml/input_methods_prefs.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * Copyright 2008, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/input_methods_settings_title">
+
+</PreferenceScreen>
diff --git a/res/xml/language_settings.xml b/res/xml/language_settings.xml
new file mode 100644
index 0000000..050896f
--- /dev/null
+++ b/res/xml/language_settings.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
+ android:title="@string/language_settings">
+
+ <PreferenceScreen
+ android:title="@string/phone_language"
+ android:summary="@string/phone_language_summary">
+ <intent android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.LocalePicker"/>
+ </PreferenceScreen>
+
+ <PreferenceCategory android:key="text_category"
+ android:title="@string/text_category" />
+
+ <PreferenceScreen
+ android:title="@string/user_dict_settings_title"
+ android:summary="@string/user_dict_settings_summary">
+ <intent android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.UserDictionarySettings" />
+ </PreferenceScreen>
+
+ <PreferenceCategory
+ android:key="hardkeyboard_category"
+ android:title="@string/hardkeyboard_category">
+ <CheckBoxPreference
+ android:key="auto_replace"
+ android:title="@string/auto_replace"
+ android:summaryOn="@string/auto_replace_summary"
+ android:summaryOff="@string/auto_replace_summary"
+ android:persistent="false"/>
+ <CheckBoxPreference
+ android:key="auto_caps"
+ android:title="@string/auto_caps"
+ android:summaryOn="@string/auto_caps_summary"
+ android:summaryOff="@string/auto_caps_summary"
+ android:persistent="false"/>
+ <CheckBoxPreference
+ android:key="auto_punctuate"
+ android:title="@string/auto_punctuate"
+ android:summaryOn="@string/auto_punctuate_summary"
+ android:summaryOff="@string/auto_punctuate_summary"
+ android:persistent="false"/>
+ </PreferenceCategory>
+</PreferenceScreen>
diff --git a/res/xml/quick_launch_settings.xml b/res/xml/quick_launch_settings.xml
new file mode 100644
index 0000000..eb5585c
--- /dev/null
+++ b/res/xml/quick_launch_settings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:key="shortcut_category"
+ android:title="@string/quick_launch_title">
+
+ <!-- Preferences will be filled here. -->
+
+</PreferenceScreen>
diff --git a/res/xml/security_settings.xml b/res/xml/security_settings.xml
new file mode 100644
index 0000000..788aae3
--- /dev/null
+++ b/res/xml/security_settings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <PreferenceCategory
+ android:title="@string/location_title">
+
+ <CheckBoxPreference
+ android:key="location_network"
+ android:title="@string/location_network_based"
+ android:summaryOn="@string/location_neighborhood_level"
+ android:summaryOff="@string/location_networks_disabled"/>
+
+ <CheckBoxPreference
+ android:key="location_gps"
+ android:title="@string/location_gps"
+ android:summaryOn="@string/location_street_level"
+ android:summaryOff="@string/location_gps_disabled"/>
+
+ </PreferenceCategory>
+
+</PreferenceScreen>
diff --git a/res/xml/settings.xml b/res/xml/settings.xml
new file mode 100644
index 0000000..5c0a1e1
--- /dev/null
+++ b/res/xml/settings.xml
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/settings_label"
+ android:key="parent">
+
+ <PreferenceScreen
+ android:title="@string/radio_controls_title"
+ android:summary="@string/radio_controls_summary">
+ <intent
+ android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.WirelessSettings" />
+ </PreferenceScreen>
+
+ <PreferenceScreen
+ android:key="call_settings"
+ android:title="@string/call_settings_title"
+ android:summary="@string/call_settings_summary">
+ <intent
+ android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.phone"
+ android:targetClass="com.android.phone.CallFeaturesSetting" />
+ </PreferenceScreen>
+
+ <!-- Sound and Display -->
+
+ <PreferenceScreen
+ android:title="@string/sound_and_display_settings"
+ android:summary="@string/sound_and_display_settings_summary">
+ <intent
+ android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.SoundAndDisplaySettings" />
+ </PreferenceScreen>
+
+ <!-- Data Sync. The settings activity will ensure this is resolved to an
+ activity on the system image, otherwise it will remove this
+ preference. -->
+
+ <PreferenceScreen
+ android:title="@string/sync_settings"
+ android:summary="@string/sync_settings_summary"
+ android:key="sync_settings">
+ <intent android:action="android.settings.SYNC_SETTINGS" />
+ </PreferenceScreen>
+
+ <!-- Security & Privacy -->
+
+ <PreferenceScreen
+ android:title="@string/security_settings_title"
+ android:summary="@string/security_settings_summary">
+ <intent
+ android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.SecuritySettings" />
+ </PreferenceScreen>
+
+ <!-- Application Settings -->
+
+ <PreferenceScreen
+ android:title="@string/applications_settings"
+ android:summary="@string/applications_settings_summary"
+ android:key="applications_settings">
+ <intent
+ android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.ApplicationSettings" />
+ </PreferenceScreen>
+
+ <!-- Storage -->
+
+ <PreferenceScreen
+ android:title="@string/storage_settings_title"
+ android:summary="@string/storage_settings_summary">
+ <intent android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.deviceinfo.Memory" />
+ </PreferenceScreen>
+
+ <!-- Date & Time -->
+
+ <PreferenceScreen
+ android:title="@string/date_and_time_settings_title"
+ android:summary="@string/date_and_time_settings_summary">
+ <intent
+ android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.DateTimeSettings" />
+ </PreferenceScreen>
+
+ <!-- Language -->
+
+ <PreferenceScreen
+ android:title="@string/language_settings"
+ android:summary="@string/language_settings_summary">
+ <intent
+ android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.LanguageSettings" />
+ </PreferenceScreen>
+
+ <!-- About Device -->
+
+ <PreferenceScreen
+ android:title="@string/about_settings"
+ android:summary="@string/about_settings_summary">
+ <intent
+ android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.DeviceInfoSettings" />
+ </PreferenceScreen>
+
+</PreferenceScreen>
diff --git a/res/xml/sim_lock_settings.xml b/res/xml/sim_lock_settings.xml
new file mode 100644
index 0000000..b2ecb11
--- /dev/null
+++ b/res/xml/sim_lock_settings.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
+ android:title="@string/sim_lock_settings">
+
+ <CheckBoxPreference
+ android:key="sim_toggle"
+ android:title="@string/sim_pin_toggle"
+ android:summaryOn="@string/sim_lock_on"
+ android:summaryOff="@string/sim_lock_off"/>
+ <com.android.settings.EditPinPreference
+ android:key="sim_pin"
+ android:title="@string/sim_pin_change"
+ android:dialogTitle="@string/sim_change_pin"
+ android:dialogMessage="@string/sim_enter_old"
+ android:positiveButtonText="@string/sim_enter_ok"
+ android:negativeButtonText="@string/sim_enter_cancel"/>
+</PreferenceScreen>
diff --git a/res/xml/sound_and_display_settings.xml b/res/xml/sound_and_display_settings.xml
new file mode 100644
index 0000000..2aa44c8
--- /dev/null
+++ b/res/xml/sound_and_display_settings.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res/com.android.settings">
+
+ <PreferenceCategory
+ android:title="@string/sound_settings">
+
+ <CheckBoxPreference
+ android:key="silent"
+ android:title="@string/silent_mode_title"
+ android:summary="@string/silent_mode_summary"
+ android:persistent="false"
+ android:disableDependentsState="true" />
+
+ <com.android.settings.RingerVolumePreference
+ android:key="ring_volume"
+ android:title="@string/ring_volume_title"
+ android:summary="@string/ring_volume_summary"
+ android:dialogTitle="@string/ring_volume_title"
+ android:persistent="false"
+ android:dependency="silent"
+ android:streamType="ring" />
+
+ <VolumePreference
+ android:key="media_volume"
+ android:title="@string/media_volume_title"
+ android:summary="@string/media_volume_summary"
+ android:dialogTitle="@string/media_volume_title"
+ android:persistent="false"
+ android:streamType="music" />
+
+ <com.android.settings.DefaultRingtonePreference
+ android:key="ringtone"
+ android:title="@string/ringtone_title"
+ android:summary="@string/ringtone_summary"
+ android:dialogTitle="@string/ringtone_title"
+ android:persistent="false"
+ android:dependency="silent"
+ android:ringtoneType="ringtone" />
+
+ <CheckBoxPreference
+ android:key="vibrate"
+ android:title="@string/vibrate_title"
+ android:summary="@string/vibrate_summary"
+ android:persistent="false" />
+
+ <com.android.settings.DefaultRingtonePreference
+ android:key="notification_sound"
+ android:title="@string/notification_sound_title"
+ android:summary="@string/notification_sound_summary"
+ android:dialogTitle="@string/notification_sound_dialog_title"
+ android:dependency="silent"
+ android:persistent="false"
+ android:ringtoneType="notification" />
+
+ <CheckBoxPreference
+ android:key="dtmf_tone"
+ android:title="@string/dtmf_tone_enable_title"
+ android:summaryOn="@string/dtmf_tone_enable_summary_on"
+ android:summaryOff="@string/dtmf_tone_enable_summary_off"
+ android:dependency="silent"
+ android:defaultValue="true" />
+
+ <CheckBoxPreference
+ android:key="sound_effects"
+ android:title="@string/sound_effects_enable_title"
+ android:summaryOn="@string/sound_effects_enable_summary_on"
+ android:summaryOff="@string/sound_effects_enable_summary_off"
+ android:dependency="silent"
+ android:defaultValue="true" />
+
+ <CheckBoxPreference
+ android:key="play_media_notification_sounds"
+ android:title="@string/play_media_notification_sounds_enable_title"
+ android:summaryOn="@string/play_media_notification_sounds_enable_summary_on"
+ android:summaryOff="@string/play_media_notification_sounds_enable_summary_off"
+ android:dependency="silent"
+ android:defaultValue="true" />
+
+ </PreferenceCategory>
+
+ <PreferenceCategory
+ android:title="@string/display_settings">
+
+ <CheckBoxPreference
+ android:key="animations"
+ android:title="@string/animations_title"
+ android:summaryOn="@string/animations_summary_on"
+ android:summaryOff="@string/animations_summary_off" />
+
+
+ <com.android.settings.BrightnessPreference
+ android:key="brightness"
+ android:title="@string/brightness"
+ android:summary="@string/brightness_summary"
+ android:dialogIcon="@drawable/ic_popup_brightness"
+ android:dialogTitle="@string/brightness" />
+
+ <ListPreference
+ android:key="screen_timeout"
+ android:title="@string/screen_timeout"
+ android:summary="@string/screen_timeout_summary"
+ android:persistent="false"
+ android:entries="@array/screen_timeout_entries"
+ android:entryValues="@array/screen_timeout_values" />
+
+ </PreferenceCategory>
+
+</PreferenceScreen>
diff --git a/res/xml/testing_settings.xml b/res/xml/testing_settings.xml
new file mode 100644
index 0000000..87c9cf8
--- /dev/null
+++ b/res/xml/testing_settings.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/testing" >
+
+ <PreferenceScreen
+ android:title="@string/testing_phone_info">
+ <intent android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.RadioInfo" />
+ </PreferenceScreen>
+
+ <PreferenceScreen
+ android:title="@string/testing_battery_info">
+ <intent android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.BatteryInfo" />
+ </PreferenceScreen>
+
+
+ <PreferenceScreen
+ android:title="@string/testing_battery_history">
+ <intent android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.battery_history.BatteryHistory" />
+ </PreferenceScreen>
+
+ <PreferenceScreen
+ android:title="@string/testing_usage_stats">
+ <intent android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.UsageStats" />
+ </PreferenceScreen>
+ <!--
+ <PreferenceScreen
+ android:title="@string/testing_sim_toolkit">
+ <intent android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.stk"
+ android:targetClass="com.android.stk.StkSettings" />
+ </PreferenceScreen>
+ -->
+
+</PreferenceScreen>
+
diff --git a/res/xml/timezones.xml b/res/xml/timezones.xml
new file mode 100644
index 0000000..e515f16
--- /dev/null
+++ b/res/xml/timezones.xml
@@ -0,0 +1,84 @@
+<timezones>
+ <timezone id="Pacific/Majuro">Marshall Islands</timezone>
+ <timezone id="Pacific/Midway">Midway Island</timezone>
+ <timezone id="Pacific/Honolulu">Hawaii</timezone>
+ <timezone id="America/Anchorage">Alaska</timezone>
+ <timezone id="America/Los_Angeles">Pacific Time</timezone>
+ <timezone id="America/Tijuana">Tijuana</timezone>
+ <timezone id="America/Phoenix">Arizona</timezone>
+ <timezone id="America/Chihuahua">Chihuahua</timezone>
+ <timezone id="America/Denver">Mountain Time</timezone>
+ <timezone id="America/Costa_Rica">Central America</timezone>
+ <timezone id="America/Chicago">Central Time</timezone>
+ <timezone id="America/Mexico_City">Mexico City</timezone>
+ <timezone id="America/Regina">Saskatchewan</timezone>
+ <timezone id="America/Bogota">Bogota</timezone>
+ <timezone id="America/New_York">Eastern Time</timezone>
+ <timezone id="America/Caracas">Venezuela</timezone>
+ <timezone id="America/Barbados">Atlantic Time</timezone>
+ <timezone id="America/Manaus">Manaus</timezone>
+ <timezone id="America/Santiago">Santiago</timezone>
+ <timezone id="America/St_Johns">Newfoundland</timezone>
+ <timezone id="America/Araguaina">Brasilia</timezone>
+ <timezone id="America/Argentina/Buenos_Aires">Buenos Aires</timezone>
+ <timezone id="America/Godthab">Greenland</timezone>
+ <timezone id="America/Montevideo">Montevideo</timezone>
+ <timezone id="Atlantic/South_Georgia">Mid-Atlantic</timezone>
+ <timezone id="Atlantic/Azores">Azores</timezone>
+ <timezone id="Atlantic/Cape_Verde">Cape Verde Islands</timezone>
+ <timezone id="Africa/Casablanca">Casablanca</timezone>
+ <timezone id="Europe/London">London, Dublin</timezone>
+ <timezone id="Europe/Amsterdam">Amsterdam, Berlin</timezone>
+ <timezone id="Europe/Belgrade">Belgrade</timezone>
+ <timezone id="Europe/Brussels">Brussels</timezone>
+ <timezone id="Europe/Sarajevo">Sarajevo</timezone>
+ <timezone id="Africa/Windhoek">Windhoek</timezone>
+ <timezone id="Africa/Brazzaville">W. Africa Time</timezone>
+ <timezone id="Asia/Amman">Amman, Jordan</timezone>
+ <timezone id="Europe/Athens">Athens, Istanbul</timezone>
+ <timezone id="Asia/Beirut">Beirut, Lebanon</timezone>
+ <timezone id="Africa/Cairo">Cairo</timezone>
+ <timezone id="Europe/Helsinki">Helsinki</timezone>
+ <timezone id="Asia/Jerusalem">Jerusalem</timezone>
+ <timezone id="Europe/Minsk">Minsk</timezone>
+ <timezone id="Africa/Harare">Harare</timezone>
+ <timezone id="Asia/Baghdad">Baghdad</timezone>
+ <timezone id="Europe/Moscow">Moscow</timezone>
+ <timezone id="Asia/Kuwait">Kuwait</timezone>
+ <timezone id="Africa/Nairobi">Nairobi</timezone>
+ <timezone id="Asia/Tehran">Tehran</timezone>
+ <timezone id="Asia/Baku">Baku</timezone>
+ <timezone id="Asia/Tbilisi">Tbilisi</timezone>
+ <timezone id="Asia/Yerevan">Yerevan</timezone>
+ <timezone id="Asia/Dubai">Dubai</timezone>
+ <timezone id="Asia/Kabul">Kabul</timezone>
+ <timezone id="Asia/Karachi">Islamabad, Karachi</timezone>
+ <timezone id="Asia/Oral">Ural'sk</timezone>
+ <timezone id="Asia/Yekaterinburg">Yekaterinburg</timezone>
+ <timezone id="Asia/Calcutta">Kolkata</timezone>
+ <timezone id="Asia/Colombo">Sri Lanka</timezone>
+ <timezone id="Asia/Katmandu">Kathmandu</timezone>
+ <timezone id="Asia/Almaty">Astana</timezone>
+ <timezone id="Asia/Rangoon">Yangon</timezone>
+ <timezone id="Asia/Krasnoyarsk">Krasnoyarsk</timezone>
+ <timezone id="Asia/Bangkok">Bangkok</timezone>
+ <timezone id="Asia/Hong_Kong">Beijing, Hong Kong</timezone>
+ <timezone id="Asia/Irkutsk">Irkutsk</timezone>
+ <timezone id="Asia/Kuala_Lumpur">Kuala Lumpur</timezone>
+ <timezone id="Australia/Perth">Perth</timezone>
+ <timezone id="Asia/Taipei">Taipei</timezone>
+ <timezone id="Asia/Seoul">Seoul</timezone>
+ <timezone id="Asia/Tokyo">Tokyo, Osaka</timezone>
+ <timezone id="Asia/Yakutsk">Yakutsk</timezone>
+ <timezone id="Australia/Adelaide">Adelaide</timezone>
+ <timezone id="Australia/Darwin">Darwin</timezone>
+ <timezone id="Australia/Brisbane">Brisbane</timezone>
+ <timezone id="Australia/Hobart">Hobart</timezone>
+ <timezone id="Australia/Sydney">Sydney, Canberra</timezone>
+ <timezone id="Asia/Vladivostok">Vladivostok</timezone>
+ <timezone id="Pacific/Guam">Guam</timezone>
+ <timezone id="Asia/Magadan">Magadan</timezone>
+ <timezone id="Pacific/Auckland">Auckland</timezone>
+ <timezone id="Pacific/Fiji">Fiji</timezone>
+ <timezone id="Pacific/Tongatapu">Tonga</timezone>
+</timezones>
diff --git a/res/xml/wifi_advanced_settings.xml b/res/xml/wifi_advanced_settings.xml
new file mode 100644
index 0000000..3e0ff05
--- /dev/null
+++ b/res/xml/wifi_advanced_settings.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/wifi_advanced_titlebar">
+
+ <ListPreference
+ android:key="num_channels"
+ android:title="@string/wifi_setting_num_channels_title"
+ android:summary="@string/wifi_setting_num_channels_summary"
+ android:persistent="false"
+ />
+
+ <ListPreference
+ android:key="sleep_policy"
+ android:title="@string/wifi_setting_sleep_policy_title"
+ android:summary="@string/wifi_setting_sleep_policy_summary"
+ android:persistent="false"
+ android:entries="@array/wifi_sleep_policy_entries"
+ android:entryValues="@array/wifi_sleep_policy_values"
+ />
+
+ <Preference android:key="mac_address"
+ style="?android:attr/preferenceInformationStyle"
+ android:title="@string/wifi_advanced_mac_address_title"
+ />
+
+ <PreferenceCategory
+ android:title="@string/wifi_ip_settings_titlebar"
+ />
+
+ <CheckBoxPreference
+ android:key="use_static_ip"
+ android:title="@string/wifi_use_static_ip"
+ android:persistent="false"
+ />
+
+ <EditTextPreference
+ android:dependency="use_static_ip"
+ android:key="ip_address"
+ android:title="@string/wifi_ip_address"
+ android:persistent="false"
+ android:singleLine="true"
+ />
+
+ <EditTextPreference
+ android:dependency="use_static_ip"
+ android:key="gateway"
+ android:title="@string/wifi_gateway"
+ android:persistent="false"
+ android:singleLine="true"
+ />
+
+ <EditTextPreference
+ android:dependency="use_static_ip"
+ android:key="netmask"
+ android:title="@string/wifi_netmask"
+ android:persistent="false"
+ android:singleLine="true"
+ />
+
+ <EditTextPreference
+ android:dependency="use_static_ip"
+ android:key="dns1"
+ android:title="@string/wifi_dns1"
+ android:persistent="false"
+ android:singleLine="true"
+ />
+
+ <EditTextPreference
+ android:dependency="use_static_ip"
+ android:key="dns2"
+ android:title="@string/wifi_dns2"
+ android:persistent="false"
+ android:singleLine="true"
+ />
+
+</PreferenceScreen>
diff --git a/res/xml/wifi_settings.xml b/res/xml/wifi_settings.xml
new file mode 100644
index 0000000..9101e46
--- /dev/null
+++ b/res/xml/wifi_settings.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/wifi_settings_category">
+
+ <CheckBoxPreference
+ android:key="wifi_enabled"
+ android:title="@string/wifi"
+ android:summary="@string/wifi_quick_toggle_summary"
+ android:persistent="false" />
+
+ <CheckBoxPreference
+ android:key="open_network_notifications_enabled"
+ android:dependency="wifi_enabled"
+ android:title="@string/wifi_notify_open_networks"
+ android:summary="@string/wifi_notify_open_networks_summary"
+ android:persistent="false" />
+
+ <com.android.settings.ProgressCategory
+ android:key="access_points"
+ android:dependency="wifi_enabled"
+ android:title="@string/wifi_access_points"
+ android:persistent="false" />
+
+ <Preference
+ android:key="add_other_network"
+ android:dependency="wifi_enabled"
+ android:title="@string/wifi_add_other_network"
+ android:persistent="false" />
+
+</PreferenceScreen>
diff --git a/res/xml/wireless_settings.xml b/res/xml/wireless_settings.xml
new file mode 100644
index 0000000..f81fb41
--- /dev/null
+++ b/res/xml/wireless_settings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/radio_controls_title">
+
+ <!-- Programmatically will have dynamic summary, but we provide the fallback summary. -->
+ <CheckBoxPreference
+ android:key="toggle_wifi"
+ android:title="@string/wifi_quick_toggle_title"
+ android:summary="@string/wifi_quick_toggle_summary"
+ android:persistent="false"
+ android:dependency="toggle_airplane" />
+
+ <PreferenceScreen
+ android:title="@string/wifi_settings"
+ android:summary="@string/wifi_settings_summary"
+ android:dependency="toggle_airplane">
+ <intent
+ android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.wifi.WifiSettings" />
+ </PreferenceScreen>
+
+ <CheckBoxPreference
+ android:key="toggle_bluetooth"
+ android:title="@string/bluetooth_quick_toggle_title"
+ android:summary="@string/bluetooth_quick_toggle_summary"
+ android:persistent="false"
+ android:dependency="toggle_airplane" />
+
+ <PreferenceScreen
+ android:title="@string/bluetooth_settings_title"
+ android:summary="@string/bluetooth_settings_summary"
+ android:dependency="toggle_airplane">
+ <intent
+ android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.settings"
+ android:targetClass="com.android.settings.bluetooth.BluetoothSettings" />
+ </PreferenceScreen>
+
+ <PreferenceScreen
+ android:title="@string/network_settings_title"
+ android:summary="@string/network_settings_summary"
+ android:dependency="toggle_airplane">
+ <intent
+ android:action="android.intent.action.MAIN"
+ android:targetPackage="com.android.phone"
+ android:targetClass="com.android.phone.Settings" />
+ </PreferenceScreen>
+
+ <CheckBoxPreference
+ android:key="toggle_airplane"
+ android:title="@string/airplane_mode"
+ android:summary="@string/airplane_mode_summary"
+ android:persistent="false"
+ android:disableDependentsState="true" />
+
+
+</PreferenceScreen>
diff --git a/src/com/android/settings/ActivityPicker.java b/src/com/android/settings/ActivityPicker.java
new file mode 100644
index 0000000..47e005f
--- /dev/null
+++ b/src/com/android/settings/ActivityPicker.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2009 Google Inc.
+ *
+ * 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.LauncherActivity;
+import android.content.Intent;
+import android.os.Parcelable;
+import android.view.View;
+import android.widget.ListView;
+
+/**
+ * Displays a list of all activities matching the incoming {@link Intent.EXTRA_INTENT}
+ * query, along with any applicable icons.
+ */
+public class ActivityPicker extends LauncherActivity {
+
+ @Override
+ protected Intent getTargetIntent() {
+ Intent intent = this.getIntent();
+ Intent targetIntent = new Intent(Intent.ACTION_MAIN, null);
+ targetIntent.addCategory(Intent.CATEGORY_DEFAULT);
+
+ // Use a custom title for this dialog, if provided
+ if (intent.hasExtra(Intent.EXTRA_TITLE)) {
+ String title = intent.getStringExtra(Intent.EXTRA_TITLE);
+ setTitle(title);
+ }
+
+ Parcelable parcel = intent.getParcelableExtra(Intent.EXTRA_INTENT);
+ if (parcel instanceof Intent) {
+ targetIntent = (Intent) parcel;
+ }
+
+ return targetIntent;
+ }
+
+ @Override
+ protected void onListItemClick(ListView l, View v, int position, long id) {
+ Intent intent = intentForPosition(position);
+ setResult(RESULT_OK, intent);
+ finish();
+ }
+
+}
diff --git a/src/com/android/settings/AirplaneModeEnabler.java b/src/com/android/settings/AirplaneModeEnabler.java
new file mode 100644
index 0000000..f105712
--- /dev/null
+++ b/src/com/android/settings/AirplaneModeEnabler.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import com.android.internal.telephony.PhoneStateIntentReceiver;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Handler;
+import android.os.Message;
+import android.preference.CheckBoxPreference;
+import android.preference.Preference;
+import android.provider.Settings;
+import android.telephony.ServiceState;
+
+public class AirplaneModeEnabler implements Preference.OnPreferenceChangeListener {
+
+ private final Context mContext;
+
+ private PhoneStateIntentReceiver mPhoneStateReceiver;
+
+ private final CheckBoxPreference mCheckBoxPref;
+
+ private static final int EVENT_SERVICE_STATE_CHANGED = 3;
+
+ private Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case EVENT_SERVICE_STATE_CHANGED:
+ onAirplaneModeChanged();
+ break;
+ }
+ }
+ };
+
+ public AirplaneModeEnabler(Context context, CheckBoxPreference airplaneModeCheckBoxPreference) {
+
+ mContext = context;
+ mCheckBoxPref = airplaneModeCheckBoxPreference;
+
+ airplaneModeCheckBoxPreference.setPersistent(false);
+
+ mPhoneStateReceiver = new PhoneStateIntentReceiver(mContext, mHandler);
+ mPhoneStateReceiver.notifyServiceState(EVENT_SERVICE_STATE_CHANGED);
+ }
+
+ public void resume() {
+
+ // This is the widget enabled state, not the preference toggled state
+ mCheckBoxPref.setEnabled(true);
+ mCheckBoxPref.setChecked(isAirplaneModeOn(mContext));
+
+ mPhoneStateReceiver.registerIntent();
+ mCheckBoxPref.setOnPreferenceChangeListener(this);
+ }
+
+ public void pause() {
+ mPhoneStateReceiver.unregisterIntent();
+ mCheckBoxPref.setOnPreferenceChangeListener(null);
+ }
+
+ static boolean isAirplaneModeOn(Context context) {
+ return Settings.System.getInt(context.getContentResolver(),
+ Settings.System.AIRPLANE_MODE_ON, 0) != 0;
+ }
+
+ private void setAirplaneModeOn(boolean enabling) {
+
+ mCheckBoxPref.setEnabled(false);
+ mCheckBoxPref.setSummary(enabling ? R.string.airplane_mode_turning_on
+ : R.string.airplane_mode_turning_off);
+
+ // Change the system setting
+ Settings.System.putInt(mContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON,
+ enabling ? 1 : 0);
+
+ // Post the intent
+ Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
+ intent.putExtra("state", enabling);
+ mContext.sendBroadcast(intent);
+ }
+
+ /**
+ * Called when we've received confirmation that the airplane mode was set.
+ */
+ private void onAirplaneModeChanged() {
+ ServiceState serviceState = mPhoneStateReceiver.getServiceState();
+ boolean airplaneModeEnabled = serviceState.getState() == ServiceState.STATE_POWER_OFF;
+ mCheckBoxPref.setChecked(airplaneModeEnabled);
+ mCheckBoxPref.setSummary(airplaneModeEnabled ? null :
+ mContext.getString(R.string.airplane_mode_summary));
+ mCheckBoxPref.setEnabled(true);
+ }
+
+ /**
+ * Called when someone clicks on the checkbox preference.
+ */
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ setAirplaneModeOn((Boolean) newValue);
+ return true;
+ }
+
+}
diff --git a/src/com/android/settings/ApnEditor.java b/src/com/android/settings/ApnEditor.java
new file mode 100644
index 0000000..f1fa2ef
--- /dev/null
+++ b/src/com/android/settings/ApnEditor.java
@@ -0,0 +1,403 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.app.AlertDialog;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.res.Resources;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.SystemProperties;
+import android.preference.EditTextPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.provider.Telephony;
+import com.android.internal.telephony.TelephonyProperties;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuItem;
+
+
+public class ApnEditor extends PreferenceActivity
+ implements SharedPreferences.OnSharedPreferenceChangeListener {
+
+
+ private final static String TAG = ApnEditor.class.getSimpleName();
+
+ private final static String SAVED_POS = "pos";
+
+ private static final int MENU_DELETE = Menu.FIRST;
+ private static final int MENU_SAVE = Menu.FIRST + 1;
+ private static final int MENU_CANCEL = Menu.FIRST + 2;
+
+ private static String sNotSet;
+ private EditTextPreference mName;
+ private EditTextPreference mApn;
+ private EditTextPreference mProxy;
+ private EditTextPreference mPort;
+ private EditTextPreference mUser;
+ private EditTextPreference mServer;
+ private EditTextPreference mPassword;
+ private EditTextPreference mMmsc;
+ private EditTextPreference mMcc;
+ private EditTextPreference mMnc;
+ private EditTextPreference mMmsProxy;
+ private EditTextPreference mMmsPort;
+ private EditTextPreference mApnType;
+ private String mCurMnc;
+ private String mCurMcc;
+
+ private Uri mUri;
+ private Cursor mCursor;
+ private boolean mNewApn;
+ private boolean mFirstTime;
+ private Resources mRes;
+
+ /**
+ * Standard projection for the interesting columns of a normal note.
+ */
+ private static final String[] sProjection = new String[] {
+ Telephony.Carriers._ID, // 0
+ Telephony.Carriers.NAME, // 1
+ Telephony.Carriers.APN, // 2
+ Telephony.Carriers.PROXY, // 3
+ Telephony.Carriers.PORT, // 4
+ Telephony.Carriers.USER, // 5
+ Telephony.Carriers.SERVER, // 6
+ Telephony.Carriers.PASSWORD, // 7
+ Telephony.Carriers.MMSC, // 8
+ Telephony.Carriers.MCC, // 9
+ Telephony.Carriers.MNC, // 10
+ Telephony.Carriers.NUMERIC, // 11
+ Telephony.Carriers.MMSPROXY,// 12
+ Telephony.Carriers.MMSPORT, // 13
+ Telephony.Carriers.TYPE, // 14
+ };
+
+ private static final int ID_INDEX = 0;
+ private static final int NAME_INDEX = 1;
+ private static final int APN_INDEX = 2;
+ private static final int PROXY_INDEX = 3;
+ private static final int PORT_INDEX = 4;
+ private static final int USER_INDEX = 5;
+ private static final int SERVER_INDEX = 6;
+ private static final int PASSWORD_INDEX = 7;
+ private static final int MMSC_INDEX = 8;
+ private static final int MCC_INDEX = 9;
+ private static final int MNC_INDEX = 10;
+ private static final int MMSPROXY_INDEX = 12;
+ private static final int MMSPORT_INDEX = 13;
+ private static final int TYPE_INDEX = 14;
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ addPreferencesFromResource(R.xml.apn_editor);
+
+ sNotSet = getResources().getString(R.string.apn_not_set);
+ mName = (EditTextPreference) findPreference("apn_name");
+ mApn = (EditTextPreference) findPreference("apn_apn");
+ mProxy = (EditTextPreference) findPreference("apn_http_proxy");
+ mPort = (EditTextPreference) findPreference("apn_http_port");
+ mUser = (EditTextPreference) findPreference("apn_user");
+ mServer = (EditTextPreference) findPreference("apn_server");
+ mPassword = (EditTextPreference) findPreference("apn_password");
+ mMmsProxy = (EditTextPreference) findPreference("apn_mms_proxy");
+ mMmsPort = (EditTextPreference) findPreference("apn_mms_port");
+ mMmsc = (EditTextPreference) findPreference("apn_mmsc");
+ mMcc = (EditTextPreference) findPreference("apn_mcc");
+ mMnc = (EditTextPreference) findPreference("apn_mnc");
+ mApnType = (EditTextPreference) findPreference("apn_type");
+
+ mRes = getResources();
+
+ final Intent intent = getIntent();
+ final String action = intent.getAction();
+
+ mFirstTime = icicle == null;
+
+ if (action.equals(Intent.ACTION_EDIT)) {
+ mUri = intent.getData();
+ } else if (action.equals(Intent.ACTION_INSERT)) {
+ if (mFirstTime) {
+ mUri = getContentResolver().insert(intent.getData(), new ContentValues());
+ } else {
+ mUri = ContentUris.withAppendedId(Telephony.Carriers.CONTENT_URI,
+ icicle.getInt(SAVED_POS));
+ }
+ mNewApn = true;
+ // If we were unable to create a new note, then just finish
+ // this activity. A RESULT_CANCELED will be sent back to the
+ // original activity if they requested a result.
+ if (mUri == null) {
+ Log.w(TAG, "Failed to insert new telephony provider into "
+ + getIntent().getData());
+ finish();
+ return;
+ }
+
+ // The new entry was created, so assume all will end well and
+ // set the result to be returned.
+ setResult(RESULT_OK, (new Intent()).setAction(mUri.toString()));
+
+ } else {
+ finish();
+ return;
+ }
+
+ mCursor = managedQuery(mUri, sProjection, null, null);
+ mCursor.moveToFirst();
+
+ fillUi();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
+ }
+
+ @Override
+ public void onPause() {
+ getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
+ super.onPause();
+ }
+
+ private void fillUi() {
+ if (mFirstTime) {
+ mFirstTime = false;
+ // Fill in all the values from the db in both text editor and summary
+ mName.setText(mCursor.getString(NAME_INDEX));
+ mApn.setText(mCursor.getString(APN_INDEX));
+ mProxy.setText(mCursor.getString(PROXY_INDEX));
+ mPort.setText(mCursor.getString(PORT_INDEX));
+ mUser.setText(mCursor.getString(USER_INDEX));
+ mServer.setText(mCursor.getString(SERVER_INDEX));
+ mPassword.setText(mCursor.getString(PASSWORD_INDEX));
+ mMmsProxy.setText(mCursor.getString(MMSPROXY_INDEX));
+ mMmsPort.setText(mCursor.getString(MMSPORT_INDEX));
+ mMmsc.setText(mCursor.getString(MMSC_INDEX));
+ mMcc.setText(mCursor.getString(MCC_INDEX));
+ mMnc.setText(mCursor.getString(MNC_INDEX));
+ mApnType.setText(mCursor.getString(TYPE_INDEX));
+ if (mNewApn) {
+ String numeric =
+ SystemProperties.get(TelephonyProperties.PROPERTY_SIM_OPERATOR_NUMERIC);
+ // MCC is first 3 chars and then in 2 - 3 chars of MNC
+ if (numeric != null && numeric.length() > 4) {
+ // Country code
+ String mcc = numeric.substring(0, 3);
+ // Network code
+ String mnc = numeric.substring(3);
+ // Auto populate MNC and MCC for new entries, based on what SIM reports
+ mMcc.setText(mcc);
+ mMnc.setText(mnc);
+ mCurMnc = mnc;
+ mCurMcc = mcc;
+ }
+ }
+ }
+
+ mName.setSummary(checkNull(mName.getText()));
+ mApn.setSummary(checkNull(mApn.getText()));
+ mProxy.setSummary(checkNull(mProxy.getText()));
+ mPort.setSummary(checkNull(mPort.getText()));
+ mUser.setSummary(checkNull(mUser.getText()));
+ mServer.setSummary(checkNull(mServer.getText()));
+ mPassword.setSummary(starify(mPassword.getText()));
+ mMmsProxy.setSummary(checkNull(mMmsProxy.getText()));
+ mMmsPort.setSummary(checkNull(mMmsPort.getText()));
+ mMmsc.setSummary(checkNull(mMmsc.getText()));
+ mMcc.setSummary(checkNull(mMcc.getText()));
+ mMnc.setSummary(checkNull(mMnc.getText()));
+ mApnType.setSummary(checkNull(mApnType.getText()));
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ super.onCreateOptionsMenu(menu);
+ // If it's a new APN, then cancel will delete the new entry in onPause
+ if (!mNewApn) {
+ menu.add(0, MENU_DELETE, 0, R.string.menu_delete)
+ .setIcon(android.R.drawable.ic_menu_delete);
+ }
+ menu.add(0, MENU_SAVE, 0, R.string.menu_save)
+ .setIcon(android.R.drawable.ic_menu_save);
+ menu.add(0, MENU_CANCEL, 0, R.string.menu_cancel)
+ .setIcon(android.R.drawable.ic_menu_close_clear_cancel);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case MENU_DELETE:
+ deleteApn();
+ return true;
+ case MENU_SAVE:
+ if (validateAndSave(false)) {
+ finish();
+ }
+ return true;
+ case MENU_CANCEL:
+ if (mNewApn) {
+ getContentResolver().delete(mUri, null, null);
+ }
+ finish();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_BACK: {
+ if (validateAndSave(false)) {
+ finish();
+ }
+ return true;
+ }
+ }
+ return super.onKeyDown(keyCode, event);
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle icicle) {
+ super.onSaveInstanceState(icicle);
+ validateAndSave(true);
+ icicle.putInt(SAVED_POS, mCursor.getInt(ID_INDEX));
+ }
+
+ /**
+ * Check the key fields' validity and save if valid.
+ * @param force save even if the fields are not valid, if the app is
+ * being suspended
+ * @return true if the data was saved
+ */
+ private boolean validateAndSave(boolean force) {
+ String name = checkNotSet(mName.getText());
+ String apn = checkNotSet(mApn.getText());
+ String mcc = checkNotSet(mMcc.getText());
+ String mnc = checkNotSet(mMnc.getText());
+
+ String errorMsg = null;
+ if (name.length() < 1) {
+ errorMsg = mRes.getString(R.string.error_name_empty);
+ } else if (apn.length() < 1) {
+ errorMsg = mRes.getString(R.string.error_apn_empty);
+ } else if (mcc.length() != 3) {
+ errorMsg = mRes.getString(R.string.error_mcc_not3);
+ } else if ((mnc.length() & 0xFFFE) != 2) {
+ errorMsg = mRes.getString(R.string.error_mnc_not23);
+ }
+
+ if (errorMsg != null && !force) {
+ showErrorMessage(errorMsg);
+ return false;
+ }
+
+ if (!mCursor.moveToFirst()) {
+ Log.w(TAG,
+ "Could not go to the first row in the Cursor when saving data.");
+ return false;
+ }
+
+ ContentValues values = new ContentValues();
+
+ values.put(Telephony.Carriers.NAME, name);
+ values.put(Telephony.Carriers.APN, apn);
+ values.put(Telephony.Carriers.PROXY, checkNotSet(mProxy.getText()));
+ values.put(Telephony.Carriers.PORT, checkNotSet(mPort.getText()));
+ values.put(Telephony.Carriers.MMSPROXY, checkNotSet(mMmsProxy.getText()));
+ values.put(Telephony.Carriers.MMSPORT, checkNotSet(mMmsPort.getText()));
+ values.put(Telephony.Carriers.USER, checkNotSet(mUser.getText()));
+ values.put(Telephony.Carriers.SERVER, checkNotSet(mServer.getText()));
+ values.put(Telephony.Carriers.PASSWORD, checkNotSet(mPassword.getText()));
+ values.put(Telephony.Carriers.MMSC, checkNotSet(mMmsc.getText()));
+ values.put(Telephony.Carriers.TYPE, checkNotSet(mApnType.getText()));
+
+ values.put(Telephony.Carriers.MCC, mcc);
+ values.put(Telephony.Carriers.MNC, mnc);
+
+ values.put(Telephony.Carriers.NUMERIC, mcc + mnc);
+
+ if (mCurMnc != null && mCurMcc != null) {
+ if (mCurMnc.equals(mnc) && mCurMcc.equals(mcc)) {
+ values.put(Telephony.Carriers.CURRENT, 1);
+ }
+ }
+
+ getContentResolver().update(mUri, values, null, null);
+
+ return true;
+ }
+
+ private void showErrorMessage(String message) {
+ new AlertDialog.Builder(this)
+ .setTitle(R.string.error_title)
+ .setMessage(message)
+ .setPositiveButton(android.R.string.ok, null)
+ .show();
+ }
+
+ private void deleteApn() {
+ getContentResolver().delete(mUri, null, null);
+ finish();
+ }
+
+ private String starify(String value) {
+ if (value == null || value.length() == 0) {
+ return sNotSet;
+ } else {
+ char[] password = new char[value.length()];
+ for (int i = 0; i < password.length; i++) {
+ password[i] = '*';
+ }
+ return new String(password);
+ }
+ }
+
+ private String checkNull(String value) {
+ if (value == null || value.length() == 0) {
+ return sNotSet;
+ } else {
+ return value;
+ }
+ }
+
+ private String checkNotSet(String value) {
+ if (value == null || value.equals(sNotSet)) {
+ return "";
+ } else {
+ return value;
+ }
+ }
+
+ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
+ Preference pref = findPreference(key);
+ if (pref != null) {
+ pref.setSummary(checkNull(sharedPreferences.getString(key, "")));
+ }
+ }
+}
diff --git a/src/com/android/settings/ApnSettings.java b/src/com/android/settings/ApnSettings.java
new file mode 100644
index 0000000..87e3412
--- /dev/null
+++ b/src/com/android/settings/ApnSettings.java
@@ -0,0 +1,229 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.app.Dialog;
+import android.app.ProgressDialog;
+import android.content.ContentResolver;
+import android.content.ContentUris;
+import android.content.Context;
+import android.content.Intent;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceGroup;
+import android.preference.PreferenceScreen;
+import android.provider.Telephony;
+import android.text.TextUtils;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.widget.Toast;
+
+public class ApnSettings extends PreferenceActivity {
+
+ public static final String EXTRA_POSITION = "position";
+ public static final String RESTORE_CARRIERS_URI =
+ "content://telephony/carriers/restore";
+
+ private static final int ID_INDEX = 0;
+ private static final int NAME_INDEX = 1;
+ private static final int APN_INDEX = 2;
+
+ private static final int MENU_NEW = Menu.FIRST;
+ private static final int MENU_RESTORE = Menu.FIRST + 1;
+
+ private static final int EVENT_RESTORE_DEFAULTAPN_START = 1;
+ private static final int EVENT_RESTORE_DEFAULTAPN_COMPLETE = 2;
+
+ private static final int DIALOG_RESTORE_DEFAULTAPN = 1001;
+
+ private static final Uri DEFAULTAPN_URI = Uri.parse(RESTORE_CARRIERS_URI);
+
+ private static boolean mRestoreDefaultApnMode;
+
+ private RestoreApnUiHandler mRestoreApnUiHandler;
+ private RestoreApnProcessHandler mRestoreApnProcessHandler;
+
+ private Cursor mCursor;
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ addPreferencesFromResource(R.xml.apn_settings);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ if (!mRestoreDefaultApnMode) {
+ fillList();
+ } else {
+ showDialog(DIALOG_RESTORE_DEFAULTAPN);
+ }
+ }
+
+ private void fillList() {
+ mCursor = managedQuery(Telephony.Carriers.CONTENT_URI, new String[] {
+ "_id", "name", "apn"}, null, Telephony.Carriers.DEFAULT_SORT_ORDER);
+
+ PreferenceGroup apnList = (PreferenceGroup) findPreference("apn_list");
+ apnList.removeAll();
+
+ mCursor.moveToFirst();
+ while (!mCursor.isAfterLast()) {
+ String name = mCursor.getString(NAME_INDEX);
+ String apn = mCursor.getString(APN_INDEX);
+
+ if (name != null && apn != null && TextUtils.getTrimmedLength(name) > 0
+ && TextUtils.getTrimmedLength(apn) > 0) {
+ Preference pref = new Preference((Context) this);
+ pref.setKey(mCursor.getString(ID_INDEX));
+ pref.setTitle(name);
+ pref.setSummary(apn);
+ pref.setPersistent(false);
+ apnList.addPreference(pref);
+ }
+
+ mCursor.moveToNext();
+ }
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ super.onCreateOptionsMenu(menu);
+ menu.add(0, MENU_NEW, 0,
+ getResources().getString(R.string.menu_new))
+ .setIcon(android.R.drawable.ic_menu_add);
+ menu.add(0, MENU_RESTORE, 0,
+ getResources().getString(R.string.menu_restore))
+ .setIcon(android.R.drawable.ic_menu_upload);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case MENU_NEW:
+ addNewApn();
+ return true;
+
+ case MENU_RESTORE:
+ restoreDefaultApn();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ private void addNewApn() {
+ startActivity(new Intent(Intent.ACTION_INSERT, Telephony.Carriers.CONTENT_URI));
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+ int pos = Integer.parseInt(preference.getKey());
+ Uri url = ContentUris.withAppendedId(Telephony.Carriers.CONTENT_URI, pos);
+ startActivity(new Intent(Intent.ACTION_EDIT, url));
+ return true;
+ }
+
+ private boolean restoreDefaultApn() {
+ showDialog(DIALOG_RESTORE_DEFAULTAPN);
+ mRestoreDefaultApnMode = true;
+
+ if (mRestoreApnUiHandler == null) {
+ mRestoreApnUiHandler = new RestoreApnUiHandler();
+ }
+
+ if (mRestoreApnProcessHandler == null) {
+ HandlerThread restoreDefaultApnThread = new HandlerThread(
+ "Restore default APN Handler: Process Thread");
+ restoreDefaultApnThread.start();
+ mRestoreApnProcessHandler = new RestoreApnProcessHandler(
+ restoreDefaultApnThread.getLooper(), mRestoreApnUiHandler);
+ }
+
+ mRestoreApnProcessHandler
+ .sendEmptyMessage(EVENT_RESTORE_DEFAULTAPN_START);
+ return true;
+ }
+
+ private class RestoreApnUiHandler extends Handler {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case EVENT_RESTORE_DEFAULTAPN_COMPLETE:
+ fillList();
+ getPreferenceScreen().setEnabled(true);
+ mRestoreDefaultApnMode = false;
+ dismissDialog(DIALOG_RESTORE_DEFAULTAPN);
+ Toast.makeText(
+ ApnSettings.this,
+ getResources().getString(
+ R.string.restore_default_apn_completed),
+ Toast.LENGTH_LONG).show();
+ break;
+ }
+ }
+ }
+
+ private class RestoreApnProcessHandler extends Handler {
+ private Handler mRestoreApnUiHandler;
+
+ public RestoreApnProcessHandler(Looper looper, Handler restoreApnUiHandler) {
+ super(looper);
+ this.mRestoreApnUiHandler = restoreApnUiHandler;
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case EVENT_RESTORE_DEFAULTAPN_START:
+ ContentResolver resolver = getContentResolver();
+ resolver.delete(DEFAULTAPN_URI, null, null);
+ mRestoreApnUiHandler
+ .sendEmptyMessage(EVENT_RESTORE_DEFAULTAPN_COMPLETE);
+ break;
+ }
+ }
+ }
+
+ @Override
+ protected Dialog onCreateDialog(int id) {
+ if (id == DIALOG_RESTORE_DEFAULTAPN) {
+ ProgressDialog dialog = new ProgressDialog(this);
+ dialog.setMessage(getResources().getString(R.string.restore_default_apn));
+ dialog.setCancelable(false);
+ return dialog;
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPrepareDialog(int id, Dialog dialog) {
+ if (id == DIALOG_RESTORE_DEFAULTAPN) {
+ getPreferenceScreen().setEnabled(false);
+ }
+ }
+}
diff --git a/src/com/android/settings/ApplicationSettings.java b/src/com/android/settings/ApplicationSettings.java
new file mode 100644
index 0000000..85fe11f
--- /dev/null
+++ b/src/com/android/settings/ApplicationSettings.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.preference.CheckBoxPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceScreen;
+import android.provider.Settings;
+
+public class ApplicationSettings extends PreferenceActivity implements
+ DialogInterface.OnClickListener {
+
+ private static final String KEY_TOGGLE_INSTALL_APPLICATIONS = "toggle_install_applications";
+ private static final String KEY_QUICK_LAUNCH = "quick_launch";
+
+ private CheckBoxPreference mToggleAppInstallation;
+
+ private DialogInterface mWarnInstallApps;
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ addPreferencesFromResource(R.xml.application_settings);
+
+ mToggleAppInstallation = (CheckBoxPreference) findPreference(KEY_TOGGLE_INSTALL_APPLICATIONS);
+ mToggleAppInstallation.setChecked(isNonMarketAppsAllowed());
+
+ if (getResources().getConfiguration().keyboard == Configuration.KEYBOARD_NOKEYS) {
+ // No hard keyboard, remove the setting for quick launch
+ Preference quickLaunchSetting = findPreference(KEY_QUICK_LAUNCH);
+ getPreferenceScreen().removePreference(quickLaunchSetting);
+ }
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+ if (preference == mToggleAppInstallation) {
+ if (mToggleAppInstallation.isChecked()) {
+ mToggleAppInstallation.setChecked(false);
+ warnAppInstallation();
+ } else {
+ setNonMarketAppsAllowed(false);
+ }
+ }
+
+ return super.onPreferenceTreeClick(preferenceScreen, preference);
+ }
+
+ public void onClick(DialogInterface dialog, int which) {
+ if (dialog == mWarnInstallApps && which == DialogInterface.BUTTON1) {
+ setNonMarketAppsAllowed(true);
+ mToggleAppInstallation.setChecked(true);
+ }
+ }
+
+ private void setNonMarketAppsAllowed(boolean enabled) {
+ // Change the system setting
+ Settings.Secure.putInt(getContentResolver(), Settings.Secure.INSTALL_NON_MARKET_APPS,
+ enabled ? 1 : 0);
+ }
+
+ private boolean isNonMarketAppsAllowed() {
+ return Settings.Secure.getInt(getContentResolver(),
+ Settings.Secure.INSTALL_NON_MARKET_APPS, 0) > 0;
+ }
+
+ private void warnAppInstallation() {
+ mWarnInstallApps = new AlertDialog.Builder(this)
+ .setTitle(getString(R.string.error_title))
+ .setIcon(com.android.internal.R.drawable.ic_dialog_alert)
+ .setMessage(getResources().getString(R.string.install_all_warning))
+ .setPositiveButton(android.R.string.yes, this)
+ .setNegativeButton(android.R.string.no, null)
+ .show();
+ }
+
+
+}
diff --git a/src/com/android/settings/BandMode.java b/src/com/android/settings/BandMode.java
new file mode 100644
index 0000000..1297cad
--- /dev/null
+++ b/src/com/android/settings/BandMode.java
@@ -0,0 +1,217 @@
+package com.android.settings;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneFactory;
+import android.os.Bundle;
+import android.os.Message;
+import android.os.Handler;
+import android.os.AsyncResult;
+import android.util.Log;
+import android.content.DialogInterface;
+import android.view.View;
+import android.view.WindowManager;
+import android.view.Window;
+import android.widget.ListView;
+import android.widget.ArrayAdapter;
+import android.widget.AdapterView;
+
+
+/**
+ * Radio Band Mode Selection Class
+ *
+ * It will query baseband about all available band modes and display them
+ * in screen. It will display all six band modes if the query failed.
+ *
+ * After user select one band, it will send the selection to baseband.
+ *
+ * It will alter user the result of select operation and exit, no matter success
+ * or not.
+ *
+ */
+public class BandMode extends Activity {
+ private static final String LOG_TAG = "phone";
+ private static final boolean DBG = false;
+
+ private static final int EVENT_BAND_SCAN_COMPLETED = 100;
+ private static final int EVENT_BAND_SELECTION_DONE = 200;
+
+ private static final String[] BAND_NAMES = new String[] {
+ "Automatic",
+ "EURO Band",
+ "USA Band",
+ "JAPAN Band",
+ "AUS Band",
+ "AUS2 Band"
+ };
+
+ private ListView mBandList;
+ private ArrayAdapter mBandListAdapter;
+ private BandListItem mTargetBand = null;
+ private DialogInterface mProgressPanel;
+
+ private Phone mPhone = null;
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
+
+ setContentView(R.layout.band_mode);
+
+ setTitle(getString(R.string.band_mode_title));
+ getWindow().setLayout(WindowManager.LayoutParams.FILL_PARENT,
+ WindowManager.LayoutParams.WRAP_CONTENT);
+
+ mPhone = PhoneFactory.getDefaultPhone();
+
+ mBandList = (ListView) findViewById(R.id.band);
+ mBandListAdapter = new ArrayAdapter<BandListItem>(this,
+ android.R.layout.simple_list_item_1);
+ mBandList.setAdapter(mBandListAdapter);
+ mBandList.setOnItemClickListener(mBandSelectionHandler);
+
+
+
+ loadBandList();
+ }
+
+ private AdapterView.OnItemClickListener mBandSelectionHandler =
+ new AdapterView.OnItemClickListener () {
+ public void onItemClick(AdapterView parent, View v,
+ int position, long id) {
+
+ getWindow().setFeatureInt(
+ Window.FEATURE_INDETERMINATE_PROGRESS,
+ Window.PROGRESS_VISIBILITY_ON);
+
+ mTargetBand = (BandListItem) parent.getAdapter().getItem(position);
+
+ if (DBG) log("Select band : " + mTargetBand.toString());
+
+ Message msg =
+ mHandler.obtainMessage(EVENT_BAND_SELECTION_DONE);
+ mPhone.setBandMode(mTargetBand.getBand(), msg);
+ }
+ };
+
+ private class BandListItem {
+ private int mBandMode = Phone.BM_UNSPECIFIED;
+
+ public BandListItem(int bm) {
+ mBandMode = bm;
+ }
+
+ public int getBand() {
+ return mBandMode;
+ }
+
+ public String toString() {
+ return BAND_NAMES[mBandMode];
+ }
+ }
+
+ private void loadBandList() {
+ String str = getString(R.string.band_mode_loading);
+
+ if (DBG) log(str);
+
+
+ //ProgressDialog.show(this, null, str, true, true, null);
+ mProgressPanel = new AlertDialog.Builder(this)
+ .setMessage(str)
+ .show();
+
+ Message msg = mHandler.obtainMessage(EVENT_BAND_SCAN_COMPLETED);
+ mPhone.queryAvailableBandMode(msg);
+
+ }
+
+ private void bandListLoaded(AsyncResult result) {
+ if (DBG) log("network list loaded");
+
+ if (mProgressPanel != null) mProgressPanel.dismiss();
+
+ clearList();
+
+ boolean addBandSuccess = false;
+ BandListItem item;
+
+ if (result.result != null) {
+ int bands[] = (int[])result.result;
+ int size = bands[0];
+
+ if (size > 0) {
+ for (int i=1; i<size; i++) {
+ item = new BandListItem(bands[i]);
+ mBandListAdapter.add(item);
+ if (DBG) log("Add " + item.toString());
+ }
+ addBandSuccess = true;
+ }
+ }
+
+ if (addBandSuccess == false) {
+ if (DBG) log("Error in query, add default list");
+ for (int i=0; i<Phone.BM_BOUNDARY; i++) {
+ item = new BandListItem(i);
+ mBandListAdapter.add(item);
+ if (DBG) log("Add default " + item.toString());
+ }
+ }
+ mBandList.requestFocus();
+ }
+
+ private void displayBandSelectionResult(Throwable ex) {
+ String status = getString(R.string.band_mode_set)
+ +" [" + mTargetBand.toString() + "] ";
+
+ if (ex != null) {
+ status = status + getString(R.string.band_mode_failed);
+ } else {
+ status = status + getString(R.string.band_mode_succeeded);
+ }
+
+ mProgressPanel = new AlertDialog.Builder(this)
+ .setMessage(status)
+ .setPositiveButton(android.R.string.ok, null).show();
+ }
+
+ private void clearList() {
+ while(mBandListAdapter.getCount() > 0) {
+ mBandListAdapter.remove(
+ mBandListAdapter.getItem(0));
+ }
+ }
+
+ private void log(String msg) {
+ Log.d(LOG_TAG, "[BandsList] " + msg);
+ }
+
+ private Handler mHandler = new Handler() {
+ public void handleMessage(Message msg) {
+ AsyncResult ar;
+ switch (msg.what) {
+ case EVENT_BAND_SCAN_COMPLETED:
+ ar = (AsyncResult) msg.obj;
+
+ bandListLoaded(ar);
+ break;
+
+ case EVENT_BAND_SELECTION_DONE:
+ ar = (AsyncResult) msg.obj;
+
+ getWindow().setFeatureInt(
+ Window.FEATURE_INDETERMINATE_PROGRESS,
+ Window.PROGRESS_VISIBILITY_OFF);
+
+ displayBandSelectionResult(ar.exception);
+ break;
+ }
+ }
+ };
+
+
+}
diff --git a/src/com/android/settings/BatteryInfo.java b/src/com/android/settings/BatteryInfo.java
new file mode 100644
index 0000000..f9962fa
--- /dev/null
+++ b/src/com/android/settings/BatteryInfo.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.app.Activity;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.BatteryManager;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IPowerManager;
+import android.os.Message;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.SystemClock;
+import android.text.format.DateUtils;
+import android.widget.TextView;
+
+import com.android.internal.app.IBatteryStats;
+
+public class BatteryInfo extends Activity {
+ private TextView mStatus;
+ private TextView mLevel;
+ private TextView mScale;
+ private TextView mHealth;
+ private TextView mVoltage;
+ private TextView mTemperature;
+ private TextView mTechnology;
+ private TextView mUptime;
+ private TextView mAwakeBattery;
+ private TextView mAwakePlugged;
+ private TextView mScreenOn;
+ private IBatteryStats mBatteryStats;
+ private IPowerManager mScreenStats;
+
+ private static final int EVENT_TICK = 1;
+
+ private Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case EVENT_TICK:
+ updateBatteryStats();
+ sendEmptyMessageDelayed(EVENT_TICK, 1000);
+ break;
+ }
+ }
+ };
+
+ /**
+ * Format a number of tenths-units as a decimal string without using a
+ * conversion to float. E.g. 347 -> "34.7"
+ */
+ private final String tenthsToFixedString(int x) {
+ int tens = x / 10;
+ return new String("" + tens + "." + (x - 10*tens));
+ }
+
+ /**
+ *Listens for intent broadcasts
+ */
+ private IntentFilter mIntentFilter;
+
+ private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
+ int plugType = intent.getIntExtra("plugged", 0);
+
+ mLevel.setText("" + intent.getIntExtra("level", 0));
+ mScale.setText("" + intent.getIntExtra("scale", 0));
+ mVoltage.setText("" + intent.getIntExtra("voltage", 0) + " "
+ + getString(R.string.battery_info_voltage_units));
+ mTemperature.setText("" + tenthsToFixedString(intent.getIntExtra("temperature", 0))
+ + getString(R.string.battery_info_temperature_units));
+ mTechnology.setText("" + intent.getStringExtra("technology"));
+
+ int status = intent.getIntExtra("status", BatteryManager.BATTERY_STATUS_UNKNOWN);
+ String statusString;
+ if (status == BatteryManager.BATTERY_STATUS_CHARGING) {
+ statusString = getString(R.string.battery_info_status_charging);
+ if (plugType > 0) {
+ statusString = statusString + " " + getString(
+ (plugType == BatteryManager.BATTERY_PLUGGED_AC)
+ ? R.string.battery_info_status_charging_ac
+ : R.string.battery_info_status_charging_usb);
+ }
+ } else if (status == BatteryManager.BATTERY_STATUS_DISCHARGING) {
+ statusString = getString(R.string.battery_info_status_discharging);
+ } else if (status == BatteryManager.BATTERY_STATUS_NOT_CHARGING) {
+ statusString = getString(R.string.battery_info_status_not_charging);
+ } else if (status == BatteryManager.BATTERY_STATUS_FULL) {
+ statusString = getString(R.string.battery_info_status_full);
+ } else {
+ statusString = getString(R.string.battery_info_status_unknown);
+ }
+ mStatus.setText(statusString);
+
+ int health = intent.getIntExtra("health", BatteryManager.BATTERY_HEALTH_UNKNOWN);
+ String healthString;
+ if (health == BatteryManager.BATTERY_HEALTH_GOOD) {
+ healthString = getString(R.string.battery_info_health_good);
+ } else if (health == BatteryManager.BATTERY_HEALTH_OVERHEAT) {
+ healthString = getString(R.string.battery_info_health_overheat);
+ } else if (health == BatteryManager.BATTERY_HEALTH_DEAD) {
+ healthString = getString(R.string.battery_info_health_dead);
+ } else if (health == BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE) {
+ healthString = getString(R.string.battery_info_health_over_voltage);
+ } else if (health == BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE) {
+ healthString = getString(R.string.battery_info_health_unspecified_failure);
+ } else {
+ healthString = getString(R.string.battery_info_health_unknown);
+ }
+ mHealth.setText(healthString);
+ }
+ }
+ };
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ setContentView(R.layout.battery_info);
+
+ // create the IntentFilter that will be used to listen
+ // to battery status broadcasts
+ mIntentFilter = new IntentFilter();
+ mIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ mStatus = (TextView)findViewById(R.id.status);
+ mLevel = (TextView)findViewById(R.id.level);
+ mScale = (TextView)findViewById(R.id.scale);
+ mHealth = (TextView)findViewById(R.id.health);
+ mTechnology = (TextView)findViewById(R.id.technology);
+ mVoltage = (TextView)findViewById(R.id.voltage);
+ mTemperature = (TextView)findViewById(R.id.temperature);
+ mUptime = (TextView) findViewById(R.id.uptime);
+ mAwakeBattery = (TextView) findViewById(R.id.awakeBattery);
+ mAwakePlugged = (TextView) findViewById(R.id.awakePlugged);
+ mScreenOn = (TextView) findViewById(R.id.screenOn);
+
+ // Get awake time plugged in and on battery
+ mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService("batteryinfo"));
+ mScreenStats = IPowerManager.Stub.asInterface(ServiceManager.getService(POWER_SERVICE));
+ mHandler.sendEmptyMessageDelayed(EVENT_TICK, 1000);
+
+ registerReceiver(mIntentReceiver, mIntentFilter);
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ mHandler.removeMessages(EVENT_TICK);
+
+ // we are no longer on the screen stop the observers
+ unregisterReceiver(mIntentReceiver);
+ }
+
+ private void updateBatteryStats() {
+ long uptime = SystemClock.elapsedRealtime();
+ mUptime.setText(DateUtils.formatElapsedTime(uptime / 1000));
+
+ if (mBatteryStats != null) {
+ try {
+ long awakeTimeBattery = mBatteryStats.getAwakeTimeBattery() / 1000;
+ long awakeTimePluggedIn = mBatteryStats.getAwakeTimePlugged() / 1000;
+ mAwakeBattery.setText(DateUtils.formatElapsedTime(awakeTimeBattery / 1000)
+ + " (" + (100 * awakeTimeBattery / uptime) + "%)");
+ mAwakePlugged.setText(DateUtils.formatElapsedTime(awakeTimePluggedIn / 1000)
+ + " (" + (100 * awakeTimePluggedIn / uptime) + "%)");
+ } catch (RemoteException re) {
+ mAwakeBattery.setText("Unknown");
+ mAwakePlugged.setText("Unknown");
+ }
+ }
+ if (mScreenStats != null) {
+ try {
+ long screenOnTime = mScreenStats.getScreenOnTime();
+ mScreenOn.setText(DateUtils.formatElapsedTime(screenOnTime / 1000));
+ } catch (RemoteException re) {
+ mScreenOn.setText("Unknown");
+ }
+ }
+ }
+
+}
diff --git a/src/com/android/settings/BrightnessPreference.java b/src/com/android/settings/BrightnessPreference.java
new file mode 100644
index 0000000..a9851cc
--- /dev/null
+++ b/src/com/android/settings/BrightnessPreference.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.content.Context;
+import android.os.RemoteException;
+import android.os.IHardwareService;
+import android.os.ServiceManager;
+import android.preference.SeekBarPreference;
+import android.provider.Settings;
+import android.provider.Settings.SettingNotFoundException;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+import android.widget.SeekBar;
+
+import java.util.Map;
+
+public class BrightnessPreference extends SeekBarPreference implements
+ SeekBar.OnSeekBarChangeListener {
+
+ private SeekBar mSeekBar;
+
+ private int mOldBrightness;
+
+ // Backlight range is from 0 - 255. Need to make sure that user
+ // doesn't set the backlight to 0 and get stuck
+ private static final int MINIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_DIM + 10;
+ private static final int MAXIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_ON;
+
+ public BrightnessPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onBindDialogView(View view) {
+ super.onBindDialogView(view);
+
+ mSeekBar = getSeekBar(view);
+ mSeekBar.setOnSeekBarChangeListener(this);
+ mSeekBar.setMax(MAXIMUM_BACKLIGHT - MINIMUM_BACKLIGHT);
+ try {
+ mOldBrightness = Settings.System.getInt(getContext().getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS);
+ } catch (SettingNotFoundException snfe) {
+ mOldBrightness = MAXIMUM_BACKLIGHT;
+ }
+ mSeekBar.setProgress(mOldBrightness - MINIMUM_BACKLIGHT);
+ }
+
+ public void onProgressChanged(SeekBar seekBar, int progress,
+ boolean fromTouch) {
+ setBrightness(progress + MINIMUM_BACKLIGHT);
+ }
+
+ public void onStartTrackingTouch(SeekBar seekBar) {
+ // NA
+ }
+
+ public void onStopTrackingTouch(SeekBar seekBar) {
+ // NA
+ }
+
+ @Override
+ protected void onDialogClosed(boolean positiveResult) {
+ super.onDialogClosed(positiveResult);
+
+ if (positiveResult) {
+ Settings.System.putInt(getContext().getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS,
+ mSeekBar.getProgress() + MINIMUM_BACKLIGHT);
+ } else {
+ setBrightness(mOldBrightness);
+ }
+ }
+
+ private void setBrightness(int brightness) {
+ try {
+ IHardwareService hardware = IHardwareService.Stub.asInterface(
+ ServiceManager.getService("hardware"));
+ if (hardware != null) {
+ hardware.setScreenBacklight(brightness);
+ }
+ } catch (RemoteException doe) {
+
+ }
+ }
+}
+
diff --git a/src/com/android/settings/ChooseLockPattern.java b/src/com/android/settings/ChooseLockPattern.java
new file mode 100644
index 0000000..47fc07f
--- /dev/null
+++ b/src/com/android/settings/ChooseLockPattern.java
@@ -0,0 +1,497 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import com.google.android.collect.Lists;
+
+import com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient;
+import com.android.internal.widget.LockPatternUtils;
+import com.android.internal.widget.LockPatternView;
+import static com.android.internal.widget.LockPatternView.DisplayMode;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.Window;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * If the user has a lock pattern set already, makes them confirm the existing one.
+ *
+ * Then, prompts the user to choose a lock pattern:
+ * - prompts for initial pattern
+ * - asks for confirmation / restart
+ * - saves chosen password when confirmed
+ */
+public class ChooseLockPattern extends Activity implements View.OnClickListener{
+
+ /**
+ * Used by the choose lock pattern wizard to indicate the wizard is
+ * finished, and each activity in the wizard should finish.
+ * <p>
+ * Previously, each activity in the wizard would finish itself after
+ * starting the next activity. However, this leads to broken 'Back'
+ * behavior. So, now an activity does not finish itself until it gets this
+ * result.
+ */
+ static final int RESULT_FINISHED = RESULT_FIRST_USER;
+
+ // how long after a confirmation message is shown before moving on
+ static final int INFORMATION_MSG_TIMEOUT_MS = 3000;
+
+ // how long we wait to clear a wrong pattern
+ private static final int WRONG_PATTERN_CLEAR_TIMEOUT_MS = 2000;
+
+ private static final int ID_EMPTY_MESSAGE = -1;
+
+
+ protected TextView mHeaderText;
+ protected LockPatternView mLockPatternView;
+ protected TextView mFooterText;
+ private TextView mFooterLeftButton;
+ private TextView mFooterRightButton;
+
+ protected List<LockPatternView.Cell> mChosenPattern = null;
+
+ protected LockPatternUtils mLockPatternUtils;
+
+ /**
+ * The patten used during the help screen to show how to draw a pattern.
+ */
+ private final List<LockPatternView.Cell> mAnimatePattern =
+ Collections.unmodifiableList(
+ Lists.newArrayList(
+ LockPatternView.Cell.of(0, 0),
+ LockPatternView.Cell.of(0, 1),
+ LockPatternView.Cell.of(1, 1),
+ LockPatternView.Cell.of(2, 1)
+ ));
+
+
+ /**
+ * The pattern listener that responds according to a user choosing a new
+ * lock pattern.
+ */
+ protected LockPatternView.OnPatternListener mChooseNewLockPatternListener = new LockPatternView.OnPatternListener() {
+
+ public void onPatternStart() {
+ mLockPatternView.removeCallbacks(mClearPatternRunnable);
+ patternInProgress();
+ }
+
+ public void onPatternCleared() {
+ mLockPatternView.removeCallbacks(mClearPatternRunnable);
+ }
+
+ public void onPatternDetected(List<LockPatternView.Cell> pattern) {
+ if (mUiStage == Stage.NeedToConfirm || mUiStage == Stage.ConfirmWrong) {
+ if (mChosenPattern == null) throw new IllegalStateException("null chosen pattern in stage 'need to confirm");
+ if (mChosenPattern.equals(pattern)) {
+ updateStage(Stage.ChoiceConfirmed);
+ } else {
+ updateStage(Stage.ConfirmWrong);
+ }
+ } else if (mUiStage == Stage.Introduction || mUiStage == Stage.ChoiceTooShort){
+ if (pattern.size() < LockPatternUtils.MIN_LOCK_PATTERN_SIZE) {
+ updateStage(Stage.ChoiceTooShort);
+ } else {
+ mChosenPattern = new ArrayList<LockPatternView.Cell>(pattern);
+ updateStage(Stage.FirstChoiceValid);
+ }
+ } else {
+ throw new IllegalStateException("Unexpected stage " + mUiStage + " when "
+ + "entering the pattern.");
+ }
+ }
+
+ private void patternInProgress() {
+ mHeaderText.setText(R.string.lockpattern_recording_inprogress);
+ mFooterText.setText("");
+ mFooterLeftButton.setEnabled(false);
+ mFooterRightButton.setEnabled(false);
+ }
+ };
+
+
+ /**
+ * The states of the left footer button.
+ */
+ enum LeftButtonMode {
+ Cancel(R.string.cancel, true),
+ CancelDisabled(R.string.cancel, false),
+ Retry(R.string.lockpattern_retry_button_text, true),
+ RetryDisabled(R.string.lockpattern_retry_button_text, false),
+ Gone(ID_EMPTY_MESSAGE, false);
+
+
+ /**
+ * @param text The displayed text for this mode.
+ * @param enabled Whether the button should be enabled.
+ */
+ LeftButtonMode(int text, boolean enabled) {
+ this.text = text;
+ this.enabled = enabled;
+ }
+
+ final int text;
+ final boolean enabled;
+ }
+
+ /**
+ * The states of the right button.
+ */
+ enum RightButtonMode {
+ Continue(R.string.lockpattern_continue_button_text, true),
+ ContinueDisabled(R.string.lockpattern_continue_button_text, false),
+ Confirm(R.string.lockpattern_confirm_button_text, true),
+ ConfirmDisabled(R.string.lockpattern_confirm_button_text, false),
+ Ok(android.R.string.ok, true);
+
+ /**
+ * @param text The displayed text for this mode.
+ * @param enabled Whether the button should be enabled.
+ */
+ RightButtonMode(int text, boolean enabled) {
+ this.text = text;
+ this.enabled = enabled;
+ }
+
+ final int text;
+ final boolean enabled;
+ }
+
+ /**
+ * Keep track internally of where the user is in choosing a pattern.
+ */
+ protected enum Stage {
+
+ Introduction(
+ R.string.lockpattern_recording_intro_header,
+ LeftButtonMode.Cancel, RightButtonMode.ContinueDisabled,
+ R.string.lockpattern_recording_intro_footer, true),
+ HelpScreen(
+ R.string.lockpattern_settings_help_how_to_record,
+ LeftButtonMode.Gone, RightButtonMode.Ok, ID_EMPTY_MESSAGE, false),
+ ChoiceTooShort(
+ R.string.lockpattern_recording_incorrect_too_short,
+ LeftButtonMode.Retry, RightButtonMode.ContinueDisabled,
+ ID_EMPTY_MESSAGE, true),
+ FirstChoiceValid(
+ R.string.lockpattern_pattern_entered_header,
+ LeftButtonMode.Retry, RightButtonMode.Continue, ID_EMPTY_MESSAGE, false),
+ NeedToConfirm(
+ R.string.lockpattern_need_to_confirm,
+ LeftButtonMode.CancelDisabled, RightButtonMode.ConfirmDisabled,
+ ID_EMPTY_MESSAGE, true),
+ ConfirmWrong(
+ R.string.lockpattern_need_to_unlock_wrong,
+ LeftButtonMode.Cancel, RightButtonMode.ConfirmDisabled,
+ ID_EMPTY_MESSAGE, true),
+ ChoiceConfirmed(
+ R.string.lockpattern_pattern_confirmed_header,
+ LeftButtonMode.Cancel, RightButtonMode.Confirm, ID_EMPTY_MESSAGE, false);
+
+
+ /**
+ * @param headerMessage The message displayed at the top.
+ * @param leftMode The mode of the left button.
+ * @param rightMode The mode of the right button.
+ * @param footerMessage The footer message.
+ * @param patternEnabled Whether the pattern widget is enabled.
+ */
+ Stage(int headerMessage,
+ LeftButtonMode leftMode,
+ RightButtonMode rightMode,
+ int footerMessage, boolean patternEnabled) {
+ this.headerMessage = headerMessage;
+ this.leftMode = leftMode;
+ this.rightMode = rightMode;
+ this.footerMessage = footerMessage;
+ this.patternEnabled = patternEnabled;
+ }
+
+ final int headerMessage;
+ final LeftButtonMode leftMode;
+ final RightButtonMode rightMode;
+ final int footerMessage;
+ final boolean patternEnabled;
+ }
+
+ private Stage mUiStage = Stage.Introduction;
+
+ private Runnable mClearPatternRunnable = new Runnable() {
+ public void run() {
+ mLockPatternView.clearPattern();
+ }
+ };
+
+ private static final String KEY_UI_STAGE = "uiStage";
+ private static final String KEY_PATTERN_CHOICE = "chosenPattern";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ mLockPatternUtils = new LockPatternUtils(getContentResolver());
+
+ requestWindowFeature(Window.FEATURE_NO_TITLE);
+
+ setupViews();
+
+ // make it so unhandled touch events within the unlock screen go to the
+ // lock pattern view.
+ final LinearLayoutWithDefaultTouchRecepient topLayout
+ = (LinearLayoutWithDefaultTouchRecepient) findViewById(
+ R.id.topLayout);
+ topLayout.setDefaultTouchRecepient(mLockPatternView);
+
+ if (savedInstanceState == null) {
+ // first launch
+ updateStage(Stage.Introduction);
+ if (mLockPatternUtils.savedPatternExists()) {
+ confirmPattern();
+ }
+ } else {
+ // restore from previous state
+ final String patternString = savedInstanceState.getString(KEY_PATTERN_CHOICE);
+ if (patternString != null) {
+ mChosenPattern = LockPatternUtils.stringToPattern(patternString);
+ }
+ updateStage(Stage.values()[savedInstanceState.getInt(KEY_UI_STAGE)]);
+ }
+ }
+
+ /**
+ * Keep all "find view" related stuff confined to this function since in
+ * case someone needs to subclass and customize.
+ */
+ protected void setupViews() {
+ setContentView(R.layout.choose_lock_pattern);
+
+ mHeaderText = (TextView) findViewById(R.id.headerText);
+
+ mLockPatternView = (LockPatternView) findViewById(R.id.lockPattern);
+ mLockPatternView.setOnPatternListener(mChooseNewLockPatternListener);
+ mLockPatternView.setTactileFeedbackEnabled(mLockPatternUtils.isTactileFeedbackEnabled());
+
+ mFooterText = (TextView) findViewById(R.id.footerText);
+
+ mFooterLeftButton = (TextView) findViewById(R.id.footerLeftButton);
+ mFooterRightButton = (TextView) findViewById(R.id.footerRightButton);
+
+ mFooterLeftButton.setOnClickListener(this);
+ mFooterRightButton.setOnClickListener(this);
+ }
+
+ public void onClick(View v) {
+ if (v == mFooterLeftButton) {
+ if (mUiStage.leftMode == LeftButtonMode.Retry) {
+ mChosenPattern = null;
+ mLockPatternView.clearPattern();
+ updateStage(Stage.Introduction);
+ } else if (mUiStage.leftMode == LeftButtonMode.Cancel) {
+ // They are canceling the entire wizard
+ setResult(RESULT_FINISHED);
+ finish();
+ } else {
+ throw new IllegalStateException("left footer button pressed, but stage of " +
+ mUiStage + " doesn't make sense");
+ }
+ } else if (v == mFooterRightButton) {
+
+ if (mUiStage.rightMode == RightButtonMode.Continue) {
+ if (mUiStage != Stage.FirstChoiceValid) {
+ throw new IllegalStateException("expected ui stage " + Stage.FirstChoiceValid
+ + " when button is " + RightButtonMode.Continue);
+ }
+ updateStage(Stage.NeedToConfirm);
+ } else if (mUiStage.rightMode == RightButtonMode.Confirm) {
+ if (mUiStage != Stage.ChoiceConfirmed) {
+ throw new IllegalStateException("expected ui stage " + Stage.ChoiceConfirmed
+ + " when button is " + RightButtonMode.Confirm);
+ }
+ saveChosenPatternAndFinish();
+ } else if (mUiStage.rightMode == RightButtonMode.Ok) {
+ if (mUiStage != Stage.HelpScreen) {
+ throw new IllegalStateException("Help screen is only mode with ok button, but " +
+ "stage is " + mUiStage);
+ }
+ mLockPatternView.clearPattern();
+ mLockPatternView.setDisplayMode(DisplayMode.Correct);
+ updateStage(Stage.Introduction);
+ }
+ }
+ }
+
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
+ if (mUiStage == Stage.HelpScreen) {
+ updateStage(Stage.Introduction);
+ return true;
+ }
+ }
+ if (keyCode == KeyEvent.KEYCODE_MENU && mUiStage == Stage.Introduction) {
+ updateStage(Stage.HelpScreen);
+ return true;
+ }
+
+ return super.onKeyDown(keyCode, event);
+ }
+
+ /**
+ * Launch screen to confirm the existing lock pattern.
+ * @see #onActivityResult(int, int, android.content.Intent)
+ */
+ protected void confirmPattern() {
+ final Intent intent = new Intent();
+ intent.setClassName("com.android.settings", "com.android.settings.ConfirmLockPattern");
+ startActivityForResult(intent, 55);
+ }
+
+ /**
+ * @see #confirmPattern
+ */
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode,
+ Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+
+ if (requestCode != 55) {
+ return;
+ }
+
+ if (resultCode != Activity.RESULT_OK) {
+ setResult(RESULT_FINISHED);
+ finish();
+ }
+ updateStage(Stage.Introduction);
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+
+ outState.putInt(KEY_UI_STAGE, mUiStage.ordinal());
+ if (mChosenPattern != null) {
+ outState.putString(KEY_PATTERN_CHOICE, LockPatternUtils.patternToString(mChosenPattern));
+ }
+ }
+
+
+ /**
+ * Updates the messages and buttons appropriate to what stage the user
+ * is at in choosing a view. This doesn't handle clearing out the pattern;
+ * the pattern is expected to be in the right state.
+ * @param stage
+ */
+ protected void updateStage(Stage stage) {
+
+ mUiStage = stage;
+
+ // header text, footer text, visibility and
+ // enabled state all known from the stage
+ if (stage == Stage.ChoiceTooShort) {
+ mHeaderText.setText(
+ getResources().getString(
+ stage.headerMessage,
+ LockPatternUtils.MIN_LOCK_PATTERN_SIZE));
+ } else {
+ mHeaderText.setText(stage.headerMessage);
+ }
+ if (stage.footerMessage == ID_EMPTY_MESSAGE) {
+ mFooterText.setText("");
+ } else {
+ mFooterText.setText(stage.footerMessage);
+ }
+
+ if (stage.leftMode == LeftButtonMode.Gone) {
+ mFooterLeftButton.setVisibility(View.GONE);
+ } else {
+ mFooterLeftButton.setVisibility(View.VISIBLE);
+ mFooterLeftButton.setText(stage.leftMode.text);
+ mFooterLeftButton.setEnabled(stage.leftMode.enabled);
+ }
+
+ mFooterRightButton.setText(stage.rightMode.text);
+ mFooterRightButton.setEnabled(stage.rightMode.enabled);
+
+ // same for whether the patten is enabled
+ if (stage.patternEnabled) {
+ mLockPatternView.enableInput();
+ } else {
+ mLockPatternView.disableInput();
+ }
+
+ // the rest of the stuff varies enough that it is easier just to handle
+ // on a case by case basis.
+ mLockPatternView.setDisplayMode(DisplayMode.Correct);
+
+ switch (mUiStage) {
+ case Introduction:
+ mLockPatternView.clearPattern();
+ break;
+ case HelpScreen:
+ mLockPatternView.setPattern(DisplayMode.Animate, mAnimatePattern);
+ break;
+ case ChoiceTooShort:
+ mLockPatternView.setDisplayMode(DisplayMode.Wrong);
+ postClearPatternRunnable();
+ break;
+ case FirstChoiceValid:
+ break;
+ case NeedToConfirm:
+ mLockPatternView.clearPattern();
+ break;
+ case ConfirmWrong:
+ mLockPatternView.setDisplayMode(DisplayMode.Wrong);
+ postClearPatternRunnable();
+ break;
+ case ChoiceConfirmed:
+ break;
+ }
+ }
+
+
+ // clear the wrong pattern unless they have started a new one
+ // already
+ private void postClearPatternRunnable() {
+ mLockPatternView.removeCallbacks(mClearPatternRunnable);
+ mLockPatternView.postDelayed(mClearPatternRunnable, WRONG_PATTERN_CLEAR_TIMEOUT_MS);
+ }
+
+ private void saveChosenPatternAndFinish() {
+ boolean patternExistedBefore = mLockPatternUtils.savedPatternExists();
+ mLockPatternUtils.saveLockPattern(mChosenPattern);
+
+ // if setting pattern for first time, enable the lock gesture. otherwise,
+ // keep the user's setting.
+ if (!patternExistedBefore) {
+ mLockPatternUtils.setLockPatternEnabled(true);
+ mLockPatternUtils.setVisiblePatternEnabled(true);
+ }
+
+ setResult(RESULT_FINISHED);
+ finish();
+ }
+}
diff --git a/src/com/android/settings/ChooseLockPatternExample.java b/src/com/android/settings/ChooseLockPatternExample.java
new file mode 100644
index 0000000..77517b9
--- /dev/null
+++ b/src/com/android/settings/ChooseLockPatternExample.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.graphics.drawable.AnimationDrawable;
+import android.os.Bundle;
+import android.os.Handler;
+import android.view.View;
+import android.widget.ImageView;
+
+public class ChooseLockPatternExample extends Activity implements View.OnClickListener {
+ private static final int REQUESTCODE_CHOOSE = 1;
+ private static final long START_DELAY = 1000;
+ protected static final String TAG = "Settings";
+ private View mNextButton;
+ private View mSkipButton;
+ private View mImageView;
+ private AnimationDrawable mAnimation;
+ private Handler mHandler = new Handler();
+ private Runnable mRunnable = new Runnable() {
+ public void run() {
+ startAnimation(mAnimation);
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.choose_lock_pattern_example);
+ initViews();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ mHandler.postDelayed(mRunnable, START_DELAY);
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ stopAnimation(mAnimation);
+ }
+
+ public void onClick(View v) {
+ if (v == mSkipButton) {
+ // Canceling, so finish all
+ setResult(ChooseLockPattern.RESULT_FINISHED);
+ finish();
+ } else if (v == mNextButton) {
+ stopAnimation(mAnimation);
+ Intent intent = new Intent(this, ChooseLockPattern.class);
+ startActivityForResult(intent, REQUESTCODE_CHOOSE);
+ }
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (requestCode == REQUESTCODE_CHOOSE && resultCode == ChooseLockPattern.RESULT_FINISHED) {
+ setResult(resultCode);
+ finish();
+ }
+ }
+
+ private void initViews() {
+ mNextButton = findViewById(R.id.next_button);
+ mNextButton.setOnClickListener(this);
+
+ mSkipButton = findViewById(R.id.skip_button);
+ mSkipButton.setOnClickListener(this);
+
+ mImageView = (ImageView) findViewById(R.id.lock_anim);
+ mImageView.setBackgroundResource(R.drawable.lock_anim);
+ mImageView.setOnClickListener(this);
+ mAnimation = (AnimationDrawable) mImageView.getBackground();
+ }
+
+ protected void startAnimation(final AnimationDrawable animation) {
+ if (animation != null && !animation.isRunning()) {
+ animation.run();
+ }
+ }
+
+ protected void stopAnimation(final AnimationDrawable animation) {
+ if (animation != null && animation.isRunning()) animation.stop();
+ }
+}
+
diff --git a/src/com/android/settings/ChooseLockPatternTutorial.java b/src/com/android/settings/ChooseLockPatternTutorial.java
new file mode 100644
index 0000000..a0a878a
--- /dev/null
+++ b/src/com/android/settings/ChooseLockPatternTutorial.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import com.android.internal.widget.LockPatternUtils;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+
+public class ChooseLockPatternTutorial extends Activity implements View.OnClickListener {
+ private static final int REQUESTCODE_EXAMPLE = 1;
+
+ private View mNextButton;
+ private View mSkipButton;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ // Don't show the tutorial if the user has seen it before.
+ LockPatternUtils lockPatternUtils = new LockPatternUtils(getContentResolver());
+ if (savedInstanceState == null && lockPatternUtils.savedPatternExists()) {
+ Intent intent = new Intent();
+ intent.setClassName("com.android.settings", "com.android.settings.ChooseLockPattern");
+ startActivity(intent);
+ finish();
+ } else {
+ initViews();
+ }
+ }
+
+ private void initViews() {
+ setContentView(R.layout.choose_lock_pattern_tutorial);
+ mNextButton = findViewById(R.id.next_button);
+ mNextButton.setOnClickListener(this);
+ mSkipButton = findViewById(R.id.skip_button);
+ mSkipButton.setOnClickListener(this);
+ }
+
+ public void onClick(View v) {
+ if (v == mSkipButton) {
+ // Canceling, so finish all
+ setResult(ChooseLockPattern.RESULT_FINISHED);
+ finish();
+ } else if (v == mNextButton) {
+ startActivityForResult(new Intent(this, ChooseLockPatternExample.class),
+ REQUESTCODE_EXAMPLE);
+ }
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (requestCode == REQUESTCODE_EXAMPLE && resultCode == ChooseLockPattern.RESULT_FINISHED) {
+ setResult(resultCode);
+ finish();
+ }
+ }
+
+}
+
diff --git a/src/com/android/settings/ConfirmLockPattern.java b/src/com/android/settings/ConfirmLockPattern.java
new file mode 100644
index 0000000..44baccc
--- /dev/null
+++ b/src/com/android/settings/ConfirmLockPattern.java
@@ -0,0 +1,260 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.internal.widget.LockPatternView;
+import com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.CountDownTimer;
+import android.os.SystemClock;
+import android.os.Bundle;
+import android.widget.TextView;
+import android.view.Window;
+
+import java.util.List;
+
+/**
+ * Launch this when you want the user to confirm their lock pattern.
+ *
+ * Sets an activity result of {@link Activity#RESULT_OK} when the user
+ * successfully confirmed their pattern.
+ */
+public class ConfirmLockPattern extends Activity {
+
+ /**
+ * Names of {@link CharSequence} fields within the originating {@link Intent}
+ * that are used to configure the keyguard confirmation view's labeling.
+ * The view will use the system-defined resource strings for any labels that
+ * the caller does not supply.
+ */
+ public static final String HEADER_TEXT = "com.android.settings.ConfirmLockPattern.header";
+ public static final String FOOTER_TEXT = "com.android.settings.ConfirmLockPattern.footer";
+ public static final String HEADER_WRONG_TEXT = "com.android.settings.ConfirmLockPattern.header_wrong";
+ public static final String FOOTER_WRONG_TEXT = "com.android.settings.ConfirmLockPattern.footer_wrong";
+
+ // how long we wait to clear a wrong pattern
+ private static final int WRONG_PATTERN_CLEAR_TIMEOUT_MS = 2000;
+
+ private static final String KEY_NUM_WRONG_ATTEMPTS = "num_wrong_attempts";
+
+ private LockPatternView mLockPatternView;
+ private LockPatternUtils mLockPatternUtils;
+ private int mNumWrongConfirmAttempts;
+ private CountDownTimer mCountdownTimer;
+
+ private TextView mHeaderTextView;
+ private TextView mFooterTextView;
+
+ // caller-supplied text for various prompts
+ private CharSequence mHeaderText;
+ private CharSequence mFooterText;
+ private CharSequence mHeaderWrongText;
+ private CharSequence mFooterWrongText;
+
+
+ private enum Stage {
+ NeedToUnlock,
+ NeedToUnlockWrong,
+ LockedOut
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ mLockPatternUtils = new LockPatternUtils(getContentResolver());
+
+ requestWindowFeature(Window.FEATURE_NO_TITLE);
+ setContentView(R.layout.confirm_lock_pattern);
+
+ mHeaderTextView = (TextView) findViewById(R.id.headerText);
+ mLockPatternView = (LockPatternView) findViewById(R.id.lockPattern);
+ mFooterTextView = (TextView) findViewById(R.id.footerText);
+
+ // make it so unhandled touch events within the unlock screen go to the
+ // lock pattern view.
+ final LinearLayoutWithDefaultTouchRecepient topLayout
+ = (LinearLayoutWithDefaultTouchRecepient) findViewById(
+ R.id.topLayout);
+ topLayout.setDefaultTouchRecepient(mLockPatternView);
+
+ Intent intent = getIntent();
+ if (intent != null) {
+ mHeaderText = intent.getCharSequenceExtra(HEADER_TEXT);
+ mFooterText = intent.getCharSequenceExtra(FOOTER_TEXT);
+ mHeaderWrongText = intent.getCharSequenceExtra(HEADER_WRONG_TEXT);
+ mFooterWrongText = intent.getCharSequenceExtra(FOOTER_WRONG_TEXT);
+ }
+
+ mLockPatternView.setTactileFeedbackEnabled(mLockPatternUtils.isTactileFeedbackEnabled());
+ mLockPatternView.setOnPatternListener(mConfirmExistingLockPatternListener);
+ updateStage(Stage.NeedToUnlock);
+
+ if (savedInstanceState != null) {
+ mNumWrongConfirmAttempts = savedInstanceState.getInt(KEY_NUM_WRONG_ATTEMPTS);
+ } else {
+ // on first launch, if no lock pattern is set, then finish with
+ // success (don't want user to get stuck confirming something that
+ // doesn't exist).
+ if (!mLockPatternUtils.savedPatternExists()) {
+ setResult(RESULT_OK);
+ finish();
+ }
+ }
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ // deliberately not calling super since we are managing this in full
+ outState.putInt(KEY_NUM_WRONG_ATTEMPTS, mNumWrongConfirmAttempts);
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+
+ if (mCountdownTimer != null) {
+ mCountdownTimer.cancel();
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ // if the user is currently locked out, enforce it.
+ long deadline = mLockPatternUtils.getLockoutAttemptDeadline();
+ if (deadline != 0) {
+ handleAttemptLockout(deadline);
+ }
+ }
+
+ private void updateStage(Stage stage) {
+
+ switch (stage) {
+ case NeedToUnlock:
+ if (mHeaderText != null) {
+ mHeaderTextView.setText(mHeaderText);
+ } else {
+ mHeaderTextView.setText(R.string.lockpattern_need_to_unlock);
+ }
+ if (mFooterText != null) {
+ mFooterTextView.setText(mFooterText);
+ } else {
+ mFooterTextView.setText(R.string.lockpattern_need_to_unlock_footer);
+ }
+
+ mLockPatternView.setEnabled(true);
+ mLockPatternView.enableInput();
+ break;
+ case NeedToUnlockWrong:
+ if (mHeaderWrongText != null) {
+ mHeaderTextView.setText(mHeaderWrongText);
+ } else {
+ mHeaderTextView.setText(R.string.lockpattern_need_to_unlock_wrong);
+ }
+ if (mFooterWrongText != null) {
+ mFooterTextView.setText(mFooterWrongText);
+ } else {
+ mFooterTextView.setText(R.string.lockpattern_need_to_unlock_wrong_footer);
+ }
+
+ mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Wrong);
+ mLockPatternView.setEnabled(true);
+ mLockPatternView.enableInput();
+ break;
+ case LockedOut:
+ mLockPatternView.clearPattern();
+ // enabled = false means: disable input, and have the
+ // appearance of being disabled.
+ mLockPatternView.setEnabled(false); // appearance of being disabled
+ break;
+ }
+ }
+
+ private Runnable mClearPatternRunnable = new Runnable() {
+ public void run() {
+ mLockPatternView.clearPattern();
+ }
+ };
+
+ // clear the wrong pattern unless they have started a new one
+ // already
+ private void postClearPatternRunnable() {
+ mLockPatternView.removeCallbacks(mClearPatternRunnable);
+ mLockPatternView.postDelayed(mClearPatternRunnable, WRONG_PATTERN_CLEAR_TIMEOUT_MS);
+ }
+
+ /**
+ * The pattern listener that responds according to a user confirming
+ * an existing lock pattern.
+ */
+ private LockPatternView.OnPatternListener mConfirmExistingLockPatternListener = new LockPatternView.OnPatternListener() {
+
+ public void onPatternStart() {
+ mLockPatternView.removeCallbacks(mClearPatternRunnable);
+ }
+
+ public void onPatternCleared() {
+ mLockPatternView.removeCallbacks(mClearPatternRunnable);
+ }
+
+ public void onPatternDetected(List<LockPatternView.Cell> pattern) {
+ if (mLockPatternUtils.checkPattern(pattern)) {
+ setResult(RESULT_OK);
+ finish();
+ } else {
+ if (pattern.size() >= LockPatternUtils.MIN_PATTERN_REGISTER_FAIL &&
+ ++mNumWrongConfirmAttempts >= LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT) {
+ long deadline = mLockPatternUtils.setLockoutAttemptDeadline();
+ handleAttemptLockout(deadline);
+ } else {
+ updateStage(Stage.NeedToUnlockWrong);
+ postClearPatternRunnable();
+ }
+ }
+ }
+ };
+
+
+ private void handleAttemptLockout(long elapsedRealtimeDeadline) {
+ updateStage(Stage.LockedOut);
+ long elapsedRealtime = SystemClock.elapsedRealtime();
+ mCountdownTimer = new CountDownTimer(
+ elapsedRealtimeDeadline - elapsedRealtime,
+ LockPatternUtils.FAILED_ATTEMPT_COUNTDOWN_INTERVAL_MS) {
+
+ @Override
+ public void onTick(long millisUntilFinished) {
+ mHeaderTextView.setText(R.string.lockpattern_too_many_failed_confirmation_attempts_header);
+ final int secondsCountdown = (int) (millisUntilFinished / 1000);
+ mFooterTextView.setText(getString(
+ R.string.lockpattern_too_many_failed_confirmation_attempts_footer,
+ secondsCountdown));
+ }
+
+ @Override
+ public void onFinish() {
+ mNumWrongConfirmAttempts = 0;
+ updateStage(Stage.NeedToUnlock);
+ }
+ }.start();
+ }
+}
diff --git a/src/com/android/settings/DateTimeSettings.java b/src/com/android/settings/DateTimeSettings.java
new file mode 100644
index 0000000..e78215a
--- /dev/null
+++ b/src/com/android/settings/DateTimeSettings.java
@@ -0,0 +1,366 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.app.Dialog;
+import android.app.DatePickerDialog;
+import android.app.TimePickerDialog;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
+import android.os.Bundle;
+import android.os.SystemClock;
+import android.preference.CheckBoxPreference;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceScreen;
+import android.provider.Settings;
+import android.provider.Settings.SettingNotFoundException;
+import android.text.format.DateFormat;
+import android.widget.DatePicker;
+import android.widget.TimePicker;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+public class DateTimeSettings
+ extends PreferenceActivity
+ implements OnSharedPreferenceChangeListener,
+ TimePickerDialog.OnTimeSetListener , DatePickerDialog.OnDateSetListener {
+
+ private static final String HOURS_12 = "12";
+ private static final String HOURS_24 = "24";
+
+ private Calendar mDummyDate;
+ private static final String KEY_DATE_FORMAT = "date_format";
+ private static final String KEY_AUTO_TIME = "auto_time";
+
+ private static final int DIALOG_DATEPICKER = 0;
+ private static final int DIALOG_TIMEPICKER = 1;
+
+ private CheckBoxPreference mAutoPref;
+ private Preference mTimePref;
+ private Preference mTime24Pref;
+ private Preference mTimeZone;
+ private Preference mDatePref;
+ private ListPreference mDateFormat;
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ addPreferencesFromResource(R.xml.date_time_prefs);
+
+ initUI();
+ }
+
+ private void initUI() {
+ boolean autoEnabled = getAutoState();
+
+ mDummyDate = Calendar.getInstance();
+ mDummyDate.set(mDummyDate.get(Calendar.YEAR), 11, 31, 13, 0, 0);
+
+ mAutoPref = (CheckBoxPreference) findPreference(KEY_AUTO_TIME);
+ mAutoPref.setChecked(autoEnabled);
+ mTimePref = findPreference("time");
+ mTime24Pref = findPreference("24 hour");
+ mTimeZone = findPreference("timezone");
+ mDatePref = findPreference("date");
+ mDateFormat = (ListPreference) findPreference(KEY_DATE_FORMAT);
+
+ int currentFormatIndex = -1;
+ String [] dateFormats = getResources().getStringArray(R.array.date_format_values);
+ String [] formattedDates = new String[dateFormats.length];
+ String currentFormat = getDateFormat();
+ // Initialize if DATE_FORMAT is not set in the system settings
+ // This can happen after a factory reset (or data wipe)
+ if (currentFormat == null) {
+ currentFormat = getResources().getString(R.string.default_date_format);
+ setDateFormat(currentFormat);
+ }
+ for (int i = 0; i < formattedDates.length; i++) {
+ formattedDates[i] = DateFormat.format(dateFormats[i], mDummyDate).toString();
+ if (currentFormat.equals(dateFormats[i])) currentFormatIndex = i;
+ }
+
+ mDateFormat.setEntries(formattedDates);
+ mDateFormat.setEntryValues(R.array.date_format_values);
+ mDateFormat.setValue(currentFormat);
+
+ mTimePref.setEnabled(!autoEnabled);
+ mDatePref.setEnabled(!autoEnabled);
+ mTimeZone.setEnabled(!autoEnabled);
+
+ getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
+ }
+
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ ((CheckBoxPreference)mTime24Pref).setChecked(is24Hour());
+
+ // Register for time ticks and other reasons for time change
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_TIME_TICK);
+ filter.addAction(Intent.ACTION_TIME_CHANGED);
+ filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
+ registerReceiver(mIntentReceiver, filter, null, null);
+
+ updateTimeAndDateDisplay();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ unregisterReceiver(mIntentReceiver);
+ }
+
+ private void updateTimeAndDateDisplay() {
+ java.text.DateFormat shortDateFormat = DateFormat.getDateFormat(this);
+ Date now = Calendar.getInstance().getTime();
+ Date dummyDate = mDummyDate.getTime();
+ mTimePref.setSummary(DateFormat.getTimeFormat(this).format(now));
+ mTimeZone.setSummary(getTimeZoneText());
+ mDatePref.setSummary(shortDateFormat.format(now));
+ mDateFormat.setSummary(shortDateFormat.format(dummyDate));
+ }
+
+ public void onDateSet(DatePicker view, int year, int month, int day) {
+ Calendar c = Calendar.getInstance();
+
+ c.set(Calendar.YEAR, year);
+ c.set(Calendar.MONTH, month);
+ c.set(Calendar.DAY_OF_MONTH, day);
+ long when = c.getTimeInMillis();
+
+ if (when / 1000 < Integer.MAX_VALUE) {
+ SystemClock.setCurrentTimeMillis(when);
+ }
+ updateTimeAndDateDisplay();
+ }
+
+ public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
+ Calendar c = Calendar.getInstance();
+
+ c.set(Calendar.HOUR_OF_DAY, hourOfDay);
+ c.set(Calendar.MINUTE, minute);
+ long when = c.getTimeInMillis();
+
+ if (when / 1000 < Integer.MAX_VALUE) {
+ SystemClock.setCurrentTimeMillis(when);
+ }
+ updateTimeAndDateDisplay();
+ timeUpdated();
+ }
+
+ public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
+ if (key.equals(KEY_DATE_FORMAT)) {
+ String format = preferences.getString(key,
+ getResources().getString(R.string.default_date_format));
+ Settings.System.putString(getContentResolver(),
+ Settings.System.DATE_FORMAT, format);
+ updateTimeAndDateDisplay();
+ } else if (key.equals(KEY_AUTO_TIME)) {
+ boolean autoEnabled = preferences.getBoolean(key, true);
+ Settings.System.putInt(getContentResolver(),
+ Settings.System.AUTO_TIME,
+ autoEnabled ? 1 : 0);
+ mTimePref.setEnabled(!autoEnabled);
+ mDatePref.setEnabled(!autoEnabled);
+ mTimeZone.setEnabled(!autoEnabled);
+ }
+ }
+
+ @Override
+ public Dialog onCreateDialog(int id) {
+ Dialog d;
+
+ switch (id) {
+ case DIALOG_DATEPICKER: {
+ final Calendar calendar = Calendar.getInstance();
+ d = new DatePickerDialog(
+ this,
+ this,
+ calendar.get(Calendar.YEAR),
+ calendar.get(Calendar.MONTH),
+ calendar.get(Calendar.DAY_OF_MONTH));
+ d.setTitle(getResources().getString(R.string.date_time_changeDate_text));
+ break;
+ }
+ case DIALOG_TIMEPICKER: {
+ final Calendar calendar = Calendar.getInstance();
+ d = new TimePickerDialog(
+ this,
+ this,
+ calendar.get(Calendar.HOUR_OF_DAY),
+ calendar.get(Calendar.MINUTE),
+ DateFormat.is24HourFormat(this));
+ d.setTitle(getResources().getString(R.string.date_time_changeTime_text));
+ break;
+ }
+ default:
+ d = null;
+ break;
+ }
+
+ return d;
+ }
+
+ @Override
+ public void onPrepareDialog(int id, Dialog d) {
+ switch (id) {
+ case DIALOG_DATEPICKER: {
+ DatePickerDialog datePicker = (DatePickerDialog)d;
+ final Calendar calendar = Calendar.getInstance();
+ datePicker.updateDate(
+ calendar.get(Calendar.YEAR),
+ calendar.get(Calendar.MONTH),
+ calendar.get(Calendar.DAY_OF_MONTH));
+ break;
+ }
+ case DIALOG_TIMEPICKER: {
+ TimePickerDialog timePicker = (TimePickerDialog)d;
+ final Calendar calendar = Calendar.getInstance();
+ timePicker.updateTime(
+ calendar.get(Calendar.HOUR_OF_DAY),
+ calendar.get(Calendar.MINUTE));
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+ if (preference == mDatePref) {
+ showDialog(DIALOG_DATEPICKER);
+ } else if (preference == mTimePref) {
+ // The 24-hour mode may have changed, so recreate the dialog
+ removeDialog(DIALOG_TIMEPICKER);
+ showDialog(DIALOG_TIMEPICKER);
+ } else if (preference == mTime24Pref) {
+ set24Hour(((CheckBoxPreference)mTime24Pref).isChecked());
+ updateTimeAndDateDisplay();
+ timeUpdated();
+ } else if (preference == mTimeZone) {
+ Intent intent = new Intent();
+ intent.setClass(this, ZoneList.class);
+ startActivityForResult(intent, 0);
+ }
+ return false;
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode,
+ Intent data) {
+ updateTimeAndDateDisplay();
+ }
+
+ private void timeUpdated() {
+ Intent timeChanged = new Intent(Intent.ACTION_TIME_CHANGED);
+ sendBroadcast(timeChanged);
+ }
+
+ /* Get & Set values from the system settings */
+
+ private boolean is24Hour() {
+ return DateFormat.is24HourFormat(this);
+ }
+
+ private void set24Hour(boolean is24Hour) {
+ Settings.System.putString(getContentResolver(),
+ Settings.System.TIME_12_24,
+ is24Hour? HOURS_24 : HOURS_12);
+ }
+
+ private String getDateFormat() {
+ return Settings.System.getString(getContentResolver(),
+ Settings.System.DATE_FORMAT);
+ }
+
+ private boolean getAutoState() {
+ try {
+ return Settings.System.getInt(getContentResolver(),
+ Settings.System.AUTO_TIME) > 0;
+ } catch (SettingNotFoundException snfe) {
+ return true;
+ }
+ }
+
+ private void setDateFormat(String format) {
+ Settings.System.putString(getContentResolver(), Settings.System.DATE_FORMAT, format);
+ }
+
+ /* Helper routines to format timezone */
+
+ private String getTimeZoneText() {
+ TimeZone tz = java.util.Calendar.getInstance().getTimeZone();
+ boolean daylight = tz.inDaylightTime(new Date());
+ StringBuilder sb = new StringBuilder();
+
+ sb.append(formatOffset(tz.getRawOffset() +
+ (daylight ? tz.getDSTSavings() : 0))).
+ append(", ").
+ append(tz.getDisplayName(daylight, TimeZone.LONG));
+
+ return sb.toString();
+ }
+
+ private char[] formatOffset(int off) {
+ off = off / 1000 / 60;
+
+ char[] buf = new char[9];
+ buf[0] = 'G';
+ buf[1] = 'M';
+ buf[2] = 'T';
+
+ if (off < 0) {
+ buf[3] = '-';
+ off = -off;
+ } else {
+ buf[3] = '+';
+ }
+
+ int hours = off / 60;
+ int minutes = off % 60;
+
+ buf[4] = (char) ('0' + hours / 10);
+ buf[5] = (char) ('0' + hours % 10);
+
+ buf[6] = ':';
+
+ buf[7] = (char) ('0' + minutes / 10);
+ buf[8] = (char) ('0' + minutes % 10);
+
+ return buf;
+ }
+
+ private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ updateTimeAndDateDisplay();
+ }
+ };
+}
diff --git a/src/com/android/settings/DateTimeSettingsSetupWizard.java b/src/com/android/settings/DateTimeSettingsSetupWizard.java
new file mode 100644
index 0000000..8dd970b
--- /dev/null
+++ b/src/com/android/settings/DateTimeSettingsSetupWizard.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.os.Bundle;
+import android.view.View;
+import android.view.Window;
+import android.view.View.OnClickListener;
+import android.widget.LinearLayout;
+
+public class DateTimeSettingsSetupWizard extends DateTimeSettings implements OnClickListener {
+ private View mNextButton;
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ requestWindowFeature(Window.FEATURE_NO_TITLE);
+ super.onCreate(icicle);
+ setContentView(R.layout.date_time_settings_setupwizard);
+ mNextButton = findViewById(R.id.next_button);
+ mNextButton.setOnClickListener(this);
+ }
+
+ public void onClick(View v) {
+ setResult(RESULT_OK);
+ finish();
+ }
+}
diff --git a/src/com/android/settings/DebugIntentSender.java b/src/com/android/settings/DebugIntentSender.java
new file mode 100644
index 0000000..9fed947
--- /dev/null
+++ b/src/com/android/settings/DebugIntentSender.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.app.Activity;
+import android.widget.EditText;
+import android.widget.Button;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.text.TextUtils;
+import android.text.Spannable;
+import android.text.Selection;
+import android.net.Uri;
+
+/**
+ * A simple activity that provides a UI for sending intents
+ */
+public class DebugIntentSender extends Activity {
+ private EditText mIntentField;
+ private EditText mDataField;
+ private EditText mAccountField;
+ private EditText mResourceField;
+ private Button mSendBroadcastButton;
+ private Button mStartActivityButton;
+ private View.OnClickListener mClicked = new View.OnClickListener() {
+ public void onClick(View v) {
+ if ((v == mSendBroadcastButton) ||
+ (v == mStartActivityButton)) {
+ String intentAction = mIntentField.getText().toString();
+ String intentData = mDataField.getText().toString();
+ String account = mAccountField.getText().toString();
+ String resource = mResourceField.getText().toString();
+
+ Intent intent = new Intent(intentAction);
+ if (!TextUtils.isEmpty(intentData)) {
+ intent.setData(Uri.parse(intentData));
+ }
+ intent.putExtra("account", account);
+ intent.putExtra("resource", resource);
+ if (v == mSendBroadcastButton) {
+ sendBroadcast(intent);
+ } else {
+ startActivity(intent);
+ }
+
+ setResult(RESULT_OK);
+ finish();
+ }
+ }
+ };
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ setContentView(R.layout.intent_sender);
+
+ mIntentField = (EditText) findViewById(R.id.intent);
+ mIntentField.setText(Intent.ACTION_SYNC);
+ Selection.selectAll((Spannable) mIntentField.getText());
+
+ mDataField = (EditText) findViewById(R.id.data);
+ mDataField.setBackgroundResource(android.R.drawable.editbox_background);
+
+ mAccountField = (EditText) findViewById(R.id.account);
+ mResourceField = (EditText) findViewById(R.id.resource);
+
+ mSendBroadcastButton = (Button) findViewById(R.id.sendbroadcast);
+ mSendBroadcastButton.setOnClickListener(mClicked);
+
+ mStartActivityButton = (Button) findViewById(R.id.startactivity);
+ mStartActivityButton.setOnClickListener(mClicked);
+ }
+}
diff --git a/src/com/android/settings/DefaultRingtonePreference.java b/src/com/android/settings/DefaultRingtonePreference.java
new file mode 100644
index 0000000..8eed563
--- /dev/null
+++ b/src/com/android/settings/DefaultRingtonePreference.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+
+import android.content.Context;
+import android.content.Intent;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.preference.RingtonePreference;
+import android.util.AttributeSet;
+import android.util.Config;
+import android.util.Log;
+
+public class DefaultRingtonePreference extends RingtonePreference {
+ private static final String TAG = "DefaultRingtonePreference";
+
+ public DefaultRingtonePreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onPrepareRingtonePickerIntent(Intent ringtonePickerIntent) {
+ super.onPrepareRingtonePickerIntent(ringtonePickerIntent);
+
+ /*
+ * Since this preference is for choosing the default ringtone, it
+ * doesn't make sense to show a 'Default' item.
+ */
+ ringtonePickerIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, false);
+
+ /*
+ * Similarly, 'Silent' shouldn't be shown here.
+ */
+ ringtonePickerIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false);
+ }
+
+ @Override
+ protected void onSaveRingtone(Uri ringtoneUri) {
+ RingtoneManager.setActualDefaultRingtoneUri(getContext(), getRingtoneType(), ringtoneUri);
+ }
+
+ @Override
+ protected Uri onRestoreRingtone() {
+ return RingtoneManager.getActualDefaultRingtoneUri(getContext(), getRingtoneType());
+ }
+
+}
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
new file mode 100644
index 0000000..155f085
--- /dev/null
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.os.BatteryManager;
+import android.os.Bundle;
+import android.os.SystemProperties;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceScreen;
+import android.preference.CheckBoxPreference;
+import android.provider.Settings;
+import android.text.TextUtils;
+
+/*
+ * Displays preferences for application developers.
+ */
+public class DevelopmentSettings extends PreferenceActivity {
+
+ private static final String ENABLE_ADB = "enable_adb";
+ private static final String KEEP_SCREEN_ON = "keep_screen_on";
+ private static final String ALLOW_MOCK_LOCATION = "allow_mock_location";
+
+ private CheckBoxPreference mEnableAdb;
+ private CheckBoxPreference mKeepScreenOn;
+ private CheckBoxPreference mAllowMockLocation;
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ addPreferencesFromResource(R.xml.development_prefs);
+
+ mEnableAdb = (CheckBoxPreference) findPreference(ENABLE_ADB);
+ mKeepScreenOn = (CheckBoxPreference) findPreference(KEEP_SCREEN_ON);
+ mAllowMockLocation = (CheckBoxPreference) findPreference(ALLOW_MOCK_LOCATION);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ mEnableAdb.setChecked(Settings.Secure.getInt(getContentResolver(),
+ Settings.Secure.ADB_ENABLED, 0) != 0);
+ mKeepScreenOn.setChecked(Settings.System.getInt(getContentResolver(),
+ Settings.System.STAY_ON_WHILE_PLUGGED_IN, 0) != 0);
+ mAllowMockLocation.setChecked(Settings.Secure.getInt(getContentResolver(),
+ Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0);
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+
+ // Those monkeys kept committing suicide, so we add this property
+ // to disable this functionality
+ if (!TextUtils.isEmpty(SystemProperties.get("ro.monkey"))) {
+ return false;
+ }
+
+ if (preference == mEnableAdb) {
+ Settings.Secure.putInt(getContentResolver(), Settings.Secure.ADB_ENABLED,
+ mEnableAdb.isChecked() ? 1 : 0);
+ } else if (preference == mKeepScreenOn) {
+ Settings.System.putInt(getContentResolver(), Settings.System.STAY_ON_WHILE_PLUGGED_IN,
+ mKeepScreenOn.isChecked() ?
+ (BatteryManager.BATTERY_PLUGGED_AC | BatteryManager.BATTERY_PLUGGED_USB) : 0);
+ } else if (preference == mAllowMockLocation) {
+ Settings.Secure.putInt(getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION,
+ mAllowMockLocation.isChecked() ? 1 : 0);
+ }
+
+ return false;
+ }
+}
diff --git a/src/com/android/settings/DeviceInfoSettings.java b/src/com/android/settings/DeviceInfoSettings.java
new file mode 100644
index 0000000..be01f7d
--- /dev/null
+++ b/src/com/android/settings/DeviceInfoSettings.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.SystemProperties;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceGroup;
+import android.util.Config;
+import android.util.Log;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class DeviceInfoSettings extends PreferenceActivity {
+
+ private static final String TAG = "DeviceInfoSettings";
+ private static final boolean LOGD = false || Config.LOGD;
+
+ private static final String KEY_CONTAINER = "container";
+ private static final String KEY_TEAM = "team";
+ private static final String KEY_CONTRIBUTORS = "contributors";
+ private static final String KEY_TERMS = "terms";
+ private static final String KEY_LICENSE = "license";
+ private static final String KEY_COPYRIGHT = "copyright";
+ private static final String KEY_SYSTEM_UPDATE_SETTINGS = "system_update_settings";
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ addPreferencesFromResource(R.xml.device_info_settings);
+
+ setStringSummary("firmware_version", Build.VERSION.RELEASE);
+ setValueSummary("baseband_version", "gsm.version.baseband");
+ setStringSummary("device_model", Build.MODEL);
+ setStringSummary("build_number", Build.DISPLAY);
+ findPreference("kernel_version").setSummary(getFormattedKernelVersion());
+
+ /*
+ * Settings is a generic app and should not contain any device-specific
+ * info.
+ */
+
+ // These are contained in the "container" preference group
+ PreferenceGroup parentPreference = (PreferenceGroup) findPreference(KEY_CONTAINER);
+ Utils.updatePreferenceToSpecificActivityOrRemove(this, parentPreference, KEY_TERMS,
+ Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY);
+ Utils.updatePreferenceToSpecificActivityOrRemove(this, parentPreference, KEY_LICENSE,
+ Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY);
+ Utils.updatePreferenceToSpecificActivityOrRemove(this, parentPreference, KEY_COPYRIGHT,
+ Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY);
+ Utils.updatePreferenceToSpecificActivityOrRemove(this, parentPreference, KEY_TEAM,
+ Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY);
+
+ // These are contained by the root preference screen
+ parentPreference = getPreferenceScreen();
+ Utils.updatePreferenceToSpecificActivityOrRemove(this, parentPreference,
+ KEY_SYSTEM_UPDATE_SETTINGS,
+ Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY);
+ Utils.updatePreferenceToSpecificActivityOrRemove(this, parentPreference, KEY_CONTRIBUTORS,
+ Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY);
+ }
+
+ private void setStringSummary(String preference, String value) {
+ try {
+ findPreference(preference).setSummary(value);
+ } catch (RuntimeException e) {
+ findPreference(preference).setSummary(
+ getResources().getString(R.string.device_info_default));
+ }
+ }
+
+ private void setValueSummary(String preference, String property) {
+ try {
+ findPreference(preference).setSummary(
+ SystemProperties.get(property,
+ getResources().getString(R.string.device_info_default)));
+ } catch (RuntimeException e) {
+
+ }
+ }
+
+ private String getFormattedKernelVersion() {
+ String procVersionStr;
+
+ try {
+ BufferedReader reader = new BufferedReader(new FileReader("/proc/version"), 256);
+ try {
+ procVersionStr = reader.readLine();
+ } finally {
+ reader.close();
+ }
+
+ final String PROC_VERSION_REGEX =
+ "\\w+\\s+" + /* ignore: Linux */
+ "\\w+\\s+" + /* ignore: version */
+ "([^\\s]+)\\s+" + /* group 1: 2.6.22-omap1 */
+ "\\(([^\\s@]+(?:@[^\\s.]+)?)[^)]*\\)\\s+" + /* group 2: (xxxxxx@xxxxx.constant) */
+ "\\([^)]+\\)\\s+" + /* ignore: (gcc ..) */
+ "([^\\s]+)\\s+" + /* group 3: #26 */
+ "(?:PREEMPT\\s+)?" + /* ignore: PREEMPT (optional) */
+ "(.+)"; /* group 4: date */
+
+ Pattern p = Pattern.compile(PROC_VERSION_REGEX);
+ Matcher m = p.matcher(procVersionStr);
+
+ if (!m.matches()) {
+ Log.e(TAG, "Regex did not match on /proc/version: " + procVersionStr);
+ return "Unavailable";
+ } else if (m.groupCount() < 4) {
+ Log.e(TAG, "Regex match on /proc/version only returned " + m.groupCount()
+ + " groups");
+ return "Unavailable";
+ } else {
+ return (new StringBuilder(m.group(1)).append("\n").append(
+ m.group(2)).append(" ").append(m.group(3)).append("\n")
+ .append(m.group(4))).toString();
+ }
+ } catch (IOException e) {
+ Log.e(TAG,
+ "IO Exception when getting kernel version for Device Info screen",
+ e);
+
+ return "Unavailable";
+ }
+ }
+
+}
diff --git a/src/com/android/settings/Display.java b/src/com/android/settings/Display.java
new file mode 100644
index 0000000..f90e0f0
--- /dev/null
+++ b/src/com/android/settings/Display.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.app.Activity;
+import android.app.ActivityManagerNative;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.util.DisplayMetrics;
+import android.util.TypedValue;
+import android.view.View;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.Spinner;
+import android.widget.TextView;
+
+
+public class Display extends Activity implements View.OnClickListener {
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ setContentView(R.layout.display);
+
+ mFontSize = (Spinner) findViewById(R.id.fontSize);
+ mFontSize.setOnItemSelectedListener(mFontSizeChanged);
+ String[] states = new String[3];
+ Resources r = getResources();
+ states[0] = r.getString(R.string.small_font);
+ states[1] = r.getString(R.string.medium_font);
+ states[2] = r.getString(R.string.large_font);
+ ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
+ android.R.layout.simple_spinner_item, states);
+ adapter.setDropDownViewResource(
+ android.R.layout.simple_spinner_dropdown_item);
+ mFontSize.setAdapter(adapter);
+
+ mPreview = (TextView) findViewById(R.id.preview);
+ mPreview.setText(r.getText(R.string.font_size_preview_text));
+
+ Button save = (Button) findViewById(R.id.save);
+ save.setText(r.getText(R.string.font_size_save));
+ save.setOnClickListener(this);
+
+ mTextSizeTyped = new TypedValue();
+ TypedArray styledAttributes =
+ obtainStyledAttributes(android.R.styleable.TextView);
+ styledAttributes.getValue(android.R.styleable.TextView_textSize,
+ mTextSizeTyped);
+
+ DisplayMetrics metrics = getResources().getDisplayMetrics();
+ mDisplayMetrics = new DisplayMetrics();
+ mDisplayMetrics.density = metrics.density;
+ mDisplayMetrics.heightPixels = metrics.heightPixels;
+ mDisplayMetrics.scaledDensity = metrics.scaledDensity;
+ mDisplayMetrics.widthPixels = metrics.widthPixels;
+ mDisplayMetrics.xdpi = metrics.xdpi;
+ mDisplayMetrics.ydpi = metrics.ydpi;
+
+ styledAttributes.recycle();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ try {
+ mCurConfig.updateFrom(
+ ActivityManagerNative.getDefault().getConfiguration());
+ } catch (RemoteException e) {
+ }
+ if (mCurConfig.fontScale < 1) {
+ mFontSize.setSelection(0);
+ } else if (mCurConfig.fontScale > 1) {
+ mFontSize.setSelection(2);
+ } else {
+ mFontSize.setSelection(1);
+ }
+ updateFontScale();
+ }
+
+ private void updateFontScale() {
+ mDisplayMetrics.scaledDensity = mDisplayMetrics.density *
+ mCurConfig.fontScale;
+
+ float size = mTextSizeTyped.getDimension(mDisplayMetrics);
+ mPreview.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
+ }
+
+ public void onClick(View v) {
+ try {
+ ActivityManagerNative.getDefault().updateConfiguration(mCurConfig);
+ } catch (RemoteException e) {
+ }
+ finish();
+ }
+
+ private Spinner.OnItemSelectedListener mFontSizeChanged
+ = new Spinner.OnItemSelectedListener() {
+ public void onItemSelected(android.widget.AdapterView av, View v,
+ int position, long id) {
+ if (position == 0) {
+ mCurConfig.fontScale = .75f;
+ } else if (position == 2) {
+ mCurConfig.fontScale = 1.25f;
+ } else {
+ mCurConfig.fontScale = 1.0f;
+ }
+
+ updateFontScale();
+ }
+
+ public void onNothingSelected(android.widget.AdapterView av) {
+ }
+ };
+
+ private Spinner mFontSize;
+ private TextView mPreview;
+ private TypedValue mTextSizeTyped;
+ private DisplayMetrics mDisplayMetrics;
+ private Configuration mCurConfig = new Configuration();
+}
diff --git a/src/com/android/settings/EditPinPreference.java b/src/com/android/settings/EditPinPreference.java
new file mode 100644
index 0000000..ee3143c
--- /dev/null
+++ b/src/com/android/settings/EditPinPreference.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.content.Context;
+import android.preference.EditTextPreference;
+import android.text.method.DigitsKeyListener;
+import android.text.method.PasswordTransformationMethod;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.EditText;
+
+import java.util.Map;
+
+/**
+ * TODO: Add a soft dialpad for PIN entry.
+ */
+class EditPinPreference extends EditTextPreference {
+
+ private boolean mDialogOpen;
+
+ interface OnPinEnteredListener {
+ void onPinEntered(EditPinPreference preference, boolean positiveResult);
+ }
+
+ private OnPinEnteredListener mPinListener;
+
+ public EditPinPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public EditPinPreference(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ public void setOnPinEnteredListener(OnPinEnteredListener listener) {
+ mPinListener = listener;
+ }
+
+ @Override
+ protected void onBindDialogView(View view) {
+ super.onBindDialogView(view);
+
+ final EditText editText = (EditText) view.findViewById(android.R.id.edit);
+
+ if (editText != null) {
+ editText.setSingleLine(true);
+ editText.setTransformationMethod(PasswordTransformationMethod.getInstance());
+ editText.setKeyListener(DigitsKeyListener.getInstance());
+ }
+ }
+
+ public boolean isDialogOpen() {
+ return mDialogOpen;
+ }
+
+ @Override
+ protected void onDialogClosed(boolean positiveResult) {
+ super.onDialogClosed(positiveResult);
+ mDialogOpen = false;
+ if (mPinListener != null) {
+ mPinListener.onPinEntered(this, positiveResult);
+ }
+ }
+
+ public void showPinDialog() {
+ mDialogOpen = true;
+ showDialog(null);
+ }
+}
diff --git a/src/com/android/settings/GadgetPickActivity.java b/src/com/android/settings/GadgetPickActivity.java
new file mode 100644
index 0000000..840a6a5
--- /dev/null
+++ b/src/com/android/settings/GadgetPickActivity.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.app.LauncherActivity;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.gadget.GadgetProviderInfo;
+import android.gadget.GadgetManager;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.ListView;
+import android.util.Log;
+
+import java.text.Collator;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+
+public class GadgetPickActivity extends LauncherActivity
+{
+ private static final String TAG = "GadgetPickActivity";
+
+ GadgetManager mGadgetManager;
+ int mGadgetId;
+
+ public GadgetPickActivity() {
+ mGadgetManager = GadgetManager.getInstance(this);
+ }
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ Bundle extras = getIntent().getExtras();
+ mGadgetId = extras.getInt(GadgetManager.EXTRA_GADGET_ID);
+
+ setResultData(RESULT_CANCELED);
+ }
+
+ @Override
+ public void onListItemClick(ListView l, View v, int position, long id)
+ {
+ Intent intent = intentForPosition(position);
+ int result;
+ try {
+ mGadgetManager.bindGadgetId(mGadgetId, intent.getComponent());
+ result = RESULT_OK;
+ } catch (IllegalArgumentException e) {
+ // This is thrown if they're already bound, or otherwise somehow
+ // bogus. Set the result to canceled, and exit. The app *should*
+ // clean up at this point. We could pass the error along, but
+ // it's not clear that that's useful -- the gadget will simply not
+ // appear.
+ result = RESULT_CANCELED;
+ }
+ setResultData(result);
+ finish();
+ }
+
+ @Override
+ public List<ListItem> makeListItems() {
+ List<GadgetProviderInfo> installed = mGadgetManager.getInstalledProviders();
+ PackageManager pm = getPackageManager();
+
+ Drawable defaultIcon = null;
+ IconResizer resizer = new IconResizer();
+
+ ArrayList<ListItem> result = new ArrayList();
+ final int N = installed.size();
+ for (int i=0; i<N; i++) {
+ GadgetProviderInfo info = installed.get(i);
+
+ LauncherActivity.ListItem item = new LauncherActivity.ListItem();
+ item.packageName = info.provider.getPackageName();
+ item.className = info.provider.getClassName();
+
+ item.label = info.label;
+ if (info.icon != 0) {
+ Drawable d = pm.getDrawable( item.packageName, info.icon, null);
+ if (d != null) {
+ item.icon = resizer.createIconThumbnail(d);
+ } else {
+ Log.w(TAG, "Can't load icon drawable 0x" + Integer.toHexString(info.icon)
+ + " for package: " + item.packageName);
+ }
+ }
+ if (item.icon == null) {
+ // (including error case above)
+ if (defaultIcon == null) {
+ // TODO: Load standard icon.
+ }
+ item.icon = defaultIcon;
+ }
+
+ result.add(item);
+ }
+
+ Collections.sort(result, new Comparator<ListItem>() {
+ Collator mCollator = Collator.getInstance();
+ public int compare(ListItem lhs, ListItem rhs) {
+ return mCollator.compare(lhs.label, rhs.label);
+ }
+ });
+ return result;
+ }
+
+ void setResultData(int code) {
+ Intent result = new Intent();
+ result.putExtra(GadgetManager.EXTRA_GADGET_ID, mGadgetId);
+ setResult(code, result);
+ }
+}
+
diff --git a/src/com/android/settings/InputMethodsSettings.java b/src/com/android/settings/InputMethodsSettings.java
new file mode 100644
index 0000000..51b770d
--- /dev/null
+++ b/src/com/android/settings/InputMethodsSettings.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.settings;
+
+import java.util.HashSet;
+import java.util.List;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.os.SystemProperties;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceScreen;
+import android.preference.CheckBoxPreference;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+
+/*
+ * Displays preferences for input methods.
+ */
+public class InputMethodsSettings extends PreferenceActivity {
+ private List<InputMethodInfo> mInputMethodProperties;
+
+ final TextUtils.SimpleStringSplitter mStringColonSplitter
+ = new TextUtils.SimpleStringSplitter(':');
+
+ private String mLastInputMethodId;
+ private String mLastTickedInputMethodId;
+
+ static public String getInputMethodIdFromKey(String key) {
+ return key;
+ }
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ addPreferencesFromResource(R.xml.input_methods_prefs);
+
+ InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+
+ mInputMethodProperties = imm.getInputMethodList();
+
+ mLastInputMethodId = Settings.Secure.getString(getContentResolver(),
+ Settings.Secure.DEFAULT_INPUT_METHOD);
+
+ int N = (mInputMethodProperties == null ? 0 : mInputMethodProperties
+ .size());
+ for (int i = 0; i < N; ++i) {
+ InputMethodInfo property = mInputMethodProperties.get(i);
+ String prefKey = property.getId();
+
+ CharSequence label = property.loadLabel(getPackageManager());
+
+ // Add a check box.
+ CheckBoxPreference chkbxPref = new CheckBoxPreference(this);
+ chkbxPref.setKey(prefKey);
+ chkbxPref.setTitle(label);
+ getPreferenceScreen().addPreference(chkbxPref);
+
+ // If setting activity is available, add a setting screen entry.
+ if (null != property.getSettingsActivity()) {
+ PreferenceScreen prefScreen = new PreferenceScreen(this, null);
+ prefScreen.setKey(property.getSettingsActivity());
+ prefScreen.setTitle(getResources().getString(
+ R.string.input_methods_settings_label_format, label));
+ getPreferenceScreen().addPreference(prefScreen);
+ }
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ final HashSet<String> enabled = new HashSet<String>();
+ String enabledStr = Settings.Secure.getString(getContentResolver(),
+ Settings.Secure.ENABLED_INPUT_METHODS);
+ if (enabledStr != null) {
+ final TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
+ splitter.setString(enabledStr);
+ while (splitter.hasNext()) {
+ enabled.add(splitter.next());
+ }
+ }
+
+ // Update the statuses of the Check Boxes.
+ int N = mInputMethodProperties.size();
+ for (int i = 0; i < N; ++i) {
+ final String id = mInputMethodProperties.get(i).getId();
+ CheckBoxPreference pref = (CheckBoxPreference) findPreference(mInputMethodProperties
+ .get(i).getId());
+ pref.setChecked(enabled.contains(id));
+ }
+ mLastTickedInputMethodId = null;
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+
+ StringBuilder builder = new StringBuilder(256);
+
+ boolean haveLastInputMethod = false;
+
+ int firstEnabled = -1;
+ int N = mInputMethodProperties.size();
+ for (int i = 0; i < N; ++i) {
+ final String id = mInputMethodProperties.get(i).getId();
+ CheckBoxPreference pref = (CheckBoxPreference) findPreference(id);
+ boolean hasIt = id.equals(mLastInputMethodId);
+ if (pref.isChecked()) {
+ if (builder.length() > 0) builder.append(':');
+ builder.append(id);
+ if (firstEnabled < 0) {
+ firstEnabled = i;
+ }
+ if (hasIt) haveLastInputMethod = true;
+ } else if (hasIt) {
+ mLastInputMethodId = mLastTickedInputMethodId;
+ }
+ }
+
+ // If the last input method is unset, set it as the first enabled one.
+ if (null == mLastInputMethodId || "".equals(mLastInputMethodId)) {
+ if (firstEnabled >= 0) {
+ mLastInputMethodId = mInputMethodProperties.get(firstEnabled).getId();
+ } else {
+ mLastInputMethodId = null;
+ }
+ }
+
+ Settings.Secure.putString(getContentResolver(),
+ Settings.Secure.ENABLED_INPUT_METHODS, builder.toString());
+ Settings.Secure.putString(getContentResolver(),
+ Settings.Secure.DEFAULT_INPUT_METHOD, mLastInputMethodId);
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
+ Preference preference) {
+
+ // Those monkeys kept committing suicide, so we add this property
+ // to disable this functionality
+ if (!TextUtils.isEmpty(SystemProperties.get("ro.monkey"))) {
+ return false;
+ }
+
+ if (preference instanceof CheckBoxPreference) {
+ CheckBoxPreference chkPref = (CheckBoxPreference) preference;
+ String id = getInputMethodIdFromKey(chkPref.getKey());
+ if (chkPref.isChecked()) {
+ mLastTickedInputMethodId = id;
+ } else if (id.equals(mLastTickedInputMethodId)) {
+ mLastTickedInputMethodId = null;
+ }
+ } else if (preference instanceof PreferenceScreen) {
+ if (preference.getIntent() == null) {
+ PreferenceScreen pref = (PreferenceScreen) preference;
+ String activityName = pref.getKey();
+ String packageName = activityName.substring(0, activityName
+ .lastIndexOf("."));
+ if (activityName.length() > 0) {
+ Intent i = new Intent(Intent.ACTION_MAIN);
+ i.setClassName(packageName, activityName);
+ startActivity(i);
+ }
+ }
+ }
+
+ return false;
+ }
+}
diff --git a/src/com/android/settings/InstalledAppDetails.java b/src/com/android/settings/InstalledAppDetails.java
new file mode 100644
index 0000000..327874b
--- /dev/null
+++ b/src/com/android/settings/InstalledAppDetails.java
@@ -0,0 +1,478 @@
+
+
+/**
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.android.settings;
+
+import com.android.settings.R;
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.app.AlertDialog;
+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.IPackageStatsObserver;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageStats;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.text.format.Formatter;
+import android.util.Config;
+import android.util.Log;
+import java.util.ArrayList;
+import java.util.List;
+import android.content.ComponentName;
+import android.view.View;
+import android.widget.AppSecurityPermissions;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+/**
+ * Activity to display application information from Settings. This activity presents
+ * extended information associated with a package like code, data, total size, permissions
+ * used by the application and also the set of default launchable activities.
+ * For system applications, an option to clear user data is displayed only if data size is > 0.
+ * System applications that do not want clear user data do not have this option.
+ * For non-system applications, there is no option to clear data. Instead there is an option to
+ * uninstall the application.
+ */
+public class InstalledAppDetails extends Activity implements View.OnClickListener, DialogInterface.OnClickListener {
+ private static final String TAG="InstalledAppDetails";
+ private static final int _UNKNOWN_APP=R.string.unknown;
+ private ApplicationInfo mAppInfo;
+ private Button mAppButton;
+ private Button mActivitiesButton;
+ private boolean mCanUninstall;
+ private boolean localLOGV=Config.LOGV || false;
+ private TextView mAppSnippetSize;
+ private TextView mTotalSize;
+ private TextView mAppSize;
+ private TextView mDataSize;
+ private PkgSizeObserver mSizeObserver;
+ private ClearUserDataObserver mClearDataObserver;
+ // Views related to cache info
+ private View mCachePanel;
+ private TextView mCacheSize;
+ private Button mClearCacheButton;
+ private ClearCacheObserver mClearCacheObserver;
+ private Button mForceStopButton;
+
+ PackageStats mSizeInfo;
+ private Button mManageSpaceButton;
+ private PackageManager mPm;
+
+ //internal constants used in Handler
+ private static final int OP_SUCCESSFUL = 1;
+ private static final int OP_FAILED = 2;
+ private static final int CLEAR_USER_DATA = 1;
+ private static final int GET_PKG_SIZE = 2;
+ private static final int CLEAR_CACHE = 3;
+ private static final String ATTR_PACKAGE_STATS="PackageStats";
+
+ // invalid size value used initially and also when size retrieval through PackageManager
+ // fails for whatever reason
+ private static final int SIZE_INVALID = -1;
+
+ // Resource strings
+ private CharSequence mInvalidSizeStr;
+ private CharSequence mComputingStr;
+ private CharSequence mAppButtonText;
+
+ // Possible btn states
+ private enum AppButtonStates {
+ CLEAR_DATA,
+ UNINSTALL,
+ NONE
+ }
+ private AppButtonStates mAppButtonState;
+
+ private Handler mHandler = new Handler() {
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case CLEAR_USER_DATA:
+ processClearMsg(msg);
+ break;
+ case GET_PKG_SIZE:
+ refreshSizeInfo(msg);
+ break;
+ case CLEAR_CACHE:
+ // Refresh size info
+ mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver);
+ break;
+ default:
+ break;
+ }
+ }
+ };
+
+ 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);
+ msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED;
+ mHandler.sendMessage(msg);
+ }
+ }
+
+ class PkgSizeObserver extends IPackageStatsObserver.Stub {
+ public int idx;
+ public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) {
+ Message msg = mHandler.obtainMessage(GET_PKG_SIZE);
+ Bundle data = new Bundle();
+ data.putParcelable(ATTR_PACKAGE_STATS, pStats);
+ msg.setData(data);
+ mHandler.sendMessage(msg);
+
+ }
+ }
+
+ class ClearCacheObserver extends IPackageDataObserver.Stub {
+ public void onRemoveCompleted(final String packageName, final boolean succeeded) {
+ final Message msg = mHandler.obtainMessage(CLEAR_CACHE);
+ msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED;
+ mHandler.sendMessage(msg);
+ }
+ }
+
+ private String getSizeStr(long size) {
+ if (size == SIZE_INVALID) {
+ return mInvalidSizeStr.toString();
+ }
+ 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
+ mPm = getPackageManager();
+ //get application's name from intent
+ Intent intent = getIntent();
+ final String packageName = intent.getStringExtra(ManageApplications.APP_PKG_NAME);
+ mComputingStr = getText(R.string.computing_size);
+ // Try retrieving package stats again
+ CharSequence totalSizeStr, appSizeStr, dataSizeStr;
+ 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);
+ }
+ ((TextView)findViewById(R.id.app_name)).setText(appName);
+ mAppSnippetSize = ((TextView)findViewById(R.id.app_size));
+ mAppSnippetSize.setText(totalSizeStr);
+ //TODO download str and download url
+ //set values on views
+ 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);
+
+ 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();
+ 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);
+ mCacheSize.setText(mComputingStr);
+ mClearCacheButton = (Button) findViewById(R.id.clear_cache_button);
+ mForceStopButton = (Button) findViewById(R.id.force_stop_button);
+ mForceStopButton.setOnClickListener(this);
+
+ //clear activities
+ mActivitiesButton = (Button)findViewById(R.id.clear_activities_button);
+ List<ComponentName> prefActList = new ArrayList<ComponentName>();
+ //intent list cannot be null. so pass empty list
+ List<IntentFilter> intentList = new ArrayList<IntentFilter>();
+ mPm.getPreferredActivities(intentList, prefActList, packageName);
+ if(localLOGV) Log.i(TAG, "Have "+prefActList.size()+" number of activities in prefered list");
+ TextView autoLaunchView = (TextView)findViewById(R.id.auto_launch);
+ if(prefActList.size() <= 0) {
+ //disable clear activities button
+ autoLaunchView.setText(R.string.auto_launch_disable_text);
+ mActivitiesButton.setEnabled(false);
+ } else {
+ autoLaunchView.setText(R.string.auto_launch_enable_text);
+ mActivitiesButton.setOnClickListener(this);
+ }
+
+ // security permissions section
+ LinearLayout permsView = (LinearLayout) findViewById(R.id.permissions_section);
+ AppSecurityPermissions asp = new AppSecurityPermissions(this, packageName);
+ if(asp.getPermissionCount() > 0) {
+ permsView.setVisibility(View.VISIBLE);
+ // Make the security sections header visible
+ LinearLayout securityList = (LinearLayout) permsView.findViewById(
+ R.id.security_settings_list);
+ securityList.addView(asp.getPermissionsView());
+ } else {
+ permsView.setVisibility(View.GONE);
+ }
+ }
+
+ 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);
+ }
+ }
+ )
+ .show();
+ }
+
+ private void setIntentAndFinish(boolean finish, boolean appChanged) {
+ if(localLOGV) Log.i(TAG, "appChanged="+appChanged);
+ Intent intent = new Intent();
+ intent.putExtra(ManageApplications.APP_CHG, appChanged);
+ setResult(ManageApplications.RESULT_OK, intent);
+ mAppButton.setEnabled(false);
+ if(finish) {
+ finish();
+ }
+ }
+
+ /*
+ * Private method to handle get size info notification from observer when
+ * the async operation from PackageManager is complete. The current user data
+ * info has to be refreshed in the manage applications screen as well as the current screen.
+ */
+ private void refreshSizeInfo(Message msg) {
+ boolean changed = false;
+ PackageStats newPs = msg.getData().getParcelable(ATTR_PACKAGE_STATS);
+ long newTot = newPs.cacheSize+newPs.codeSize+newPs.dataSize;
+ if(mSizeInfo == null) {
+ mSizeInfo = newPs;
+ String str = getSizeStr(newTot);
+ mTotalSize.setText(str);
+ mAppSnippetSize.setText(str);
+ mAppSize.setText(getSizeStr(newPs.codeSize));
+ mDataSize.setText(getSizeStr(newPs.dataSize));
+ mCacheSize.setText(getSizeStr(newPs.cacheSize));
+ } else {
+ long oldTot = mSizeInfo.cacheSize+mSizeInfo.codeSize+mSizeInfo.dataSize;
+ if(newTot != oldTot) {
+ String str = getSizeStr(newTot);
+ mTotalSize.setText(str);
+ mAppSnippetSize.setText(str);
+ changed = true;
+ }
+ if(newPs.codeSize != mSizeInfo.codeSize) {
+ mAppSize.setText(getSizeStr(newPs.codeSize));
+ changed = true;
+ }
+ if(newPs.dataSize != mSizeInfo.dataSize) {
+ mDataSize.setText(getSizeStr(newPs.dataSize));
+ changed = true;
+ }
+ if(newPs.cacheSize != mSizeInfo.cacheSize) {
+ mCacheSize.setText(getSizeStr(newPs.cacheSize));
+ changed = true;
+ }
+ if(changed) {
+ mSizeInfo = newPs;
+ }
+ }
+
+ long data = mSizeInfo.dataSize;
+ // Disable button if data is 0
+ if(mAppButtonState != AppButtonStates.NONE){
+ mAppButton.setText(mAppButtonText);
+ if((mAppButtonState == AppButtonStates.CLEAR_DATA) && (data == 0)) {
+ mAppButton.setEnabled(false);
+ } else {
+ mAppButton.setEnabled(true);
+ mAppButton.setOnClickListener(this);
+ }
+ }
+ refreshCacheInfo(newPs.cacheSize);
+ }
+
+ private void refreshCacheInfo(long cacheSize) {
+ // Set cache info
+ mCacheSize.setText(getSizeStr(cacheSize));
+ if (cacheSize <= 0) {
+ mClearCacheButton.setEnabled(false);
+ } else {
+ mClearCacheButton.setOnClickListener(this);
+ }
+ }
+
+ /*
+ * Private method to handle clear message notification from observer when
+ * the async operation from PackageManager is complete
+ */
+ private void processClearMsg(Message msg) {
+ int result = msg.arg1;
+ String packageName = mAppInfo.packageName;
+ if(result == OP_SUCCESSFUL) {
+ Log.i(TAG, "Cleared user data for system package:"+packageName);
+ mPm.getPackageSizeInfo(packageName, mSizeObserver);
+ } else {
+ mAppButton.setText(R.string.clear_user_data_text);
+ mAppButton.setEnabled(true);
+ }
+ }
+
+ /*
+ * Private method to initiate clearing user data when the user clicks the clear data
+ * button for a system package
+ */
+ private void initiateClearUserDataForSysPkg() {
+ mAppButton.setEnabled(false);
+ //invoke uninstall or clear user data based on sysPackage
+ String packageName = mAppInfo.packageName;
+ Log.i(TAG, "Clearing user data for system package");
+ if(mClearDataObserver == null) {
+ mClearDataObserver = new ClearUserDataObserver();
+ }
+ 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
+ Log.i(TAG, "Couldnt clear application user data for package:"+packageName);
+ displayErrorDialog(R.string.clear_data_failed, false, false);
+ } else {
+ mAppButton.setText(R.string.recompute_size);
+ }
+ }
+
+ /*
+ * Method implementing functionality of buttons clicked
+ * @see android.view.View.OnClickListener#onClick(android.view.View)
+ */
+ 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);
+ }
+ } else if(v == mActivitiesButton) {
+ mPm.clearPackagePreferredActivities(packageName);
+ mActivitiesButton.setEnabled(false);
+ } else if(v == mManageSpaceButton) {
+ Intent intent = new Intent(Intent.ACTION_DEFAULT);
+ intent.setClassName(mAppInfo.packageName, mAppInfo.manageSpaceActivityName);
+ startActivityForResult(intent, -1);
+ } else if (v == mClearCacheButton) {
+ // Lazy initialization of observer
+ if (mClearCacheObserver == null) {
+ mClearCacheObserver = new ClearCacheObserver();
+ }
+ mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver);
+ } else if (v == mForceStopButton) {
+ ActivityManager am = (ActivityManager)getSystemService(
+ Context.ACTIVITY_SERVICE);
+ am.restartPackage(packageName);
+ }
+ }
+
+ public void onClick(DialogInterface dialog, int which) {
+ if(which == AlertDialog.BUTTON_POSITIVE) {
+ //invoke uninstall or clear user data based on sysPackage
+ initiateClearUserDataForSysPkg();
+ } else {
+ //cancel do nothing just retain existing screen
+ }
+ }
+}
+
diff --git a/src/com/android/settings/LanguageSettings.java b/src/com/android/settings/LanguageSettings.java
new file mode 100644
index 0000000..8463d26
--- /dev/null
+++ b/src/com/android/settings/LanguageSettings.java
@@ -0,0 +1,247 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.os.SystemProperties;
+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.provider.Settings.System;
+import android.text.TextUtils;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+
+import java.util.HashSet;
+import java.util.List;
+
+public class LanguageSettings extends PreferenceActivity {
+
+ private final String[] mSettingsUiKey = {
+ "auto_caps",
+ "auto_replace",
+ "auto_punctuate",
+ };
+
+ // Note: Order of this array should correspond to the order of the above array
+ private final String[] mSettingsSystemId = {
+ System.TEXT_AUTO_CAPS,
+ System.TEXT_AUTO_REPLACE,
+ System.TEXT_AUTO_PUNCTUATE,
+ };
+
+ // Note: Order of this array should correspond to the order of the above array
+ private final int[] mSettingsDefault = {
+ 1,
+ 1,
+ 1,
+ };
+
+ private List<InputMethodInfo> mInputMethodProperties;
+
+ final TextUtils.SimpleStringSplitter mStringColonSplitter
+ = new TextUtils.SimpleStringSplitter(':');
+
+ private String mLastInputMethodId;
+ private String mLastTickedInputMethodId;
+
+ static public String getInputMethodIdFromKey(String key) {
+ return key;
+ }
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ addPreferencesFromResource(R.xml.language_settings);
+
+ if (getAssets().getLocales().length == 1) {
+ getPreferenceScreen().
+ removePreference(findPreference("language_category"));
+ }
+
+ Configuration config = getResources().getConfiguration();
+ if (config.keyboard != Configuration.KEYBOARD_QWERTY) {
+ getPreferenceScreen().removePreference(
+ getPreferenceScreen().findPreference("hardkeyboard_category"));
+ } else {
+ ContentResolver resolver = getContentResolver();
+ for (int i = 0; i < mSettingsUiKey.length; i++) {
+ CheckBoxPreference pref = (CheckBoxPreference) findPreference(mSettingsUiKey[i]);
+ pref.setChecked(System.getInt(resolver, mSettingsSystemId[i],
+ mSettingsDefault[i]) > 0);
+ }
+ }
+
+ onCreateIMM();
+ }
+
+ private void onCreateIMM() {
+ InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+
+ mInputMethodProperties = imm.getInputMethodList();
+
+ mLastInputMethodId = Settings.Secure.getString(getContentResolver(),
+ Settings.Secure.DEFAULT_INPUT_METHOD);
+
+ PreferenceGroup textCategory = (PreferenceGroup) findPreference("text_category");
+
+ int N = (mInputMethodProperties == null ? 0 : mInputMethodProperties
+ .size());
+ for (int i = 0; i < N; ++i) {
+ InputMethodInfo property = mInputMethodProperties.get(i);
+ String prefKey = property.getId();
+
+ CharSequence label = property.loadLabel(getPackageManager());
+
+ // Add a check box.
+ CheckBoxPreference chkbxPref = new CheckBoxPreference(this);
+ chkbxPref.setKey(prefKey);
+ chkbxPref.setTitle(label);
+ textCategory.addPreference(chkbxPref);
+
+ // If setting activity is available, add a setting screen entry.
+ if (null != property.getSettingsActivity()) {
+ PreferenceScreen prefScreen = new PreferenceScreen(this, null);
+ prefScreen.setKey(property.getSettingsActivity());
+ CharSequence settingsLabel = getResources().getString(
+ R.string.input_methods_settings_label_format, label);
+ prefScreen.setTitle(settingsLabel);
+ textCategory.addPreference(prefScreen);
+ }
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ final HashSet<String> enabled = new HashSet<String>();
+ String enabledStr = Settings.Secure.getString(getContentResolver(),
+ Settings.Secure.ENABLED_INPUT_METHODS);
+ if (enabledStr != null) {
+ final TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
+ splitter.setString(enabledStr);
+ while (splitter.hasNext()) {
+ enabled.add(splitter.next());
+ }
+ }
+
+ // Update the statuses of the Check Boxes.
+ int N = mInputMethodProperties.size();
+ for (int i = 0; i < N; ++i) {
+ final String id = mInputMethodProperties.get(i).getId();
+ CheckBoxPreference pref = (CheckBoxPreference) findPreference(mInputMethodProperties
+ .get(i).getId());
+ pref.setChecked(enabled.contains(id));
+ }
+ mLastTickedInputMethodId = null;
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+
+ StringBuilder builder = new StringBuilder(256);
+
+ boolean haveLastInputMethod = false;
+
+ int firstEnabled = -1;
+ int N = mInputMethodProperties.size();
+ for (int i = 0; i < N; ++i) {
+ final String id = mInputMethodProperties.get(i).getId();
+ CheckBoxPreference pref = (CheckBoxPreference) findPreference(id);
+ boolean hasIt = id.equals(mLastInputMethodId);
+ if (pref.isChecked()) {
+ if (builder.length() > 0) builder.append(':');
+ builder.append(id);
+ if (firstEnabled < 0) {
+ firstEnabled = i;
+ }
+ if (hasIt) haveLastInputMethod = true;
+ } else if (hasIt) {
+ mLastInputMethodId = mLastTickedInputMethodId;
+ }
+ }
+
+ // If the last input method is unset, set it as the first enabled one.
+ if (null == mLastInputMethodId || "".equals(mLastInputMethodId)) {
+ if (firstEnabled >= 0) {
+ mLastInputMethodId = mInputMethodProperties.get(firstEnabled).getId();
+ } else {
+ mLastInputMethodId = null;
+ }
+ }
+
+ Settings.Secure.putString(getContentResolver(),
+ Settings.Secure.ENABLED_INPUT_METHODS, builder.toString());
+ Settings.Secure.putString(getContentResolver(),
+ Settings.Secure.DEFAULT_INPUT_METHOD, mLastInputMethodId);
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+
+ // Physical keyboard stuff
+ for (int i = 0; i < mSettingsUiKey.length; i++) {
+ if (mSettingsUiKey[i].equals(preference.getKey())) {
+ System.putInt(getContentResolver(), mSettingsSystemId[i],
+ ((CheckBoxPreference)preference).isChecked()? 1 : 0);
+ return true;
+ }
+ }
+
+ // Input Method stuff
+ // Those monkeys kept committing suicide, so we add this property
+ // to disable this functionality
+ if (!TextUtils.isEmpty(SystemProperties.get("ro.monkey"))) {
+ return false;
+ }
+
+ if (preference instanceof CheckBoxPreference) {
+ CheckBoxPreference chkPref = (CheckBoxPreference) preference;
+ String id = getInputMethodIdFromKey(chkPref.getKey());
+ if (chkPref.isChecked()) {
+ mLastTickedInputMethodId = id;
+ } else if (id.equals(mLastTickedInputMethodId)) {
+ mLastTickedInputMethodId = null;
+ }
+ } else if (preference instanceof PreferenceScreen) {
+ if (preference.getIntent() == null) {
+ PreferenceScreen pref = (PreferenceScreen) preference;
+ String activityName = pref.getKey();
+ String packageName = activityName.substring(0, activityName
+ .lastIndexOf("."));
+ if (activityName.length() > 0) {
+ Intent i = new Intent(Intent.ACTION_MAIN);
+ i.setClassName(packageName, activityName);
+ startActivity(i);
+ }
+ }
+ }
+
+ return super.onPreferenceTreeClick(preferenceScreen, preference);
+ }
+
+}
diff --git a/src/com/android/settings/LauncherGadgetBinder.java b/src/com/android/settings/LauncherGadgetBinder.java
new file mode 100644
index 0000000..f7b5a61
--- /dev/null
+++ b/src/com/android/settings/LauncherGadgetBinder.java
@@ -0,0 +1,225 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.app.Activity;
+import android.content.ContentResolver;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Intent;
+import android.content.ComponentName;
+import android.database.Cursor;
+import android.database.SQLException;
+import android.gadget.GadgetManager;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.BaseColumns;
+import android.util.Log;
+
+import java.util.ArrayList;
+
+public class LauncherGadgetBinder extends Activity {
+ private static final String TAG = "LauncherGadgetBinder";
+ private static final boolean LOGD = true;
+
+ static final String AUTHORITY = "com.android.launcher.settings";
+ static final String TABLE_FAVORITES = "favorites";
+
+ static final String EXTRA_BIND_SOURCES = "com.android.launcher.settings.bindsources";
+ static final String EXTRA_BIND_TARGETS = "com.android.launcher.settings.bindtargets";
+
+ static final String EXTRA_GADGET_BITMAPS = "com.android.camera.gadgetbitmaps";
+
+ /**
+ * {@link ContentProvider} constants pulled over from Launcher
+ */
+ static final class LauncherProvider implements BaseColumns {
+ static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + TABLE_FAVORITES);
+
+ static final String ITEM_TYPE = "itemType";
+ static final String GADGET_ID = "gadgetId";
+ static final String ICON = "icon";
+
+ static final int ITEM_TYPE_GADGET = 4;
+ static final int ITEM_TYPE_WIDGET_CLOCK = 1000;
+ static final int ITEM_TYPE_WIDGET_SEARCH = 1001;
+ static final int ITEM_TYPE_WIDGET_PHOTO_FRAME = 1002;
+ }
+
+ static final String[] BIND_PROJECTION = new String[] {
+ LauncherProvider._ID,
+ LauncherProvider.ITEM_TYPE,
+ LauncherProvider.GADGET_ID,
+ LauncherProvider.ICON,
+ };
+
+ static final int INDEX_ID = 0;
+ static final int INDEX_ITEM_TYPE = 1;
+ static final int INDEX_GADGET_ID = 2;
+ static final int INDEX_ICON = 3;
+
+ static final ComponentName BIND_PHOTO_GADGET = new ComponentName("com.android.camera",
+ "com.android.camera.PhotoGadgetBind");
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ finish();
+
+ // This helper reaches into the Launcher database and binds any unlinked
+ // gadgets. If will remove any items that can't be bound successfully.
+ // We protect this binder at the manifest level by asserting the caller
+ // has the Launcher WRITE_SETTINGS permission.
+
+ final Intent intent = getIntent();
+ final Bundle extras = intent.getExtras();
+
+ int[] bindSources = null;
+ ArrayList<ComponentName> bindTargets = null;
+ Exception exception = null;
+
+ try {
+ bindSources = extras.getIntArray(EXTRA_BIND_SOURCES);
+ bindTargets = intent.getParcelableArrayListExtra(EXTRA_BIND_TARGETS);
+ } catch (ClassCastException ex) {
+ exception = ex;
+ }
+
+ if (exception != null || bindSources == null || bindTargets == null ||
+ bindSources.length != bindTargets.size()) {
+ Log.w(TAG, "Problem reading incoming bind request, or invalid request", exception);
+ return;
+ }
+
+ final String selectWhere = buildOrWhereString(LauncherProvider.ITEM_TYPE, bindSources);
+
+ final ContentResolver resolver = getContentResolver();
+ final GadgetManager gadgetManager = GadgetManager.getInstance(this);
+
+ boolean foundPhotoGadgets = false;
+ final ArrayList<Integer> photoGadgetIds = new ArrayList<Integer>();
+ final ArrayList<Bitmap> photoBitmaps = new ArrayList<Bitmap>();
+
+ Cursor c = null;
+
+ try {
+ c = resolver.query(LauncherProvider.CONTENT_URI,
+ BIND_PROJECTION, selectWhere, null, null);
+
+ if (LOGD) Log.d(TAG, "found bind cursor count="+c.getCount());
+
+ final ContentValues values = new ContentValues();
+ while (c != null && c.moveToNext()) {
+ long favoriteId = c.getLong(INDEX_ID);
+ int itemType = c.getInt(INDEX_ITEM_TYPE);
+ int gadgetId = c.getInt(INDEX_GADGET_ID);
+ byte[] iconData = c.getBlob(INDEX_ICON);
+
+ // Find the binding target for this type
+ ComponentName targetGadget = null;
+ for (int i = 0; i < bindSources.length; i++) {
+ if (bindSources[i] == itemType) {
+ targetGadget = bindTargets.get(i);
+ break;
+ }
+ }
+
+ if (LOGD) Log.d(TAG, "found matching targetGadget="+targetGadget.toString()+" for favoriteId="+favoriteId);
+
+ boolean bindSuccess = false;
+ try {
+ gadgetManager.bindGadgetId(gadgetId, targetGadget);
+ bindSuccess = true;
+ } catch (RuntimeException ex) {
+ Log.w(TAG, "Problem binding gadget", ex);
+ }
+
+ // Handle special case of photo gadget by loading bitmap and
+ // preparing for later binding
+ if (bindSuccess && iconData != null &&
+ itemType == LauncherProvider.ITEM_TYPE_WIDGET_PHOTO_FRAME) {
+ Bitmap bitmap = BitmapFactory.decodeByteArray(iconData, 0, iconData.length);
+
+ photoGadgetIds.add(gadgetId);
+ photoBitmaps.add(bitmap);
+ foundPhotoGadgets = true;
+ }
+
+ if (LOGD) Log.d(TAG, "after finished, success="+bindSuccess);
+
+ // Depending on success, update launcher or remove item
+ Uri favoritesUri = ContentUris.withAppendedId(LauncherProvider.CONTENT_URI, favoriteId);
+ if (bindSuccess) {
+ values.clear();
+ values.put(LauncherProvider.ITEM_TYPE, LauncherProvider.ITEM_TYPE_GADGET);
+ values.putNull(LauncherProvider.ICON);
+ resolver.update(favoritesUri, values, null, null);
+ } else {
+ resolver.delete(favoritesUri, null, null);
+ }
+
+ }
+ } catch (SQLException ex) {
+ Log.w(TAG, "Problem while binding gadgetIds for Launcher", ex);
+ } finally {
+ if (c != null) {
+ c.close();
+ }
+ }
+
+ if (foundPhotoGadgets) {
+ // Convert gadgetIds into int[]
+ final int N = photoGadgetIds.size();
+ final int[] photoGadgetIdsArray = new int[N];
+ for (int i = 0; i < N; i++) {
+ photoGadgetIdsArray[i] = photoGadgetIds.get(i);
+ }
+
+ // Launch intent over to handle bitmap binding, but we don't need to
+ // wait around for the result.
+ final Intent bindIntent = new Intent();
+ bindIntent.setComponent(BIND_PHOTO_GADGET);
+
+ final Bundle bindExtras = new Bundle();
+ bindExtras.putIntArray(GadgetManager.EXTRA_GADGET_IDS, photoGadgetIdsArray);
+ bindExtras.putParcelableArrayList(EXTRA_GADGET_BITMAPS, photoBitmaps);
+ bindIntent.putExtras(bindExtras);
+
+ startActivity(bindIntent);
+ }
+
+ if (LOGD) Log.d(TAG, "completely finished with binding for Launcher");
+ }
+
+ /**
+ * Build a query string that will match any row where the column matches
+ * anything in the values list.
+ */
+ static String buildOrWhereString(String column, int[] values) {
+ StringBuilder selectWhere = new StringBuilder();
+ for (int i = values.length - 1; i >= 0; i--) {
+ selectWhere.append(column).append("=").append(values[i]);
+ if (i > 0) {
+ selectWhere.append(" OR ");
+ }
+ }
+ return selectWhere.toString();
+ }
+
+}
diff --git a/src/com/android/settings/LocalePicker.java b/src/com/android/settings/LocalePicker.java
new file mode 100644
index 0000000..386d7e0
--- /dev/null
+++ b/src/com/android/settings/LocalePicker.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.app.ActivityManagerNative;
+import android.app.IActivityManager;
+import android.app.ListActivity;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.os.SystemProperties;
+import android.util.Log;
+import android.view.View;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+
+import java.io.BufferedWriter;
+import java.io.FileOutputStream;
+import java.util.Arrays;
+import java.util.Locale;
+
+public class LocalePicker extends ListActivity {
+ private static final String TAG = "LocalePicker";
+
+ Loc[] mLocales;
+
+ private static class Loc {
+ String label;
+ Locale locale;
+
+ public Loc(String label, Locale locale) {
+ this.label = label;
+ this.locale = locale;
+ }
+
+ @Override
+ public String toString() {
+ return this.label;
+ }
+ }
+
+ int getContentView() {
+ return R.layout.locale_picker;
+ }
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ setContentView(getContentView());
+
+ String[] locales = getAssets().getLocales();
+ Arrays.sort(locales);
+
+ final int origSize = locales.length;
+ Loc[] preprocess = new Loc[origSize];
+ int finalSize = 0;
+ 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) {
+ 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);
+ } 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
+ // 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);
+ }
+ } else {
+ String displayName;
+ if (s.equals("zz_ZZ")) {
+ displayName = "Pseudo...";
+ } else {
+ displayName = toTitleCase(l.getDisplayLanguage());
+ }
+ preprocess[finalSize++] = new Loc(displayName, l);
+ }
+ }
+ }
+ }
+ mLocales = new Loc[finalSize];
+ for (int i = 0; i < finalSize ; i++) {
+ mLocales[i] = preprocess[i];
+ }
+ int layoutId = R.layout.locale_picker_item;
+ int fieldId = R.id.locale;
+ ArrayAdapter<Loc> adapter = new ArrayAdapter<Loc>(this, layoutId, fieldId, mLocales);
+ getListView().setAdapter(adapter);
+ }
+
+ private static String toTitleCase(String s) {
+ if (s.length() == 0) {
+ return s;
+ }
+
+ return Character.toUpperCase(s.charAt(0)) + s.substring(1);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ getListView().requestFocus();
+ }
+
+ @Override
+ protected void onListItemClick(ListView l, View v, int position, long id) {
+ try {
+ IActivityManager am = ActivityManagerNative.getDefault();
+ Configuration config = am.getConfiguration();
+
+ Loc loc = mLocales[position];
+ config.locale = loc.locale;
+
+ // indicate this isn't some passing default - the user wants this remembered
+ config.userSetLocale = true;
+
+ am.updateConfiguration(config);
+ } catch (RemoteException e) {
+ // Intentionally left blank
+ }
+ finish();
+ }
+}
diff --git a/src/com/android/settings/LocalePickerInSetupWizard.java b/src/com/android/settings/LocalePickerInSetupWizard.java
new file mode 100644
index 0000000..b160e89
--- /dev/null
+++ b/src/com/android/settings/LocalePickerInSetupWizard.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.app.ActivityManagerNative;
+import android.app.IActivityManager;
+import android.app.ListActivity;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.os.SystemProperties;
+import android.util.Log;
+import android.view.View;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+
+import java.io.BufferedWriter;
+import java.io.FileOutputStream;
+import java.util.Arrays;
+import java.util.Locale;
+
+public class LocalePickerInSetupWizard extends LocalePicker {
+
+ @Override
+ int getContentView() {
+ return R.layout.locale_picker_in_setupwizard;
+ }
+
+}
diff --git a/src/com/android/settings/ManageApplications.java b/src/com/android/settings/ManageApplications.java
new file mode 100644
index 0000000..74957ed
--- /dev/null
+++ b/src/com/android/settings/ManageApplications.java
@@ -0,0 +1,1307 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import com.android.settings.R;
+import android.app.ActivityManager;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.ListActivity;
+import android.app.ProgressDialog;
+import android.content.BroadcastReceiver;
+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.IPackageStatsObserver;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageStats;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.text.format.Formatter;
+import android.util.Config;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.widget.AdapterView.OnItemClickListener;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+/**
+ * Activity to pick an application that will be used to display installation information and
+ * options to uninstall/delete user data for system applications. This activity
+ * can be launched through Settings or via the ACTION_MANAGE_PACKAGE_STORAGE
+ * intent.
+ * Initially a compute in progress message is displayed while the application retrieves
+ * the list of application information from the PackageManager. The size information
+ * for each package is refreshed to the screen. The resource(app description and
+ * icon) information for each package is not available yet, so some default values for size
+ * icon and descriptions are used initially. Later the resource information for each
+ * application is retrieved and dynamically updated on the screen.
+ * A Broadcast receiver registers for package additions or deletions when the activity is
+ * in focus. If the user installs or deletes packages when the activity has focus, the receiver
+ * gets notified and proceeds to add/delete these packages from the list on the screen.
+ * This is an unlikely scenario but could happen. The entire list gets created every time
+ * the activity's onStart gets invoked. This is to avoid having the receiver for the entire
+ * life cycle of the application.
+ * The applications can be sorted either alphabetically or
+ * based on size(descending). If this activity gets launched under low memory
+ * situations(A low memory notification dispatches intent
+ * ACTION_MANAGE_PACKAGE_STORAGE) the list is sorted per size.
+ * If the user selects an application, extended info(like size, uninstall/clear data options,
+ * permissions info etc.,) is displayed via the InstalledAppDetails activity.
+ */
+public class ManageApplications extends ListActivity implements
+ OnItemClickListener, DialogInterface.OnCancelListener,
+ DialogInterface.OnClickListener {
+ // TAG for this activity
+ private static final String TAG = "ManageApplications";
+
+ // Log information boolean
+ private boolean localLOGV = Config.LOGV || false;
+
+ // attributes used as keys when passing values to InstalledAppDetails activity
+ public static final String APP_PKG_PREFIX = "com.android.settings.";
+ public static final String APP_PKG_NAME = APP_PKG_PREFIX+"ApplicationPkgName";
+ public static final String APP_CHG = APP_PKG_PREFIX+"changed";
+
+ // attribute name used in receiver for tagging names of added/deleted packages
+ private static final String ATTR_PKG_NAME="PackageName";
+ private static final String ATTR_APP_PKG_STATS="ApplicationPackageStats";
+
+ // constant value that can be used to check return code from sub activity.
+ private static final int INSTALLED_APP_DETAILS = 1;
+
+ // sort order that can be changed through the menu can be sorted alphabetically
+ // or size(descending)
+ private static final int MENU_OPTIONS_BASE = 0;
+ public static final int SORT_ORDER_ALPHA = MENU_OPTIONS_BASE + 0;
+ public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 1;
+ // Filter options used for displayed list of applications
+ public static final int FILTER_APPS_ALL = MENU_OPTIONS_BASE + 2;
+ public static final int FILTER_APPS_THIRD_PARTY = MENU_OPTIONS_BASE + 3;
+ public static final int FILTER_APPS_RUNNING = MENU_OPTIONS_BASE + 4;
+ public static final int FILTER_OPTIONS = MENU_OPTIONS_BASE + 5;
+ // Alert Dialog presented to user to find out the filter option
+ AlertDialog mAlertDlg;
+ // sort order
+ private int mSortOrder = SORT_ORDER_ALPHA;
+ // Filter value
+ int mFilterApps = FILTER_APPS_ALL;
+
+ // Custom Adapter used for managing items in the list
+ private AppInfoAdapter mAppInfoAdapter;
+
+ // messages posted to the handler
+ private static final int HANDLER_MESSAGE_BASE = 0;
+ private static final int INIT_PKG_INFO = HANDLER_MESSAGE_BASE+1;
+ private static final int COMPUTE_PKG_SIZE_DONE = HANDLER_MESSAGE_BASE+2;
+ private static final int REMOVE_PKG = HANDLER_MESSAGE_BASE+3;
+ private static final int REORDER_LIST = HANDLER_MESSAGE_BASE+4;
+ private static final int ADD_PKG_START = HANDLER_MESSAGE_BASE+5;
+ private static final int ADD_PKG_DONE = HANDLER_MESSAGE_BASE+6;
+ private static final int REFRESH_ICONS = HANDLER_MESSAGE_BASE+7;
+ private static final int NEXT_LOAD_STEP = HANDLER_MESSAGE_BASE+8;
+
+ // observer object used for computing pkg sizes
+ private PkgSizeObserver mObserver;
+ // local handle to PackageManager
+ private PackageManager mPm;
+ // Broadcast Receiver object that receives notifications for added/deleted
+ // packages
+ private PackageIntentReceiver mReceiver;
+ // atomic variable used to track if computing pkg sizes is in progress. should be volatile?
+
+ private boolean mComputeSizes = false;
+ // default icon thats used when displaying applications initially before resource info is
+ // retrieved
+ private Drawable mDefaultAppIcon;
+
+ // temporary dialog displayed while the application info loads
+ private static final int DLG_BASE = 0;
+ private static final int DLG_LOADING = DLG_BASE + 1;
+
+ // compute index used to track the application size computations
+ private int mComputeIndex;
+
+ // Size resource used for packages whose size computation failed for some reason
+ private CharSequence mInvalidSizeStr;
+ private CharSequence mComputingSizeStr;
+
+ // map used to store list of added and removed packages. Immutable Boolean
+ // variables indicate if a package has been added or removed. If a package is
+ // added or deleted multiple times a single entry with the latest operation will
+ // be recorded in the map.
+ private Map<String, Boolean> mAddRemoveMap;
+
+ // layout inflater object used to inflate views
+ private LayoutInflater mInflater;
+
+ // invalid size value used initially and also when size retrieval through PackageManager
+ // fails for whatever reason
+ private static final int SIZE_INVALID = -1;
+
+ // debug boolean variable to test delays from PackageManager API's
+ private boolean DEBUG_PKG_DELAY = false;
+
+ // Thread to load resources
+ ResourceLoaderThread mResourceThread;
+
+ String mCurrentPkgName;
+
+ //TODO implement a cache system
+ private Map<String, AppInfo> mAppPropCache;
+
+ // empty message displayed when list is empty
+ private TextView mEmptyView;
+
+ // Boolean variables indicating state
+ private boolean mLoadLabels = false;
+ private boolean mSizesFirst = false;
+ // ListView used to display list
+ private ListView mListView;
+ // State variables used to figure out menu options and also
+ // initiate the first computation and loading of resources
+ private boolean mJustCreated = true;
+ private boolean mFirst = false;
+
+ /*
+ * Handler class to handle messages for various operations
+ * Most of the operations that effect Application related data
+ * are posted as messages to the handler to avoid synchronization
+ * when accessing these structures.
+ * When the size retrieval gets kicked off for the first time, a COMPUTE_PKG_SIZE_START
+ * message is posted to the handler which invokes the getSizeInfo for the pkg at index 0
+ * When the PackageManager's asynchronous call back through
+ * PkgSizeObserver.onGetStatsCompleted gets invoked, the application resources like
+ * label, description, icon etc., is loaded in the same thread and these values are
+ * set on the observer. The observer then posts a COMPUTE_PKG_SIZE_DONE message
+ * to the handler. This information is updated on the AppInfoAdapter associated with
+ * the list view of this activity and size info retrieval is initiated for the next package as
+ * indicated by mComputeIndex
+ * When a package gets added while the activity has focus, the PkgSizeObserver posts
+ * ADD_PKG_START message to the handler. If the computation is not in progress, the size
+ * is retrieved for the newly added package through the observer object and the newly
+ * installed app info is updated on the screen. If the computation is still in progress
+ * the package is added to an internal structure and action deferred till the computation
+ * is done for all the packages.
+ * When a package gets deleted, REMOVE_PKG is posted to the handler
+ * if computation is not in progress(as indicated by
+ * mDoneIniting), the package is deleted from the displayed list of apps. If computation is
+ * still in progress the package is added to an internal structure and action deferred till
+ * the computation is done for all packages.
+ * When the sizes of all packages is computed, the newly
+ * added or removed packages are processed in order.
+ * If the user changes the order in which these applications are viewed by hitting the
+ * menu key, REORDER_LIST message is posted to the handler. this sorts the list
+ * of items based on the sort order.
+ */
+ private Handler mHandler = new Handler() {
+ public void handleMessage(Message msg) {
+ PackageStats ps;
+ ApplicationInfo info;
+ Bundle data;
+ String pkgName = null;
+ AppInfo appInfo;
+ data = msg.getData();
+ if(data != null) {
+ pkgName = data.getString(ATTR_PKG_NAME);
+ }
+ switch (msg.what) {
+ case INIT_PKG_INFO:
+ if(localLOGV) Log.i(TAG, "Message INIT_PKG_INFO");
+ // Retrieve the package list and init some structures
+ initAppList(mFilterApps);
+ mHandler.sendEmptyMessage(NEXT_LOAD_STEP);
+ break;
+ case COMPUTE_PKG_SIZE_DONE:
+ if(localLOGV) Log.i(TAG, "Message COMPUTE_PKG_SIZE_DONE");
+ if(pkgName == null) {
+ Log.w(TAG, "Ignoring message");
+ break;
+ }
+ ps = data.getParcelable(ATTR_APP_PKG_STATS);
+ if(ps == null) {
+ Log.i(TAG, "Invalid package stats for package:"+pkgName);
+ } else {
+ int pkgId = mAppInfoAdapter.getIndex(pkgName);
+ if(mComputeIndex != pkgId) {
+ //spurious call from stale observer
+ Log.w(TAG, "Stale call back from PkgSizeObserver");
+ break;
+ }
+ mAppInfoAdapter.updateAppSize(pkgName, ps);
+ }
+ mComputeIndex++;
+ if (mComputeIndex < mAppInfoAdapter.getCount()) {
+ // initiate compute package size for next pkg in list
+ mObserver.invokeGetSizeInfo(mAppInfoAdapter.getApplicationInfo(
+ mComputeIndex),
+ COMPUTE_PKG_SIZE_DONE);
+ } else {
+ // check for added/removed packages
+ Set<String> keys = mAddRemoveMap.keySet();
+ Iterator<String> iter = keys.iterator();
+ List<String> removeList = new ArrayList<String>();
+ boolean added = false;
+ boolean removed = false;
+ while (iter.hasNext()) {
+ String key = iter.next();
+ if (mAddRemoveMap.get(key) == Boolean.TRUE) {
+ // add
+ try {
+ info = mPm.getApplicationInfo(key, 0);
+ mAppInfoAdapter.addApplicationInfo(info);
+ added = true;
+ } catch (NameNotFoundException e) {
+ Log.w(TAG, "Invalid added package:"+key+" Ignoring entry");
+ }
+ } else {
+ // remove
+ removeList.add(key);
+ removed = true;
+ }
+ }
+ // remove uninstalled packages from list
+ if (removed) {
+ mAppInfoAdapter.removeFromList(removeList);
+ }
+ // handle newly installed packages
+ if (added) {
+ mObserver.invokeGetSizeInfo(mAppInfoAdapter.getApplicationInfo(
+ mComputeIndex),
+ COMPUTE_PKG_SIZE_DONE);
+ } else {
+ // end computation here
+ mComputeSizes = true;
+ mFirst = true;
+ mAppInfoAdapter.sortList(mSortOrder);
+ mHandler.sendEmptyMessage(NEXT_LOAD_STEP);
+ }
+ }
+ break;
+ case REMOVE_PKG:
+ if(localLOGV) Log.i(TAG, "Message REMOVE_PKG");
+ if(pkgName == null) {
+ Log.w(TAG, "Ignoring message:REMOVE_PKG for null pkgName");
+ break;
+ }
+ if (!mComputeSizes) {
+ Boolean currB = mAddRemoveMap.get(pkgName);
+ if (currB == null || (currB.equals(Boolean.TRUE))) {
+ mAddRemoveMap.put(pkgName, Boolean.FALSE);
+ }
+ break;
+ }
+ List<String> pkgList = new ArrayList<String>();
+ pkgList.add(pkgName);
+ mAppInfoAdapter.removeFromList(pkgList);
+ break;
+ case REORDER_LIST:
+ if(localLOGV) Log.i(TAG, "Message REORDER_LIST");
+ int menuOption = msg.arg1;
+ if((menuOption == SORT_ORDER_ALPHA) ||
+ (menuOption == SORT_ORDER_SIZE)) {
+ // Option to sort list
+ if (menuOption != mSortOrder) {
+ mSortOrder = menuOption;
+ if (localLOGV) Log.i(TAG, "Changing sort order to "+mSortOrder);
+ mAppInfoAdapter.sortList(mSortOrder);
+ }
+ } else if(menuOption != mFilterApps) {
+ // Option to filter list
+ mFilterApps = menuOption;
+ boolean ret = mAppInfoAdapter.resetAppList(mFilterApps,
+ getInstalledApps(mFilterApps));
+ if(!ret) {
+ // Reset cache
+ mAppPropCache = null;
+ mFilterApps = FILTER_APPS_ALL;
+ mHandler.sendEmptyMessage(INIT_PKG_INFO);
+ sendMessageToHandler(REORDER_LIST, menuOption);
+ }
+ }
+ break;
+ case ADD_PKG_START:
+ if(localLOGV) Log.i(TAG, "Message ADD_PKG_START");
+ if(pkgName == null) {
+ Log.w(TAG, "Ignoring message:ADD_PKG_START for null pkgName");
+ break;
+ }
+ if (!mComputeSizes) {
+ Boolean currB = mAddRemoveMap.get(pkgName);
+ if (currB == null || (currB.equals(Boolean.FALSE))) {
+ mAddRemoveMap.put(pkgName, Boolean.TRUE);
+ }
+ break;
+ }
+ try {
+ info = mPm.getApplicationInfo(pkgName, 0);
+ } catch (NameNotFoundException e) {
+ Log.w(TAG, "Couldnt find application info for:"+pkgName);
+ break;
+ }
+ mObserver.invokeGetSizeInfo(info, ADD_PKG_DONE);
+ break;
+ case ADD_PKG_DONE:
+ if(localLOGV) Log.i(TAG, "Message COMPUTE_PKG_SIZE_DONE");
+ if(pkgName == null) {
+ Log.w(TAG, "Ignoring message:ADD_PKG_START for null pkgName");
+ break;
+ }
+ ps = data.getParcelable(ATTR_APP_PKG_STATS);
+ mAppInfoAdapter.addToList(pkgName, ps);
+ break;
+ case REFRESH_ICONS:
+ Map<String, AppInfo> iconMap = (Map<String, AppInfo>) msg.obj;
+ if(iconMap == null) {
+ Log.w(TAG, "Error loading icons for applications");
+ } else {
+ mAppInfoAdapter.updateAppsResourceInfo(iconMap);
+ }
+ mLoadLabels = true;
+ mHandler.sendEmptyMessage(NEXT_LOAD_STEP);
+ break;
+ case NEXT_LOAD_STEP:
+ if (mComputeSizes && mLoadLabels) {
+ doneLoadingData();
+ } else if (!mComputeSizes && !mLoadLabels) {
+ // Either load the package labels or initiate get size info
+ if (mSizesFirst) {
+ initComputeSizes();
+ } else {
+ initResourceThread();
+ }
+ } else {
+ // Create list view from the adapter here. Wait till the sort order
+ // of list is defined. its either by label or by size. so atleast one of the
+ // first steps should be complete before filling the list
+ if (mJustCreated) {
+ // Set the adapter here.
+ mJustCreated = false;
+ mListView.setAdapter(mAppInfoAdapter);
+ dismissLoadingMsg();
+ }
+ if (!mComputeSizes) {
+ initComputeSizes();
+ } else if (!mLoadLabels) {
+ initResourceThread();
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ };
+
+
+
+ private void doneLoadingData() {
+ setProgressBarIndeterminateVisibility(false);
+ }
+
+ List<ApplicationInfo> getInstalledApps(int filterOption) {
+ List<ApplicationInfo> installedAppList = mPm.getInstalledApplications(
+ PackageManager.GET_UNINSTALLED_PACKAGES);
+ if (installedAppList == null) {
+ return new ArrayList<ApplicationInfo> ();
+ }
+ if (filterOption == FILTER_APPS_THIRD_PARTY) {
+ List<ApplicationInfo> appList =new ArrayList<ApplicationInfo> ();
+ for (ApplicationInfo appInfo : installedAppList) {
+ boolean flag = false;
+ if ((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
+ // Updated system app
+ flag = true;
+ } else if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
+ // Non-system app
+ flag = true;
+ }
+ if (flag) {
+ appList.add(appInfo);
+ }
+ }
+ return appList;
+ } else if (filterOption == FILTER_APPS_RUNNING) {
+ List<ApplicationInfo> appList =new ArrayList<ApplicationInfo> ();
+ List<ActivityManager.RunningAppProcessInfo> procList = getRunningAppProcessesList();
+ if ((procList == null) || (procList.size() == 0)) {
+ return appList;
+ }
+ // Retrieve running processes from ActivityManager
+ for (ActivityManager.RunningAppProcessInfo appProcInfo : procList) {
+ if ((appProcInfo != null) && (appProcInfo.pkgList != null)){
+ int size = appProcInfo.pkgList.length;
+ for (int i = 0; i < size; i++) {
+ ApplicationInfo appInfo = null;
+ try {
+ appInfo = mPm.getApplicationInfo(appProcInfo.pkgList[i],
+ PackageManager.GET_UNINSTALLED_PACKAGES);
+ } catch (NameNotFoundException e) {
+ Log.w(TAG, "Error retrieving ApplicationInfo for pkg:"+appProcInfo.pkgList[i]);
+ continue;
+ }
+ if(appInfo != null) {
+ appList.add(appInfo);
+ }
+ }
+ }
+ }
+ return appList;
+ } else {
+ return installedAppList;
+ }
+ }
+
+ private List<ActivityManager.RunningAppProcessInfo> getRunningAppProcessesList() {
+ ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
+ return am.getRunningAppProcesses();
+ }
+
+ // some initialization code used when kicking off the size computation
+ private void initAppList(int filterOption) {
+ setProgressBarIndeterminateVisibility(true);
+ mComputeIndex = 0;
+ mComputeSizes = false;
+ mLoadLabels = false;
+ // Initialize lists
+ List<ApplicationInfo> appList = getInstalledApps(filterOption);
+ mAddRemoveMap = new TreeMap<String, Boolean>();
+ mAppInfoAdapter.resetAppList(filterOption, appList);
+ }
+
+ // Utility method to start a thread to read application labels and icons
+ private void initResourceThread() {
+ //load resources now
+ if(mResourceThread.isAlive()) {
+ mResourceThread.interrupt();
+ }
+ mResourceThread.loadAllResources(mAppInfoAdapter.getAppList());
+ }
+
+ private void initComputeSizes() {
+ // initiate compute pkg sizes
+ if (localLOGV) Log.i(TAG, "Initiating compute sizes for first time");
+ if (mAppInfoAdapter.getCount() > 0) {
+ mObserver.invokeGetSizeInfo(mAppInfoAdapter.getApplicationInfo(0),
+ COMPUTE_PKG_SIZE_DONE);
+ } else {
+ mComputeSizes = true;
+ }
+ }
+
+ private void showEmptyViewIfListEmpty() {
+ if (localLOGV) Log.i(TAG, "Checking for empty view");
+ if (mAppInfoAdapter.getCount() > 0) {
+ mListView.setVisibility(View.VISIBLE);
+ mEmptyView.setVisibility(View.GONE);
+ } else {
+ mListView.setVisibility(View.GONE);
+ mEmptyView.setVisibility(View.VISIBLE);
+ }
+ }
+
+ // internal structure used to track added and deleted packages when
+ // the activity has focus
+ class AddRemoveInfo {
+ String pkgName;
+ boolean add;
+ public AddRemoveInfo(String pPkgName, boolean pAdd) {
+ pkgName = pPkgName;
+ add = pAdd;
+ }
+ }
+
+ class ResourceLoaderThread extends Thread {
+ List<ApplicationInfo> mAppList;
+
+ void loadAllResources(List<ApplicationInfo> appList) {
+ mAppList = appList;
+ start();
+ }
+
+ public void run() {
+ Map<String, AppInfo> iconMap = new HashMap<String, AppInfo>();
+ if(mAppList == null || mAppList.size() <= 0) {
+ Log.w(TAG, "Empty or null application list");
+ } else {
+ for (ApplicationInfo appInfo : mAppList) {
+ CharSequence appName = appInfo.loadLabel(mPm);
+ Drawable appIcon = appInfo.loadIcon(mPm);
+ iconMap.put(appInfo.packageName,
+ new AppInfo(appInfo.packageName, appName, appIcon));
+ }
+ }
+ Message msg = mHandler.obtainMessage(REFRESH_ICONS);
+ msg.obj = iconMap;
+ mHandler.sendMessage(msg);
+ }
+ }
+
+ /* Internal class representing an application or packages displayable attributes
+ *
+ */
+ class AppInfo {
+ public String pkgName;
+ int index;
+ public CharSequence appName;
+ public Drawable appIcon;
+ public CharSequence appSize;
+ public PackageStats appStats;
+
+ public void refreshIcon(AppInfo pInfo) {
+ appName = pInfo.appName;
+ appIcon = pInfo.appIcon;
+ }
+
+ public AppInfo(String pName, CharSequence aName, Drawable aIcon) {
+ index = -1;
+ pkgName = pName;
+ appName = aName;
+ appIcon = aIcon;
+ appStats = null;
+ appSize = mComputingSizeStr;
+ }
+
+ public AppInfo(String pName, int pIndex, CharSequence aName, Drawable aIcon,
+ PackageStats ps) {
+ index = pIndex;
+ pkgName = pName;
+ appName = aName;
+ appIcon = aIcon;
+ if(ps == null) {
+ appSize = mComputingSizeStr;
+ } else {
+ appStats = ps;
+ appSize = getSizeStr();
+ }
+ }
+ public void setSize(PackageStats ps) {
+ appStats = ps;
+ if (ps != null) {
+ appSize = getSizeStr();
+ }
+ }
+ public long getTotalSize() {
+ PackageStats ps = appStats;
+ if (ps != null) {
+ return ps.cacheSize+ps.codeSize+ps.dataSize;
+ }
+ return SIZE_INVALID;
+ }
+
+ private String getSizeStr() {
+ PackageStats ps = appStats;
+ String retStr = "";
+ // insert total size information into map to display in view
+ // at this point its guaranteed that ps is not null. but checking anyway
+ if (ps != null) {
+ long size = getTotalSize();
+ if (size == SIZE_INVALID) {
+ return mInvalidSizeStr.toString();
+ }
+ return Formatter.formatFileSize(ManageApplications.this, size);
+ }
+ return retStr;
+ }
+ }
+
+ // View Holder used when displaying views
+ static class AppViewHolder {
+ TextView appName;
+ ImageView appIcon;
+ TextView appSize;
+ }
+
+ /* Custom adapter implementation for the ListView
+ * This adapter maintains a map for each displayed application and its properties
+ * An index value on each AppInfo object indicates the correct position or index
+ * in the list. If the list gets updated dynamically when the user is viewing the list of
+ * applications, we need to return the correct index of position. This is done by mapping
+ * the getId methods via the package name into the internal maps and indices.
+ * The order of applications in the list is mirrored in mAppLocalList
+ */
+ class AppInfoAdapter extends BaseAdapter {
+ private Map<String, AppInfo> mAppPropMap;
+ private List<ApplicationInfo> mAppLocalList;
+ ApplicationInfo.DisplayNameComparator mAlphaComparator;
+ AppInfoComparator mSizeComparator;
+
+ private AppInfo getFromCache(String packageName) {
+ if(mAppPropCache == null) {
+ return null;
+ }
+ return mAppPropCache.get(packageName);
+ }
+
+ public AppInfoAdapter(Context c, List<ApplicationInfo> appList) {
+ mAppLocalList = appList;
+ boolean useCache = false;
+ int sortOrder = SORT_ORDER_ALPHA;
+ int imax = mAppLocalList.size();
+ if(mAppPropCache != null) {
+ useCache = true;
+ // Activity has been resumed. can use the cache to populate values initially
+ mAppPropMap = mAppPropCache;
+ sortOrder = mSortOrder;
+ }
+ sortAppList(sortOrder);
+ // Recreate property map
+ mAppPropMap = new TreeMap<String, AppInfo>();
+ for (int i = 0; i < imax; i++) {
+ ApplicationInfo info = mAppLocalList.get(i);
+ AppInfo aInfo = getFromCache(info.packageName);
+ if(aInfo == null){
+ aInfo = new AppInfo(info.packageName, i,
+ info.packageName, mDefaultAppIcon, null);
+ } else {
+ aInfo.index = i;
+ }
+ mAppPropMap.put(info.packageName, aInfo);
+ }
+ }
+
+ public int getCount() {
+ return mAppLocalList.size();
+ }
+
+ public Object getItem(int position) {
+ return mAppLocalList.get(position);
+ }
+
+ /*
+ * This method returns the index of the package position in the application list
+ */
+ public int getIndex(String pkgName) {
+ if(pkgName == null) {
+ Log.w(TAG, "Getting index of null package in List Adapter");
+ }
+ int imax = mAppLocalList.size();
+ ApplicationInfo appInfo;
+ for(int i = 0; i < imax; i++) {
+ appInfo = mAppLocalList.get(i);
+ if(appInfo.packageName.equalsIgnoreCase(pkgName)) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ public ApplicationInfo getApplicationInfo(int position) {
+ int imax = mAppLocalList.size();
+ if( (position < 0) || (position >= imax)) {
+ Log.w(TAG, "Position out of bounds in List Adapter");
+ return null;
+ }
+ return mAppLocalList.get(position);
+ }
+
+ public void addApplicationInfo(ApplicationInfo info) {
+ if(info == null) {
+ Log.w(TAG, "Ignoring null add in List Adapter");
+ return;
+ }
+ mAppLocalList.add(info);
+ }
+
+ public long getItemId(int position) {
+ int imax = mAppLocalList.size();
+ if( (position < 0) || (position >= imax)) {
+ Log.w(TAG, "Position out of bounds in List Adapter");
+ return -1;
+ }
+ return mAppPropMap.get(mAppLocalList.get(position).packageName).index;
+ }
+
+ public List<ApplicationInfo> getAppList() {
+ return mAppLocalList;
+ }
+
+ public View getView(int position, View convertView, ViewGroup parent) {
+ if (position >= mAppLocalList.size()) {
+ Log.w(TAG, "Invalid view position:"+position+", actual size is:"+mAppLocalList.size());
+ return null;
+ }
+ // A ViewHolder keeps references to children views to avoid unneccessary calls
+ // to findViewById() on each row.
+ AppViewHolder holder;
+
+ // When convertView is not null, we can reuse it directly, there is no need
+ // to reinflate it. We only inflate a new View when the convertView supplied
+ // by ListView is null.
+ if (convertView == null) {
+ convertView = mInflater.inflate(R.layout.manage_applications_item, null);
+
+ // Creates a ViewHolder and store references to the two children views
+ // we want to bind data to.
+ holder = new AppViewHolder();
+ holder.appName = (TextView) convertView.findViewById(R.id.app_name);
+ holder.appIcon = (ImageView) convertView.findViewById(R.id.app_icon);
+ holder.appSize = (TextView) convertView.findViewById(R.id.app_size);
+ convertView.setTag(holder);
+ } else {
+ // Get the ViewHolder back to get fast access to the TextView
+ // and the ImageView.
+ holder = (AppViewHolder) convertView.getTag();
+ }
+
+ // Bind the data efficiently with the holder
+ ApplicationInfo appInfo = mAppLocalList.get(position);
+ AppInfo mInfo = mAppPropMap.get(appInfo.packageName);
+ if(mInfo != null) {
+ if(mInfo.appName != null) {
+ holder.appName.setText(mInfo.appName);
+ }
+ if(mInfo.appIcon != null) {
+ holder.appIcon.setImageDrawable(mInfo.appIcon);
+ }
+ if (mInfo.appSize != null) {
+ holder.appSize.setText(mInfo.appSize);
+ }
+ } else {
+ Log.w(TAG, "No info for package:"+appInfo.packageName+" in property map");
+ }
+ return convertView;
+ }
+
+ private void adjustIndex() {
+ int imax = mAppLocalList.size();
+ ApplicationInfo info;
+ for (int i = 0; i < imax; i++) {
+ info = mAppLocalList.get(i);
+ mAppPropMap.get(info.packageName).index = i;
+ }
+ }
+
+ public void sortAppList(int sortOrder) {
+ Collections.sort(mAppLocalList, getAppComparator(sortOrder));
+ }
+
+ public void sortList(int sortOrder) {
+ sortAppList(sortOrder);
+ adjustIndex();
+ notifyDataSetChanged();
+ }
+
+ public boolean resetAppList(int filterOption, List<ApplicationInfo> appList) {
+ // Create application list based on the filter value
+ mAppLocalList = appList;
+ // Check for all properties in map before sorting. Populate values from cache
+ for(ApplicationInfo applicationInfo : mAppLocalList) {
+ AppInfo appInfo = mAppPropMap.get(applicationInfo.packageName);
+ if(appInfo == null) {
+ AppInfo rInfo = getFromCache(applicationInfo.packageName);
+ if(rInfo == null) {
+ // Need to load resources again. Inconsistency somewhere
+ return false;
+ }
+ mAppPropMap.put(applicationInfo.packageName, rInfo);
+ }
+ }
+ if (mAppLocalList.size() > 0) {
+ sortList(mSortOrder);
+ } else {
+ notifyDataSetChanged();
+ }
+ showEmptyViewIfListEmpty();
+ return true;
+ }
+
+ private Comparator<ApplicationInfo> getAppComparator(int sortOrder) {
+ if (sortOrder == SORT_ORDER_ALPHA) {
+ // Lazy initialization
+ if (mAlphaComparator == null) {
+ mAlphaComparator = new ApplicationInfo.DisplayNameComparator(mPm);
+ }
+ return mAlphaComparator;
+ }
+ // Lazy initialization
+ if(mSizeComparator == null) {
+ mSizeComparator = new AppInfoComparator(mAppPropMap);
+ }
+ return mSizeComparator;
+ }
+
+ public void updateAppsResourceInfo(Map<String, AppInfo> iconMap) {
+ if(iconMap == null) {
+ Log.w(TAG, "Null iconMap when refreshing icon in List Adapter");
+ return;
+ }
+ boolean changed = false;
+ for (ApplicationInfo info : mAppLocalList) {
+ AppInfo pInfo = iconMap.get(info.packageName);
+ if(pInfo != null) {
+ AppInfo aInfo = mAppPropMap.get(info.packageName);
+ if (aInfo != null) {
+ aInfo.refreshIcon(pInfo);
+ } else {
+ mAppPropMap.put(info.packageName, pInfo);
+ }
+ changed = true;
+ }
+ }
+ if(changed) {
+ notifyDataSetChanged();
+ }
+ }
+
+ public void addToList(String pkgName, PackageStats ps) {
+ if(pkgName == null) {
+ Log.w(TAG, "Adding null pkg to List Adapter");
+ return;
+ }
+ ApplicationInfo info;
+ try {
+ info = mPm.getApplicationInfo(pkgName, 0);
+ } catch (NameNotFoundException e) {
+ Log.w(TAG, "Ignoring non-existent package:"+pkgName);
+ return;
+ }
+ if(info == null) {
+ // Nothing to do log error message and return
+ Log.i(TAG, "Null ApplicationInfo for package:"+pkgName);
+ return;
+ }
+ // Binary search returns a negative index (ie --index) of the position where
+ // this might be inserted.
+ int newIdx = Collections.binarySearch(mAppLocalList, info,
+ getAppComparator(mSortOrder));
+ if(newIdx >= 0) {
+ Log.i(TAG, "Strange. Package:"+pkgName+" is not new");
+ return;
+ }
+ // New entry
+ newIdx = -newIdx-1;
+ mAppLocalList.add(newIdx, info);
+ mAppPropMap.put(info.packageName, new AppInfo(pkgName, newIdx,
+ info.loadLabel(mPm), info.loadIcon(mPm), ps));
+ adjustIndex();
+ notifyDataSetChanged();
+ }
+
+ public void removeFromList(List<String> pkgNames) {
+ if(pkgNames == null) {
+ Log.w(TAG, "Removing null pkg list from List Adapter");
+ return;
+ }
+ int imax = mAppLocalList.size();
+ boolean found = false;
+ ApplicationInfo info;
+ int i, k;
+ String pkgName;
+ int kmax = pkgNames.size();
+ if(kmax <= 0) {
+ Log.w(TAG, "Removing empty pkg list from List Adapter");
+ return;
+ }
+ int idxArr[] = new int[kmax];
+ for (k = 0; k < kmax; k++) {
+ idxArr[k] = -1;
+ }
+ for (i = 0; i < imax; i++) {
+ info = mAppLocalList.get(i);
+ for (k = 0; k < kmax; k++) {
+ pkgName = pkgNames.get(k);
+ if (info.packageName.equalsIgnoreCase(pkgName)) {
+ idxArr[k] = i;
+ found = true;
+ break;
+ }
+ }
+ }
+ // Sort idxArr
+ Arrays.sort(idxArr);
+ // remove the packages based on decending indices
+ for (k = kmax-1; k >= 0; k--) {
+ // Check if package has been found in the list of existing apps first
+ if(idxArr[k] == -1) {
+ break;
+ }
+ info = mAppLocalList.get(idxArr[k]);
+ mAppLocalList.remove(idxArr[k]);
+ mAppPropMap.remove(info.packageName);
+ if (localLOGV) Log.i(TAG, "Removed pkg:"+info.packageName+ " list");
+ }
+ if (found) {
+ adjustIndex();
+ notifyDataSetChanged();
+ }
+ }
+
+ public void updateAppSize(String pkgName, PackageStats ps) {
+ if(pkgName == null) {
+ return;
+ }
+ AppInfo entry = mAppPropMap.get(pkgName);
+ if (entry == null) {
+ Log.w(TAG, "Entry for package:"+pkgName+"doesnt exist in map");
+ return;
+ }
+ // Copy the index into the newly updated entry
+ entry.setSize(ps);
+ notifyDataSetChanged();
+ }
+
+ public PackageStats getAppStats(String pkgName) {
+ if(pkgName == null) {
+ return null;
+ }
+ AppInfo entry = mAppPropMap.get(pkgName);
+ if (entry == null) {
+ return null;
+ }
+ return entry.appStats;
+ }
+ }
+
+ /*
+ * Utility method to clear messages to Handler
+ * We need'nt synchronize on the Handler since posting messages is guaranteed
+ * to be thread safe. Even if the other thread that retrieves package sizes
+ * posts a message, we do a cursory check of validity on mAppInfoAdapter's applist
+ */
+ private void clearMessagesInHandler() {
+ mHandler.removeMessages(INIT_PKG_INFO);
+ mHandler.removeMessages(COMPUTE_PKG_SIZE_DONE);
+ mHandler.removeMessages(REMOVE_PKG);
+ mHandler.removeMessages(REORDER_LIST);
+ mHandler.removeMessages(ADD_PKG_START);
+ mHandler.removeMessages(ADD_PKG_DONE);
+ }
+
+ private void sendMessageToHandler(int msgId, int arg1) {
+ Message msg = mHandler.obtainMessage(msgId);
+ msg.arg1 = arg1;
+ mHandler.sendMessage(msg);
+ }
+
+ private void sendMessageToHandler(int msgId, Bundle data) {
+ Message msg = mHandler.obtainMessage(msgId);
+ msg.setData(data);
+ mHandler.sendMessage(msg);
+ }
+
+ private void sendMessageToHandler(int msgId) {
+ mHandler.sendEmptyMessage(msgId);
+ }
+
+ /*
+ * Stats Observer class used to compute package sizes and retrieve size information
+ * PkgSizeOberver is the call back thats used when invoking getPackageSizeInfo on
+ * PackageManager. The values in call back onGetStatsCompleted are validated
+ * and the specified message is passed to mHandler. The package name
+ * and the AppInfo object corresponding to the package name are set on the message
+ */
+ class PkgSizeObserver extends IPackageStatsObserver.Stub {
+ private ApplicationInfo mAppInfo;
+ private int mMsgId;
+ public void onGetStatsCompleted(PackageStats pStats, boolean pSucceeded) {
+ if(DEBUG_PKG_DELAY) {
+ try {
+ Thread.sleep(10*1000);
+ } catch (InterruptedException e) {
+ }
+ }
+ AppInfo appInfo = null;
+ Bundle data = new Bundle();
+ data.putString(ATTR_PKG_NAME, mAppInfo.packageName);
+ if(pSucceeded && pStats != null) {
+ if (localLOGV) Log.i(TAG, "onGetStatsCompleted::"+pStats.packageName+", ("+
+ pStats.cacheSize+","+
+ pStats.codeSize+", "+pStats.dataSize);
+ data.putParcelable(ATTR_APP_PKG_STATS, pStats);
+ } else {
+ Log.w(TAG, "Invalid package stats from PackageManager");
+ }
+ //post message to Handler
+ Message msg = mHandler.obtainMessage(mMsgId, data);
+ msg.setData(data);
+ mHandler.sendMessage(msg);
+ }
+
+ public void invokeGetSizeInfo(ApplicationInfo pAppInfo, int msgId) {
+ if(pAppInfo == null || pAppInfo.packageName == null) {
+ return;
+ }
+ if(localLOGV) Log.i(TAG, "Invoking getPackageSizeInfo for package:"+
+ pAppInfo.packageName);
+ mMsgId = msgId;
+ mAppInfo = pAppInfo;
+ mPm.getPackageSizeInfo(pAppInfo.packageName, this);
+ }
+ }
+
+ /**
+ * Receives notifications when applications are added/removed.
+ */
+ private class PackageIntentReceiver extends BroadcastReceiver {
+ void registerReceiver() {
+ IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
+ filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
+ filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
+ filter.addDataScheme("package");
+ ManageApplications.this.registerReceiver(this, filter);
+ }
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String actionStr = intent.getAction();
+ Uri data = intent.getData();
+ String pkgName = data.getEncodedSchemeSpecificPart();
+ if (localLOGV) Log.i(TAG, "action:"+actionStr+", for package:"+pkgName);
+ updatePackageList(actionStr, pkgName);
+ }
+ }
+
+ private void updatePackageList(String actionStr, String pkgName) {
+ // technically we dont have to invoke handler since onReceive is invoked on
+ // the main thread but doing it here for better clarity
+ if (Intent.ACTION_PACKAGE_ADDED.equalsIgnoreCase(actionStr)) {
+ Bundle data = new Bundle();
+ data.putString(ATTR_PKG_NAME, pkgName);
+ sendMessageToHandler(ADD_PKG_START, data);
+ } else if (Intent.ACTION_PACKAGE_REMOVED.equalsIgnoreCase(actionStr)) {
+ Bundle data = new Bundle();
+ data.putString(ATTR_PKG_NAME, pkgName);
+ sendMessageToHandler(REMOVE_PKG, data);
+ }
+ }
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Intent lIntent = getIntent();
+ String action = lIntent.getAction();
+ if (action.equals(Intent.ACTION_MANAGE_PACKAGE_STORAGE)) {
+ mSortOrder = SORT_ORDER_SIZE;
+ mSizesFirst = true;
+ }
+ mPm = getPackageManager();
+ // initialize some window features
+ requestWindowFeature(Window.FEATURE_RIGHT_ICON);
+ requestWindowFeature(Window.FEATURE_PROGRESS);
+ requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
+ setContentView(R.layout.compute_sizes);
+ mDefaultAppIcon =Resources.getSystem().getDrawable(
+ com.android.internal.R.drawable.sym_def_app_icon);
+ mInvalidSizeStr = getText(R.string.invalid_size_value);
+ mComputingSizeStr = getText(R.string.computing_size);
+ // initialize the inflater
+ mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ mReceiver = new PackageIntentReceiver();
+ mEmptyView = (TextView) findViewById(R.id.empty_view);
+ mObserver = new PkgSizeObserver();
+ // Create adapter and list view here
+ List<ApplicationInfo> appList = getInstalledApps(mSortOrder);
+ mAppInfoAdapter = new AppInfoAdapter(this, appList);
+ ListView lv= (ListView) findViewById(android.R.id.list);
+ //lv.setAdapter(mAppInfoAdapter);
+ lv.setOnItemClickListener(this);
+ lv.setSaveEnabled(true);
+ lv.setItemsCanFocus(true);
+ lv.setOnItemClickListener(this);
+ mListView = lv;
+ showLoadingMsg();
+ }
+
+ @Override
+ public Dialog onCreateDialog(int id) {
+ if (id == DLG_LOADING) {
+ ProgressDialog dlg = new ProgressDialog(this);
+ dlg.setProgressStyle(ProgressDialog.STYLE_SPINNER);
+ dlg.setMessage(getText(R.string.loading));
+ dlg.setIndeterminate(true);
+ dlg.setOnCancelListener(this);
+ return dlg;
+ }
+ return null;
+ }
+
+
+ private void showLoadingMsg() {
+ showDialog(DLG_LOADING);
+ if(localLOGV) Log.i(TAG, "Displaying Loading message");
+ }
+
+ private void dismissLoadingMsg() {
+ if(localLOGV) Log.i(TAG, "Dismissing Loading message");
+ dismissDialog(DLG_LOADING);
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ // Create a thread to load resources
+ mResourceThread = new ResourceLoaderThread();
+ sendMessageToHandler(INIT_PKG_INFO);
+ // register receiver
+ mReceiver.registerReceiver();
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+ // clear all messages related to application list
+ clearMessagesInHandler();
+ // register receiver here
+ unregisterReceiver(mReceiver);
+ mAppPropCache = mAppInfoAdapter.mAppPropMap;
+ }
+
+ // Avoid the restart and pause when orientation changes
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ }
+
+ /*
+ * comparator class used to sort AppInfo objects based on size
+ */
+ public static class AppInfoComparator implements Comparator<ApplicationInfo> {
+ public AppInfoComparator(Map<String, AppInfo> pAppPropMap) {
+ mAppPropMap= pAppPropMap;
+ }
+
+ public final int compare(ApplicationInfo a, ApplicationInfo b) {
+ AppInfo ainfo = mAppPropMap.get(a.packageName);
+ AppInfo binfo = mAppPropMap.get(b.packageName);
+ long atotal = ainfo.getTotalSize();
+ long btotal = binfo.getTotalSize();
+ long ret = atotal - btotal;
+ // negate result to sort in descending order
+ if (ret < 0) {
+ return 1;
+ }
+ if (ret == 0) {
+ return 0;
+ }
+ return -1;
+ }
+ private Map<String, AppInfo> mAppPropMap;
+ }
+
+ // utility method used to start sub activity
+ private void startApplicationDetailsActivity() {
+ // Create intent to start new activity
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setClass(this, InstalledAppDetails.class);
+ intent.putExtra(APP_PKG_NAME, mCurrentPkgName);
+ // start new activity to display extended information
+ startActivityForResult(intent, INSTALLED_APP_DETAILS);
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ menu.add(0, SORT_ORDER_ALPHA, 1, R.string.sort_order_alpha)
+ .setIcon(android.R.drawable.ic_menu_sort_alphabetically);
+ menu.add(0, SORT_ORDER_SIZE, 2, R.string.sort_order_size)
+ .setIcon(android.R.drawable.ic_menu_sort_by_size);
+ menu.add(0, FILTER_OPTIONS, 3, R.string.filter)
+ .setIcon(R.drawable.ic_menu_filter_settings);
+ return true;
+ }
+
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ if (mFirst) {
+ menu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA);
+ menu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE);
+ menu.findItem(FILTER_OPTIONS).setVisible(true);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ int menuId = item.getItemId();
+ if ((menuId == SORT_ORDER_ALPHA) || (menuId == SORT_ORDER_SIZE)) {
+ sendMessageToHandler(REORDER_LIST, menuId);
+ } else if (menuId == FILTER_OPTIONS) {
+ if (mAlertDlg == null) {
+ mAlertDlg = new AlertDialog.Builder(this).
+ setTitle(R.string.filter_dlg_title).
+ setNeutralButton(R.string.cancel, this).
+ setSingleChoiceItems(new CharSequence[] {getText(R.string.filter_apps_all),
+ getText(R.string.filter_apps_running),
+ getText(R.string.filter_apps_third_party)},
+ -1, this).
+ create();
+ }
+ mAlertDlg.show();
+ }
+ return true;
+ }
+
+ public void onItemClick(AdapterView<?> parent, View view, int position,
+ long id) {
+ ApplicationInfo info = (ApplicationInfo)mAppInfoAdapter.getItem(position);
+ mCurrentPkgName = info.packageName;
+ startApplicationDetailsActivity();
+ }
+
+ // Finish the activity if the user presses the back button to cancel the activity
+ public void onCancel(DialogInterface dialog) {
+ finish();
+ }
+
+ public void onClick(DialogInterface dialog, int which) {
+ int newOption;
+ switch (which) {
+ // Make sure that values of 0, 1, 2 match options all, running, third_party when
+ // created via the AlertDialog.Builder
+ case 0:
+ newOption = FILTER_APPS_ALL;
+ break;
+ case 1:
+ newOption = FILTER_APPS_RUNNING;
+ break;
+ case 2:
+ newOption = FILTER_APPS_THIRD_PARTY;
+ break;
+ default:
+ return;
+ }
+ mAlertDlg.dismiss();
+ sendMessageToHandler(REORDER_LIST, newOption);
+ }
+}
diff --git a/src/com/android/settings/MasterClear.java b/src/com/android/settings/MasterClear.java
new file mode 100644
index 0000000..38ad608
--- /dev/null
+++ b/src/com/android/settings/MasterClear.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import com.android.internal.widget.LockPatternUtils;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.ICheckinService;
+import android.os.ServiceManager;
+import android.os.SystemProperties;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+
+/**
+ * Confirm and execute a reset of the device to a clean "just out of the box"
+ * state. Multiple confirmations are required: first, a general "are you sure
+ * you want to do this?" prompt, followed by a keyguard pattern trace if the user
+ * has defined one, followed by a final strongly-worded "THIS WILL ERASE EVERYTHING
+ * ON THE PHONE" prompt. If at any time the phone is allowed to go to sleep, is
+ * locked, et cetera, then the confirmation sequence is abandoned.
+ */
+public class MasterClear extends Activity {
+
+ private static final int KEYGUARD_REQUEST = 55;
+
+ private LayoutInflater mInflater;
+ private LockPatternUtils mLockUtils;
+
+ private View mInitialView;
+ private Button mInitiateButton;
+
+ private View mFinalView;
+ private Button mFinalButton;
+
+ /**
+ * The user has gone through the multiple confirmation, so now we go ahead
+ * and invoke the Checkin Service to reset the device to its factory-default
+ * state (rebooting in the process).
+ */
+ private Button.OnClickListener mFinalClickListener = new Button.OnClickListener() {
+ public void onClick(View v) {
+
+ // Those monkeys kept committing suicide, so we add this property
+ // to disable going through with the master clear
+ if (!TextUtils.isEmpty(SystemProperties.get("ro.monkey"))) {
+ return;
+ }
+
+ ICheckinService service =
+ ICheckinService.Stub.asInterface(ServiceManager.getService("checkin"));
+ if (service != null) {
+ try {
+ // This RPC should never return
+ service.masterClear();
+ } catch (android.os.RemoteException e) {
+ // Intentionally blank - there's nothing we can do here
+ Log.w("MasterClear", "Unable to invoke ICheckinService.masterClear()");
+ }
+ } else {
+ Log.w("MasterClear", "Unable to locate ICheckinService");
+ }
+
+ /* If we reach this point, the master clear didn't happen -- the
+ * service might have been unregistered with the ServiceManager,
+ * the RPC might have thrown an exception, or for some reason
+ * the implementation of masterClear() may have returned instead
+ * of resetting the device.
+ */
+ new AlertDialog.Builder(MasterClear.this)
+ .setMessage(getText(R.string.master_clear_failed))
+ .setPositiveButton(getText(android.R.string.ok), null)
+ .show();
+ }
+ };
+
+ /**
+ * Keyguard validation is run using the standard {@link ConfirmLockPattern}
+ * component as a subactivity
+ */
+ private void runKeyguardConfirmation() {
+ final Intent intent = new Intent();
+ intent.setClassName("com.android.settings",
+ "com.android.settings.ConfirmLockPattern");
+ // supply header and footer text in the intent
+ intent.putExtra(ConfirmLockPattern.HEADER_TEXT,
+ getText(R.string.master_clear_gesture_prompt));
+ intent.putExtra(ConfirmLockPattern.FOOTER_TEXT,
+ getText(R.string.master_clear_gesture_explanation));
+ startActivityForResult(intent, KEYGUARD_REQUEST);
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+
+ if (requestCode != KEYGUARD_REQUEST) {
+ return;
+ }
+
+ // If the user entered a valid keyguard trace, present the final
+ // confirmation prompt; otherwise, go back to the initial state.
+ if (resultCode == Activity.RESULT_OK) {
+ establishFinalConfirmationState();
+ } else {
+ establishInitialState();
+ }
+ }
+
+ /**
+ * If the user clicks to begin the reset sequence, we next require a
+ * keyguard confirmation if the user has currently enabled one. If there
+ * is no keyguard available, we simply go to the final confirmation prompt.
+ */
+ private Button.OnClickListener mInitiateListener = new Button.OnClickListener() {
+ public void onClick(View v) {
+ if (mLockUtils.isLockPatternEnabled()) {
+ runKeyguardConfirmation();
+ } else {
+ establishFinalConfirmationState();
+ }
+ }
+ };
+
+ /**
+ * Configure the UI for the final confirmation interaction
+ */
+ private void establishFinalConfirmationState() {
+ if (mFinalView == null) {
+ mFinalView = mInflater.inflate(R.layout.master_clear_final, null);
+ mFinalButton =
+ (Button) mFinalView.findViewById(R.id.execute_master_clear);
+ mFinalButton.setOnClickListener(mFinalClickListener);
+ }
+
+ setContentView(mFinalView);
+ }
+
+ /**
+ * In its initial state, the activity presents a button for the user to
+ * click in order to initiate a confirmation sequence. This method is
+ * called from various other points in the code to reset the activity to
+ * this base state.
+ *
+ * <p>Reinflating views from resources is expensive and prevents us from
+ * caching widget pointers, so we use a single-inflate pattern: we lazy-
+ * inflate each view, caching all of the widget pointers we'll need at the
+ * time, then simply reuse the inflated views directly whenever we need
+ * to change contents.
+ */
+ private void establishInitialState() {
+ if (mInitialView == null) {
+ mInitialView = mInflater.inflate(R.layout.master_clear_primary, null);
+ mInitiateButton =
+ (Button) mInitialView.findViewById(R.id.initiate_master_clear);
+ mInitiateButton.setOnClickListener(mInitiateListener);
+ }
+
+ setContentView(mInitialView);
+ }
+
+ @Override
+ protected void onCreate(Bundle savedState) {
+ super.onCreate(savedState);
+
+ mInitialView = null;
+ mFinalView = null;
+ mInflater = LayoutInflater.from(this);
+ mLockUtils = new LockPatternUtils(getContentResolver());
+
+ establishInitialState();
+ }
+
+ /** Abandon all progress through the confirmation sequence by returning
+ * to the initial view any time the activity is interrupted (e.g. by
+ * idle timeout).
+ */
+ @Override
+ public void onPause() {
+ super.onPause();
+
+ establishInitialState();
+ }
+
+}
diff --git a/src/com/android/settings/MediaFormat.java b/src/com/android/settings/MediaFormat.java
new file mode 100644
index 0000000..3594572
--- /dev/null
+++ b/src/com/android/settings/MediaFormat.java
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import com.android.internal.widget.LockPatternUtils;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.IMountService;
+import android.os.ServiceManager;
+import android.os.SystemProperties;
+import android.os.Environment;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+
+/**
+ * Confirm and execute a format of the sdcard.
+ * Multiple confirmations are required: first, a general "are you sure
+ * you want to do this?" prompt, followed by a keyguard pattern trace if the user
+ * has defined one, followed by a final strongly-worded "THIS WILL ERASE EVERYTHING
+ * ON THE SD CARD" prompt. If at any time the phone is allowed to go to sleep, is
+ * locked, et cetera, then the confirmation sequence is abandoned.
+ */
+public class MediaFormat extends Activity {
+
+ private static final int KEYGUARD_REQUEST = 55;
+
+ private LayoutInflater mInflater;
+ private LockPatternUtils mLockUtils;
+
+ private View mInitialView;
+ private Button mInitiateButton;
+
+ private View mFinalView;
+ private Button mFinalButton;
+
+ /**
+ * The user has gone through the multiple confirmation, so now we go ahead
+ * and invoke the Mount Service to format the SD card.
+ */
+ private Button.OnClickListener mFinalClickListener = new Button.OnClickListener() {
+ public void onClick(View v) {
+
+ // Those monkeys kept committing suicide, so we add this property
+ // to disable going through with the format
+ if (!TextUtils.isEmpty(SystemProperties.get("ro.monkey"))) {
+ return;
+ }
+ IMountService service =
+ IMountService.Stub.asInterface(ServiceManager.getService("mount"));
+ if (service != null) {
+ try {
+ service.formatMedia(Environment.getExternalStorageDirectory().toString());
+ } catch (android.os.RemoteException e) {
+ // Intentionally blank - there's nothing we can do here
+ Log.w("MediaFormat", "Unable to invoke IMountService.formatMedia()");
+ }
+ } else {
+ Log.w("MediaFormat", "Unable to locate IMountService");
+ }
+ finish();
+ }
+ };
+
+ /**
+ * Keyguard validation is run using the standard {@link ConfirmLockPattern}
+ * component as a subactivity
+ */
+ private void runKeyguardConfirmation() {
+ final Intent intent = new Intent();
+ intent.setClassName("com.android.settings",
+ "com.android.settings.ConfirmLockPattern");
+ // supply header and footer text in the intent
+ intent.putExtra(ConfirmLockPattern.HEADER_TEXT,
+ getText(R.string.media_format_gesture_prompt));
+ intent.putExtra(ConfirmLockPattern.FOOTER_TEXT,
+ getText(R.string.media_format_gesture_explanation));
+ startActivityForResult(intent, KEYGUARD_REQUEST);
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+
+ if (requestCode != KEYGUARD_REQUEST) {
+ return;
+ }
+
+ // If the user entered a valid keyguard trace, present the final
+ // confirmation prompt; otherwise, go back to the initial state.
+ if (resultCode == Activity.RESULT_OK) {
+ establishFinalConfirmationState();
+ } else {
+ establishInitialState();
+ }
+ }
+
+ /**
+ * If the user clicks to begin the reset sequence, we next require a
+ * keyguard confirmation if the user has currently enabled one. If there
+ * is no keyguard available, we simply go to the final confirmation prompt.
+ */
+ private Button.OnClickListener mInitiateListener = new Button.OnClickListener() {
+ public void onClick(View v) {
+ if (mLockUtils.isLockPatternEnabled()) {
+ runKeyguardConfirmation();
+ } else {
+ establishFinalConfirmationState();
+ }
+ }
+ };
+
+ /**
+ * Configure the UI for the final confirmation interaction
+ */
+ private void establishFinalConfirmationState() {
+ if (mFinalView == null) {
+ mFinalView = mInflater.inflate(R.layout.media_format_final, null);
+ mFinalButton =
+ (Button) mFinalView.findViewById(R.id.execute_media_format);
+ mFinalButton.setOnClickListener(mFinalClickListener);
+ }
+
+ setContentView(mFinalView);
+ }
+
+ /**
+ * In its initial state, the activity presents a button for the user to
+ * click in order to initiate a confirmation sequence. This method is
+ * called from various other points in the code to reset the activity to
+ * this base state.
+ *
+ * <p>Reinflating views from resources is expensive and prevents us from
+ * caching widget pointers, so we use a single-inflate pattern: we lazy-
+ * inflate each view, caching all of the widget pointers we'll need at the
+ * time, then simply reuse the inflated views directly whenever we need
+ * to change contents.
+ */
+ private void establishInitialState() {
+ if (mInitialView == null) {
+ mInitialView = mInflater.inflate(R.layout.media_format_primary, null);
+ mInitiateButton =
+ (Button) mInitialView.findViewById(R.id.initiate_media_format);
+ mInitiateButton.setOnClickListener(mInitiateListener);
+ }
+
+ setContentView(mInitialView);
+ }
+
+ @Override
+ protected void onCreate(Bundle savedState) {
+ super.onCreate(savedState);
+
+ mInitialView = null;
+ mFinalView = null;
+ mInflater = LayoutInflater.from(this);
+ mLockUtils = new LockPatternUtils(getContentResolver());
+
+ establishInitialState();
+ }
+
+ /** Abandon all progress through the confirmation sequence by returning
+ * to the initial view any time the activity is interrupted (e.g. by
+ * idle timeout).
+ */
+ @Override
+ public void onPause() {
+ super.onPause();
+
+ establishInitialState();
+ }
+
+}
diff --git a/src/com/android/settings/ProgressCategory.java b/src/com/android/settings/ProgressCategory.java
new file mode 100644
index 0000000..15810b3
--- /dev/null
+++ b/src/com/android/settings/ProgressCategory.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.content.Context;
+import android.preference.PreferenceCategory;
+import android.util.AttributeSet;
+import android.view.View;
+
+import java.util.Map;
+
+public class ProgressCategory extends PreferenceCategory {
+
+ private boolean mProgress = false;
+
+ public ProgressCategory(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ setLayoutResource(R.layout.preference_progress_category);
+ }
+
+ @Override
+ public void onBindView(View view) {
+ super.onBindView(view);
+ View textView = view.findViewById(R.id.scanning_text);
+ View progressBar = view.findViewById(R.id.scanning_progress);
+
+ int visibility = mProgress ? View.VISIBLE : View.INVISIBLE;
+ textView.setVisibility(visibility);
+ progressBar.setVisibility(visibility);
+ }
+
+ /**
+ * Turn on/off the progress indicator and text on the right.
+ * @param progressOn whether or not the progress should be displayed
+ */
+ public void setProgress(boolean progressOn) {
+ mProgress = progressOn;
+ notifyChanged();
+ }
+}
+
diff --git a/src/com/android/settings/ProxySelector.java b/src/com/android/settings/ProxySelector.java
new file mode 100644
index 0000000..80fe3c9
--- /dev/null
+++ b/src/com/android/settings/ProxySelector.java
@@ -0,0 +1,260 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.ContentResolver;
+import android.content.Intent;
+import android.net.Proxy;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.text.Selection;
+import android.text.Spannable;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.View.OnFocusChangeListener;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * To start the Proxy Selector activity, create the following intent.
+ *
+ * <code>
+ * Intent intent = new Intent();
+ * intent.setClassName("com.android.browser.ProxySelector");
+ * startActivity(intent);
+ * </code>
+ *
+ * you can add extra options to the intent by using
+ *
+ * <code>
+ * intent.putExtra(key, value);
+ * </code>
+ *
+ * the extra options are:
+ *
+ * button-label: a string label to display for the okay button
+ * title: the title of the window
+ * error-text: If not null, will be used as the label of the error message.
+ */
+public class ProxySelector extends Activity
+{
+ private final static String LOGTAG = "Settings";
+
+ EditText mHostnameField;
+ EditText mPortField;
+ Button mOKButton;
+
+ // Matches blank input, ips, and domain names
+ private static final String HOSTNAME_REGEXP = "^$|^[a-zA-Z0-9]+(\\-[a-zA-Z0-9]+)*(\\.[a-zA-Z0-9]+(\\-[a-zA-Z0-9]+)*)*$";
+ private static final Pattern HOSTNAME_PATTERN;
+ static {
+ HOSTNAME_PATTERN = Pattern.compile(HOSTNAME_REGEXP);
+ }
+
+
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ if (android.util.Config.LOGV) Log.v(LOGTAG, "[ProxySelector] onStart");
+
+ setContentView(R.layout.proxy);
+ initView();
+ populateFields(false);
+ }
+
+ protected void showError(int error) {
+
+ new AlertDialog.Builder(this)
+ .setTitle(R.string.proxy_error)
+ .setMessage(error)
+ .setPositiveButton(R.string.proxy_error_dismiss, null)
+ .show();
+ }
+
+ void initView() {
+
+ mHostnameField = (EditText)findViewById(R.id.hostname);
+ mHostnameField.setOnFocusChangeListener(mOnFocusChangeHandler);
+
+ mPortField = (EditText)findViewById(R.id.port);
+ mPortField.setOnClickListener(mOKHandler);
+ mPortField.setOnFocusChangeListener(mOnFocusChangeHandler);
+
+ mOKButton = (Button)findViewById(R.id.action);
+ mOKButton.setOnClickListener(mOKHandler);
+
+ Button b = (Button)findViewById(R.id.clear);
+ b.setOnClickListener(mClearHandler);
+
+ b = (Button)findViewById(R.id.defaultView);
+ b.setOnClickListener(mDefaultHandler);
+ }
+
+ void populateFields(boolean useDefault) {
+ String hostname = null;
+ int port = -1;
+ if (useDefault) {
+ // Use the default proxy settings provided by the carrier
+ hostname = Proxy.getDefaultHost();
+ port = Proxy.getDefaultPort();
+ } else {
+ // Use the last setting given by the user
+ hostname = Proxy.getHost(this);
+ port = Proxy.getPort(this);
+ }
+
+ if (hostname == null) {
+ hostname = "";
+ }
+
+ mHostnameField.setText(hostname);
+
+ String portStr = port == -1 ? "" : Integer.toString(port);
+ mPortField.setText(portStr);
+
+ Intent intent = getIntent();
+
+ String buttonLabel = intent.getStringExtra("button-label");
+ if (!TextUtils.isEmpty(buttonLabel)) {
+ mOKButton.setText(buttonLabel);
+ }
+
+ String title = intent.getStringExtra("title");
+ if (!TextUtils.isEmpty(title)) {
+ setTitle(title);
+ }
+ }
+
+ /**
+ * validate syntax of hostname and port entries
+ * @return 0 on success, string resource ID on failure
+ */
+ int validate(String hostname, String port) {
+ Matcher match = HOSTNAME_PATTERN.matcher(hostname);
+
+ if (!match.matches()) return R.string.proxy_error_invalid_host;
+
+ if (hostname.length() > 0 && port.length() == 0) {
+ return R.string.proxy_error_empty_port;
+ }
+
+ if (port.length() > 0) {
+ if (hostname.length() == 0) {
+ return R.string.proxy_error_empty_host_set_port;
+ }
+ int portVal = -1;
+ try {
+ portVal = Integer.parseInt(port);
+ } catch (NumberFormatException ex) {
+ return R.string.proxy_error_invalid_port;
+ }
+ if (portVal <= 0 || portVal > 0xFFFF) {
+ return R.string.proxy_error_invalid_port;
+ }
+ }
+ return 0;
+ }
+
+ /**
+ * returns true on success, false if the user must correct something
+ */
+ boolean saveToDb() {
+
+ String hostname = mHostnameField.getText().toString().trim();
+ String portStr = mPortField.getText().toString().trim();
+ int port = -1;
+
+ int result = validate(hostname, portStr);
+ if (result > 0) {
+ showError(result);
+ return false;
+ }
+
+ if (portStr.length() > 0) {
+ try {
+ port = Integer.parseInt(portStr);
+ } catch (NumberFormatException ex) {
+ return false;
+ }
+ }
+
+ // FIXME: The best solution would be to make a better UI that would
+ // disable editing of the text boxes if the user chooses to use the
+ // default settings. i.e. checking a box to always use the default
+ // carrier. http:/b/issue?id=756480
+ // FIXME: This currently will not work if the default host is blank and
+ // the user has cleared the input boxes in order to not use a proxy.
+ // This is a UI problem and can be solved with some better form
+ // controls.
+ // FIXME: If the user types in a proxy that matches the default, should
+ // we keep that setting? Can be fixed with a new UI.
+ ContentResolver res = getContentResolver();
+ if (hostname.equals(Proxy.getDefaultHost())
+ && port == Proxy.getDefaultPort()) {
+ // If the user hit the default button and didn't change any of
+ // the input boxes, treat it as if the user has not specified a
+ // proxy.
+ hostname = null;
+ }
+
+ if (!TextUtils.isEmpty(hostname)) {
+ hostname += ':' + portStr;
+ }
+ Settings.Secure.putString(res, Settings.Secure.HTTP_PROXY, hostname);
+ sendBroadcast(new Intent(Proxy.PROXY_CHANGE_ACTION));
+
+ return true;
+ }
+
+ OnClickListener mOKHandler = new OnClickListener() {
+ public void onClick(View v) {
+ if (saveToDb()) {
+ finish();
+ }
+ }
+ };
+
+ OnClickListener mClearHandler = new OnClickListener() {
+ public void onClick(View v) {
+ mHostnameField.setText("");
+ mPortField.setText("");
+ }
+ };
+
+ OnClickListener mDefaultHandler = new OnClickListener() {
+ public void onClick(View v) {
+ populateFields(true);
+ }
+ };
+
+ OnFocusChangeListener mOnFocusChangeHandler = new OnFocusChangeListener() {
+ public void onFocusChange(View v, boolean hasFocus) {
+ if (hasFocus) {
+ TextView textView = (TextView) v;
+ Selection.selectAll((Spannable) textView.getText());
+ }
+ }
+ };
+}
diff --git a/src/com/android/settings/RadioInfo.java b/src/com/android/settings/RadioInfo.java
new file mode 100644
index 0000000..dbad45d
--- /dev/null
+++ b/src/com/android/settings/RadioInfo.java
@@ -0,0 +1,1184 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.res.Resources;
+import android.net.Uri;
+import android.os.AsyncResult;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.INetStatService;
+import android.os.Message;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.SystemProperties;
+import android.preference.PreferenceManager;
+import android.telephony.CellLocation;
+import android.telephony.PhoneStateListener;
+import android.telephony.ServiceState;
+import android.telephony.TelephonyManager;
+import android.telephony.NeighboringCellInfo;
+import android.telephony.gsm.GsmCellLocation;
+import android.text.format.DateUtils;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.Spinner;
+import android.widget.TextView;
+import android.widget.EditText;
+
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.PhoneStateIntentReceiver;
+import com.android.internal.telephony.TelephonyProperties;
+import com.android.internal.telephony.gsm.GSMPhone;
+import com.android.internal.telephony.gsm.PdpConnection;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.DefaultHttpClient;
+
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class RadioInfo extends Activity {
+ private final String TAG = "phone";
+
+ private static final int EVENT_PHONE_STATE_CHANGED = 100;
+ private static final int EVENT_SIGNAL_STRENGTH_CHANGED = 200;
+ private static final int EVENT_SERVICE_STATE_CHANGED = 300;
+ private static final int EVENT_CFI_CHANGED = 302;
+
+ private static final int EVENT_QUERY_PREFERRED_TYPE_DONE = 1000;
+ private static final int EVENT_SET_PREFERRED_TYPE_DONE = 1001;
+ private static final int EVENT_QUERY_NEIGHBORING_CIDS_DONE = 1002;
+ private static final int EVENT_SET_QXDMLOG_DONE = 1003;
+ private static final int EVENT_SET_CIPHER_DONE = 1004;
+ private static final int EVENT_QUERY_SMSC_DONE = 1005;
+ private static final int EVENT_UPDATE_SMSC_DONE = 1006;
+
+ private static final int MENU_ITEM_SELECT_BAND = 0;
+ private static final int MENU_ITEM_VIEW_ADN = 1;
+ private static final int MENU_ITEM_VIEW_FDN = 2;
+ private static final int MENU_ITEM_VIEW_SDN = 3;
+ private static final int MENU_ITEM_GET_PDP_LIST = 4;
+ 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 number;
+ private TextView callState;
+ private TextView operatorName;
+ private TextView roamingState;
+ private TextView gsmState;
+ private TextView gprsState;
+ private TextView network;
+ private TextView dBm;
+ private TextView mMwi;
+ private TextView mCfi;
+ private TextView mLocation;
+ private TextView mNeighboringCids;
+ private TextView resets;
+ private TextView attempts;
+ private TextView successes;
+ private TextView disconnects;
+ private TextView sentSinceReceived;
+ private TextView sent;
+ private TextView received;
+ private TextView mPingIpAddr;
+ private TextView mPingHostname;
+ private TextView mHttpClientTest;
+ private TextView cipherState;
+ private TextView dnsCheckState;
+ private EditText smsc;
+ private Button radioPowerButton;
+ private Button qxdmLogButton;
+ private Button cipherToggleButton;
+ private Button dnsCheckToggleButton;
+ private Button pingTestButton;
+ private Button updateSmscButton;
+ private Button refreshSmscButton;
+ private Spinner preferredNetworkType;
+
+ private TelephonyManager mTelephonyManager;
+ private Phone phone = null;
+ private PhoneStateIntentReceiver mPhoneStateReceiver;
+ private INetStatService netstat;
+
+ private OemCommands mOem = null;
+ private boolean mQxdmLogEnabled;
+ // The requested cipher state
+ private boolean mCipherOn;
+
+ private String mPingIpAddrResult;
+ private String mPingHostnameResult;
+ private String mHttpClientTestResult;
+ private boolean mMwiValue = false;
+ private boolean mCfiValue = false;
+
+ private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
+ @Override
+ public void onDataConnectionStateChanged(int state) {
+ updateDataState();
+ updateDataStats();
+ updatePdpList();
+ updateNetworkType();
+ }
+
+ @Override
+ public void onDataActivity(int direction) {
+ updateDataStats2();
+ }
+
+ @Override
+ public void onCellLocationChanged(CellLocation location) {
+ updateLocation(location);
+ }
+
+ @Override
+ public void onMessageWaitingIndicatorChanged(boolean mwi) {
+ mMwiValue = mwi;
+ updateMessageWaiting();
+ }
+
+ @Override
+ public void onCallForwardingIndicatorChanged(boolean cfi) {
+ mCfiValue = cfi;
+ updateCallRedirect();
+ }
+ };
+
+ private Handler mHandler = new Handler() {
+ public void handleMessage(Message msg) {
+ AsyncResult ar;
+ switch (msg.what) {
+ case EVENT_PHONE_STATE_CHANGED:
+ updatePhoneState();
+ break;
+
+ case EVENT_SIGNAL_STRENGTH_CHANGED:
+ updateSignalStrength();
+ break;
+
+ case EVENT_SERVICE_STATE_CHANGED:
+ updateServiceState();
+ updatePowerState();
+ break;
+
+ case EVENT_QUERY_PREFERRED_TYPE_DONE:
+ ar= (AsyncResult) msg.obj;
+ if (ar.exception == null) {
+ int type = ((int[])ar.result)[0];
+ preferredNetworkType.setSelection(type, true);
+ } else {
+ preferredNetworkType.setSelection(3, true);
+ }
+ break;
+ case EVENT_SET_PREFERRED_TYPE_DONE:
+ ar= (AsyncResult) msg.obj;
+ if (ar.exception != null) {
+ phone.getPreferredNetworkType(
+ obtainMessage(EVENT_QUERY_PREFERRED_TYPE_DONE));
+ }
+ break;
+ case EVENT_QUERY_NEIGHBORING_CIDS_DONE:
+ ar= (AsyncResult) msg.obj;
+ if (ar.exception == null) {
+ updateNeighboringCids((ArrayList<NeighboringCellInfo>)ar.result);
+ } else {
+ mNeighboringCids.setText("unknown");
+ }
+ break;
+ case EVENT_SET_QXDMLOG_DONE:
+ ar= (AsyncResult) msg.obj;
+ if (ar.exception == null) {
+ mQxdmLogEnabled = !mQxdmLogEnabled;
+
+ updateQxdmState(mQxdmLogEnabled);
+ displayQxdmEnableResult();
+ }
+ break;
+ case EVENT_SET_CIPHER_DONE:
+ ar= (AsyncResult) msg.obj;
+ if (ar.exception == null) {
+ setCiphPref(mCipherOn);
+ }
+ updateCiphState();
+ break;
+ case EVENT_QUERY_SMSC_DONE:
+ ar= (AsyncResult) msg.obj;
+ if (ar.exception != null) {
+ smsc.setText("refresh error");
+ } else {
+ byte[] buf = (byte[]) ar.result;
+ smsc.setText(new String(buf));
+ }
+ break;
+ case EVENT_UPDATE_SMSC_DONE:
+ updateSmscButton.setEnabled(true);
+ ar= (AsyncResult) msg.obj;
+ if (ar.exception != null) {
+ smsc.setText("update error");
+ }
+ break;
+ default:
+ break;
+
+ }
+ }
+ };
+
+ private class OemCommands {
+
+ public final int OEM_QXDM_SDLOG_DEFAULT_FILE_SIZE = 32;
+ public final int OEM_QXDM_SDLOG_DEFAULT_MASK = 0;
+ public final int OEM_QXDM_SDLOG_DEFAULT_MAX_INDEX = 8;
+
+ final int SIZE_OF_INT = 4;
+ final int OEM_FEATURE_ENABLE = 1;
+ final int OEM_FEATURE_DISABLE = 0;
+ final int OEM_SIMPE_FEAUTURE_LEN = 1;
+
+ final int OEM_QXDM_SDLOG_FUNCTAG = 0x00010000;
+ final int OEM_QXDM_SDLOG_LEN = 4;
+ final int OEM_PS_AUTO_ATTACH_FUNCTAG = 0x00020000;
+ final int OEM_CIPHERING_FUNCTAG = 0x00020001;
+ final int OEM_SMSC_UPDATE_FUNCTAG = 0x00020002;
+ final int OEM_SMSC_QUERY_FUNCTAG = 0x00020003;
+ final int OEM_SMSC_QUERY_LEN = 0;
+
+ /**
+ * The OEM interface to store QXDM to SD.
+ *
+ * To start/stop logging QXDM logs to SD card, use tag
+ * OEM_RIL_HOOK_QXDM_SD_LOG_SETUP 0x00010000
+ *
+ * "data" is a const oem_ril_hook_qxdm_sdlog_setup_data_st *
+ * ((const oem_ril_hook_qxdm_sdlog_setup_data_st *)data)->head.func_tag
+ * should be OEM_RIL_HOOK_QXDM_SD_LOG_SETUP
+ * ((const oem_ril_hook_qxdm_sdlog_setup_data_st *)data)->head.len
+ * should be "sizeof(unsigned int) * 4"
+ * ((const oem_ril_hook_qxdm_sdlog_setup_data_st *)data)->mode
+ * could be 0 for 'stop logging', or 1 for 'start logging'
+ * ((const oem_ril_hook_qxdm_sdlog_setup_data_st *)data)->log_file_size
+ * will assign the size of each log file, and it could be a value between
+ * 1 and 512 (in megabytes, default value is recommended to set as 32).
+ * This value will be ignored when mode == 0.
+ * ((const oem_ril_hook_qxdm_sdlog_setup_data_st *)data)->log_mask will
+ * assign the rule to filter logs, and it is a bitmask (bit0 is for MsgAll,
+ * bit1 is for LogAll, and bit2 is for EventAll) recommended to be set as 0
+ * by default. This value will be ignored when mode == 0.
+ * ((const oem_ril_hook_qxdm_sdlog_setup_data_st *)data)->log_max_fileindex
+ * set the how many logfiles will storted before roll over. This value will
+ * be ignored when mode == 0.
+ *
+ * "response" is NULL
+ *
+ * typedef struct _oem_ril_hook_raw_head_st {
+ * unsigned int func_tag;
+ * unsigned int len;
+ * } oem_ril_hook_raw_head_st;
+ *
+ * typedef struct _oem_ril_hook_qxdm_sdlog_setup_data_st {
+ * oem_ril_hook_raw_head_st head;
+ * unsigned int mode;
+ * unsigned int log_file_size;
+ * unsigned int log_mask;
+ * unsigned int log_max_fileindex;
+ * } oem_ril_hook_qxdm_sdlog_setup_data_st;
+ *
+ * @param enable set true to start logging QXDM in SD card
+ * @param fileSize is the log file size in MB
+ * @param mask is the log mask to filter
+ * @param maxIndex is the maximum roll-over file number
+ * @return byteArray to use in RIL RAW command
+ */
+ byte[] getQxdmSdlogData(boolean enable, int fileSize, int mask, int maxIndex) {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ DataOutputStream dos = new DataOutputStream(bos);
+ try {
+ writeIntLittleEndian(dos, OEM_QXDM_SDLOG_FUNCTAG);
+ writeIntLittleEndian(dos, OEM_QXDM_SDLOG_LEN * SIZE_OF_INT);
+ writeIntLittleEndian(dos, enable ?
+ OEM_FEATURE_ENABLE : OEM_FEATURE_DISABLE);
+ writeIntLittleEndian(dos, fileSize);
+ writeIntLittleEndian(dos, mask);
+ writeIntLittleEndian(dos, maxIndex);
+ } catch (IOException e) {
+ return null;
+ }
+ return bos.toByteArray();
+ }
+
+ byte[] getSmscQueryData() {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ DataOutputStream dos = new DataOutputStream(bos);
+ try {
+ writeIntLittleEndian(dos, OEM_SMSC_QUERY_FUNCTAG);
+ writeIntLittleEndian(dos, OEM_SMSC_QUERY_LEN * SIZE_OF_INT);
+ } catch (IOException e) {
+ return null;
+ }
+ return bos.toByteArray();
+ }
+
+ byte[] getSmscUpdateData(String smsc) {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ DataOutputStream dos = new DataOutputStream(bos);
+ try {
+ byte[] smsc_bytes = smsc.getBytes();
+ writeIntLittleEndian(dos, OEM_SMSC_UPDATE_FUNCTAG);
+ writeIntLittleEndian(dos, smsc_bytes.length);
+ dos.write(smsc_bytes);
+ } catch (IOException e) {
+ return null;
+ }
+ return bos.toByteArray();
+ }
+
+ byte[] getPsAutoAttachData(boolean enable) {
+ return getSimpleFeatureData(OEM_PS_AUTO_ATTACH_FUNCTAG, enable);
+ }
+
+ byte[] getCipheringData(boolean enable) {
+ return getSimpleFeatureData(OEM_CIPHERING_FUNCTAG, enable);
+ }
+
+ private byte[] getSimpleFeatureData(int tag, boolean enable) {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ DataOutputStream dos = new DataOutputStream(bos);
+ try {
+ writeIntLittleEndian(dos, tag);
+ writeIntLittleEndian(dos, OEM_SIMPE_FEAUTURE_LEN * SIZE_OF_INT);
+ writeIntLittleEndian(dos, enable ?
+ OEM_FEATURE_ENABLE : OEM_FEATURE_DISABLE);
+ } catch (IOException e) {
+ return null;
+ }
+ return bos.toByteArray();
+ }
+
+ private void writeIntLittleEndian(DataOutputStream dos, int val)
+ throws IOException {
+ dos.writeByte(val);
+ dos.writeByte(val >> 8);
+ dos.writeByte(val >> 16);
+ dos.writeByte(val >> 24);
+ }
+ }
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ setContentView(R.layout.radio_info);
+
+ mTelephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
+ phone = PhoneFactory.getDefaultPhone();
+
+ mImei = (TextView) findViewById(R.id.imei);
+ number = (TextView) findViewById(R.id.number);
+ callState = (TextView) findViewById(R.id.call);
+ operatorName = (TextView) findViewById(R.id.operator);
+ roamingState = (TextView) findViewById(R.id.roaming);
+ gsmState = (TextView) findViewById(R.id.gsm);
+ gprsState = (TextView) findViewById(R.id.gprs);
+ network = (TextView) findViewById(R.id.network);
+ dBm = (TextView) findViewById(R.id.dbm);
+ mMwi = (TextView) findViewById(R.id.mwi);
+ mCfi = (TextView) findViewById(R.id.cfi);
+ mLocation = (TextView) findViewById(R.id.location);
+ mNeighboringCids = (TextView) findViewById(R.id.neighboring);
+
+ resets = (TextView) findViewById(R.id.resets);
+ attempts = (TextView) findViewById(R.id.attempts);
+ successes = (TextView) findViewById(R.id.successes);
+ disconnects = (TextView) findViewById(R.id.disconnects);
+ sentSinceReceived = (TextView) findViewById(R.id.sentSinceReceived);
+ sent = (TextView) findViewById(R.id.sent);
+ received = (TextView) findViewById(R.id.received);
+ cipherState = (TextView) findViewById(R.id.ciphState);
+ smsc = (EditText) findViewById(R.id.smsc);
+ dnsCheckState = (TextView) findViewById(R.id.dnsCheckState);
+
+ mPingIpAddr = (TextView) findViewById(R.id.pingIpAddr);
+ mPingHostname = (TextView) findViewById(R.id.pingHostname);
+ mHttpClientTest = (TextView) findViewById(R.id.httpClientTest);
+
+ preferredNetworkType = (Spinner) findViewById(R.id.preferredNetworkType);
+ ArrayAdapter<String> adapter = new ArrayAdapter<String> (this,
+ android.R.layout.simple_spinner_item, mPreferredNetworkLabels);
+ adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+ preferredNetworkType.setAdapter(adapter);
+ preferredNetworkType.setOnItemSelectedListener(mPreferredNetworkHandler);
+
+ radioPowerButton = (Button) findViewById(R.id.radio_power);
+ radioPowerButton.setOnClickListener(mPowerButtonHandler);
+
+ qxdmLogButton = (Button) findViewById(R.id.qxdm_log);
+ qxdmLogButton.setOnClickListener(mQxdmButtonHandler);
+
+ cipherToggleButton = (Button) findViewById(R.id.ciph_toggle);
+ cipherToggleButton.setOnClickListener(mCipherButtonHandler);
+ pingTestButton = (Button) findViewById(R.id.ping_test);
+ pingTestButton.setOnClickListener(mPingButtonHandler);
+ updateSmscButton = (Button) findViewById(R.id.update_smsc);
+ updateSmscButton.setOnClickListener(mUpdateSmscButtonHandler);
+ refreshSmscButton = (Button) findViewById(R.id.refresh_smsc);
+ refreshSmscButton.setOnClickListener(mRefreshSmscButtonHandler);
+ dnsCheckToggleButton = (Button) findViewById(R.id.dns_check_toggle);
+ dnsCheckToggleButton.setOnClickListener(mDnsCheckButtonHandler);
+
+ mPhoneStateReceiver = new PhoneStateIntentReceiver(this, mHandler);
+ mPhoneStateReceiver.notifySignalStrength(EVENT_SIGNAL_STRENGTH_CHANGED);
+ mPhoneStateReceiver.notifyServiceState(EVENT_SERVICE_STATE_CHANGED);
+ mPhoneStateReceiver.notifyPhoneCallState(EVENT_PHONE_STATE_CHANGED);
+
+ updateQxdmState(null);
+ mOem = new OemCommands();
+
+ phone.getPreferredNetworkType(
+ mHandler.obtainMessage(EVENT_QUERY_PREFERRED_TYPE_DONE));
+ phone.getNeighboringCids(
+ mHandler.obtainMessage(EVENT_QUERY_NEIGHBORING_CIDS_DONE));
+
+ netstat = INetStatService.Stub.asInterface(ServiceManager.getService("netstat"));
+
+ CellLocation.requestLocationUpdate();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ updatePhoneState();
+ updateSignalStrength();
+ updateMessageWaiting();
+ updateCallRedirect();
+ updateServiceState();
+ updateLocation(mTelephonyManager.getCellLocation());
+ updateDataState();
+ updateDataStats();
+ updateDataStats2();
+ updatePowerState();
+ updateQxdmState(null);
+ updateProperties();
+ updateCiphState();
+ updateDnsCheckState();
+
+ Log.i(TAG, "[RadioInfo] onResume: register phone & data intents");
+
+ mPhoneStateReceiver.registerIntent();
+ mTelephonyManager.listen(mPhoneStateListener,
+ PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
+ | PhoneStateListener.LISTEN_DATA_ACTIVITY
+ | PhoneStateListener.LISTEN_CELL_LOCATION
+ | PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR
+ | PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR);
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+
+ Log.i(TAG, "[RadioInfo] onPause: unregister phone & data intents");
+
+ mPhoneStateReceiver.unregisterIntent();
+ mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ 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);
+ menu.add(1, MENU_ITEM_VIEW_FDN, 0,
+ R.string.radioInfo_menu_viewFDN).setOnMenuItemClickListener(mViewFDNCallback);
+ menu.add(1, MENU_ITEM_VIEW_SDN, 0,
+ R.string.radioInfo_menu_viewSDN).setOnMenuItemClickListener(mViewSDNCallback);
+ menu.add(1, MENU_ITEM_GET_PDP_LIST,
+ 0, R.string.radioInfo_menu_getPDP).setOnMenuItemClickListener(mGetPdpList);
+ 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);
+ return true;
+ }
+
+
+ @Override
+ 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();
+ boolean visible = true;
+
+ switch (state) {
+ case TelephonyManager.DATA_CONNECTED:
+ case TelephonyManager.DATA_SUSPENDED:
+ item.setTitle(R.string.radioInfo_menu_disableData);
+ break;
+ case TelephonyManager.DATA_DISCONNECTED:
+ item.setTitle(R.string.radioInfo_menu_enableData);
+ break;
+ default:
+ visible = false;
+ break;
+ }
+ item.setVisible(visible);
+
+ // Get the toggle-data-on-boot menu item in the right state.
+ item = menu.findItem(MENU_ITEM_TOGGLE_DATA_ON_BOOT);
+ SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this.getApplication());
+ boolean value = sp.getBoolean(GSMPhone.DATA_DISABLED_ON_BOOT_KEY, false);
+ if (value) {
+ item.setTitle(R.string.radioInfo_menu_enableDataOnBoot);
+ } else {
+ item.setTitle(R.string.radioInfo_menu_disableDataOnBoot);
+ }
+ return true;
+ }
+
+ private boolean isRadioOn() {
+ return phone.getServiceState().getState() != ServiceState.STATE_POWER_OFF;
+ }
+
+ private void updatePowerState() {
+ //log("updatePowerState");
+ String buttonText = isRadioOn() ?
+ getString(R.string.turn_off_radio) :
+ getString(R.string.turn_on_radio);
+ radioPowerButton.setText(buttonText);
+ }
+
+ private void updateQxdmState(Boolean newQxdmStatus) {
+ SharedPreferences sp =
+ PreferenceManager.getDefaultSharedPreferences(this.getApplication());
+ mQxdmLogEnabled = sp.getBoolean("qxdmstatus", false);
+ // This is called from onCreate, onResume, and the handler when the status
+ // is updated.
+ if (newQxdmStatus != null) {
+ SharedPreferences.Editor editor = sp.edit();
+ editor.putBoolean("qxdmstatus", newQxdmStatus);
+ editor.commit();
+ mQxdmLogEnabled = newQxdmStatus;
+ }
+
+ String buttonText = mQxdmLogEnabled ?
+ getString(R.string.turn_off_qxdm) :
+ getString(R.string.turn_on_qxdm);
+ qxdmLogButton.setText(buttonText);
+ }
+
+ private void setCiphPref(boolean value) {
+ SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this.getApplication());
+ SharedPreferences.Editor editor = sp.edit();
+ editor.putBoolean(GSMPhone.CIPHERING_KEY, value);
+ editor.commit();
+ }
+
+ private boolean getCiphPref() {
+ SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this.getApplication());
+ boolean ret = sp.getBoolean(GSMPhone.CIPHERING_KEY, true);
+ return ret;
+ }
+
+ private void updateCiphState() {
+ cipherState.setText(getCiphPref() ? "Ciphering ON" : "Ciphering OFF");
+ }
+
+ private void updateDnsCheckState() {
+ GSMPhone gsmPhone = (GSMPhone) phone;
+ dnsCheckState.setText(gsmPhone.isDnsCheckDisabled() ?
+ "0.0.0.0 allowed" :"0.0.0.0 not allowed");
+ }
+
+ private final void
+ updateSignalStrength() {
+ 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();
+
+ if (-1 == signalAsu) signalAsu = 0;
+
+ dBm.setText(String.valueOf(signalDbm) + " "
+ + r.getString(R.string.radioInfo_display_dbm) + " "
+ + String.valueOf(signalAsu) + " "
+ + r.getString(R.string.radioInfo_display_asu));
+ }
+
+ private final void updateLocation(CellLocation location) {
+ GsmCellLocation loc = (GsmCellLocation)location;
+ Resources r = getResources();
+
+ int lac = loc.getLac();
+ int cid = loc.getCid();
+
+ mLocation.setText(r.getString(R.string.radioInfo_lac) + " = "
+ + ((lac == -1) ? "unknown" : Integer.toHexString(lac))
+ + " "
+ + r.getString(R.string.radioInfo_cid) + " = "
+ + ((cid == -1) ? "unknown" : Integer.toHexString(cid)));
+ }
+
+ private final void updateNeighboringCids(ArrayList<NeighboringCellInfo> cids) {
+ String neighborings = "";
+ if (cids != null) {
+ if ( cids.isEmpty() ) {
+ neighborings = "no neighboring cells";
+ } else {
+ for (NeighboringCellInfo cell : cids) {
+ neighborings += "{" + Integer.toHexString(cell.getCid())
+ + "@" + cell.getRssi() + "} ";
+ }
+ }
+ } else {
+ neighborings = "unknown";
+ }
+ mNeighboringCids.setText(neighborings);
+ }
+
+ private final void
+ updateMessageWaiting() {
+ mMwi.setText(String.valueOf(mMwiValue));
+ }
+
+ private final void
+ updateCallRedirect() {
+ mCfi.setText(String.valueOf(mCfiValue));
+ }
+
+
+ private final void
+ updateServiceState() {
+ ServiceState serviceState = mPhoneStateReceiver.getServiceState();
+ int state = serviceState.getState();
+ Resources r = getResources();
+ String display = r.getString(R.string.radioInfo_unknown);
+
+ switch (state) {
+ case ServiceState.STATE_IN_SERVICE:
+ display = r.getString(R.string.radioInfo_service_in);
+ break;
+ case ServiceState.STATE_OUT_OF_SERVICE:
+ case ServiceState.STATE_EMERGENCY_ONLY:
+ display = r.getString(R.string.radioInfo_service_emergency);
+ break;
+ case ServiceState.STATE_POWER_OFF:
+ display = r.getString(R.string.radioInfo_service_off);
+ break;
+ }
+
+ gsmState.setText(display);
+
+ if (serviceState.getRoaming()) {
+ roamingState.setText(R.string.radioInfo_roaming_in);
+ } else {
+ roamingState.setText(R.string.radioInfo_roaming_not);
+ }
+
+ operatorName.setText(serviceState.getOperatorAlphaLong());
+ }
+
+ private final void
+ updatePhoneState() {
+ Phone.State state = mPhoneStateReceiver.getPhoneState();
+ Resources r = getResources();
+ String display = r.getString(R.string.radioInfo_unknown);
+
+ switch (state) {
+ case IDLE:
+ display = r.getString(R.string.radioInfo_phone_idle);
+ break;
+ case RINGING:
+ display = r.getString(R.string.radioInfo_phone_ringing);
+ break;
+ case OFFHOOK:
+ display = r.getString(R.string.radioInfo_phone_offhook);
+ break;
+ }
+
+ callState.setText(display);
+ }
+
+ private final void
+ updateDataState() {
+ int state = mTelephonyManager.getDataState();
+ Resources r = getResources();
+ String display = r.getString(R.string.radioInfo_unknown);
+
+ switch (state) {
+ case TelephonyManager.DATA_CONNECTED:
+ display = r.getString(R.string.radioInfo_data_connected);
+ break;
+ case TelephonyManager.DATA_CONNECTING:
+ display = r.getString(R.string.radioInfo_data_connecting);
+ break;
+ case TelephonyManager.DATA_DISCONNECTED:
+ display = r.getString(R.string.radioInfo_data_disconnected);
+ break;
+ case TelephonyManager.DATA_SUSPENDED:
+ display = r.getString(R.string.radioInfo_data_suspended);
+ break;
+ }
+
+ gprsState.setText(display);
+ }
+
+ private final void updateNetworkType() {
+ Resources r = getResources();
+ String display = SystemProperties.get(TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE,
+ r.getString(R.string.radioInfo_unknown));
+
+ network.setText(display);
+ }
+
+ private final void
+ updateProperties() {
+ String s;
+ Resources r = getResources();
+
+ s = phone.getDeviceId();
+ if (s == null) s = r.getString(R.string.radioInfo_unknown);
+ mImei.setText(s);
+
+ s = phone.getLine1Number();
+ if (s == null) s = r.getString(R.string.radioInfo_unknown);
+ number.setText(s);
+ }
+
+ private final void updateDataStats() {
+ String s;
+
+ s = SystemProperties.get("net.gsm.radio-reset", "0");
+ resets.setText(s);
+
+ s = SystemProperties.get("net.gsm.attempt-gprs", "0");
+ attempts.setText(s);
+
+ s = SystemProperties.get("net.gsm.succeed-gprs", "0");
+ successes.setText(s);
+
+ //s = SystemProperties.get("net.gsm.disconnect", "0");
+ //disconnects.setText(s);
+
+ s = SystemProperties.get("net.ppp.reset-by-timeout", "0");
+ sentSinceReceived.setText(s);
+ }
+
+ private final void updateDataStats2() {
+ Resources r = getResources();
+
+ try {
+ long txPackets = netstat.getMobileTxPackets();
+ long rxPackets = netstat.getMobileRxPackets();
+ long txBytes = netstat.getMobileTxBytes();
+ long rxBytes = netstat.getMobileRxBytes();
+
+ String packets = r.getString(R.string.radioInfo_display_packets);
+ String bytes = r.getString(R.string.radioInfo_display_bytes);
+
+ sent.setText(txPackets + " " + packets + ", " + txBytes + " " + bytes);
+ received.setText(rxPackets + " " + packets + ", " + rxBytes + " " + bytes);
+ } catch (RemoteException e) {
+ }
+ }
+
+ /**
+ * Ping a IP address.
+ */
+ private final void pingIpAddr() {
+ try {
+ // This is hardcoded IP addr. This is for testing purposes.
+ // We would need to get rid of this before release.
+ String ipAddress = "74.125.47.104";
+ Process p = Runtime.getRuntime().exec("ping -c 1 " + ipAddress);
+ int status = p.waitFor();
+ if (status == 0) {
+ mPingIpAddrResult = "Pass";
+ } else {
+ mPingIpAddrResult = "Fail: IP addr not reachable";
+ }
+ } catch (IOException e) {
+ mPingIpAddrResult = "Fail: IOException";
+ } catch (InterruptedException e) {
+ mPingIpAddrResult = "Fail: InterruptedException";
+ }
+ }
+
+ /**
+ * Ping a host name
+ */
+ private final void pingHostname() {
+ try {
+ Process p = Runtime.getRuntime().exec("ping -c 1 www.google.com");
+ int status = p.waitFor();
+ if (status == 0) {
+ mPingHostnameResult = "Pass";
+ } else {
+ mPingHostnameResult = "Fail: Host unreachable";
+ }
+ } catch (UnknownHostException e) {
+ mPingHostnameResult = "Fail: Unknown Host";
+ } catch (IOException e) {
+ mPingHostnameResult= "Fail: IOException";
+ } catch (InterruptedException e) {
+ mPingHostnameResult = "Fail: InterruptedException";
+ }
+ }
+
+ /**
+ * This function checks for basic functionality of HTTP Client.
+ */
+ private void httpClientTest() {
+ HttpClient client = new DefaultHttpClient();
+ try {
+ HttpGet request = new HttpGet("http://www.google.com");
+ HttpResponse response = client.execute(request);
+ if (response.getStatusLine().getStatusCode() == 200) {
+ mHttpClientTestResult = "Pass";
+ } else {
+ mHttpClientTestResult = "Fail: Code: " + String.valueOf(response);
+ }
+ request.abort();
+ } catch (IOException e) {
+ mHttpClientTestResult = "Fail: IOException";
+ }
+ }
+
+ private void refreshSmsc() {
+ byte[] data = mOem.getSmscQueryData();
+ if (data == null) return;
+ phone.invokeOemRilRequestRaw(data,
+ mHandler.obtainMessage(EVENT_QUERY_SMSC_DONE));
+ }
+
+ private final void updatePingState() {
+ final Handler handler = new Handler();
+ // Set all to unknown since the threads will take a few secs to update.
+ mPingIpAddrResult = getResources().getString(R.string.radioInfo_unknown);
+ mPingHostnameResult = getResources().getString(R.string.radioInfo_unknown);
+ mHttpClientTestResult = getResources().getString(R.string.radioInfo_unknown);
+
+ mPingIpAddr.setText(mPingIpAddrResult);
+ mPingHostname.setText(mPingHostnameResult);
+ mHttpClientTest.setText(mHttpClientTestResult);
+
+ final Runnable updatePingResults = new Runnable() {
+ public void run() {
+ mPingIpAddr.setText(mPingIpAddrResult);
+ mPingHostname.setText(mPingHostnameResult);
+ mHttpClientTest.setText(mHttpClientTestResult);
+ }
+ };
+ Thread ipAddr = new Thread() {
+ @Override
+ public void run() {
+ pingIpAddr();
+ handler.post(updatePingResults);
+ }
+ };
+ ipAddr.start();
+
+ Thread hostname = new Thread() {
+ @Override
+ public void run() {
+ pingHostname();
+ handler.post(updatePingResults);
+ }
+ };
+ hostname.start();
+
+ Thread httpClient = new Thread() {
+ @Override
+ public void run() {
+ httpClientTest();
+ handler.post(updatePingResults);
+ }
+ };
+ httpClient.start();
+ }
+
+ private final void updatePdpList() {
+ StringBuilder sb = new StringBuilder("========DATA=======\n");
+
+ List<PdpConnection> pdps = phone.getCurrentPdpList();
+
+ for (PdpConnection pdp : pdps) {
+ sb.append(" State: ").append(pdp.getState().toString()).append("\n");
+ if (pdp.getState().isActive()) {
+ long timeElapsed =
+ (System.currentTimeMillis() - pdp.getConnectionTime())/1000;
+ sb.append(" connected at ")
+ .append(DateUtils.timeString(pdp.getConnectionTime()))
+ .append(" and elapsed ")
+ .append(DateUtils.formatElapsedTime(timeElapsed))
+ .append("\n to ")
+ .append(pdp.getApn().toString())
+ .append("\ninterface: ")
+ .append(phone.getInterfaceName(phone.getActiveApnTypes()[0]))
+ .append("\naddress: ")
+ .append(phone.getIpAddress(phone.getActiveApnTypes()[0]))
+ .append("\ngateway: ")
+ .append(phone.getGateway(phone.getActiveApnTypes()[0]));
+ String[] dns = phone.getDnsServers(phone.getActiveApnTypes()[0]);
+ if (dns != null) {
+ sb.append("\ndns: ").append(dns[0]).append(", ").append(dns[1]);
+ }
+ } else if (pdp.getState().isInactive()) {
+ sb.append(" disconnected with last try at ")
+ .append(DateUtils.timeString(pdp.getLastFailTime()))
+ .append("\n fail because ")
+ .append(pdp.getLastFailCause().toString());
+ } else {
+ sb.append(" is connecting to ")
+ .append(pdp.getApn().toString());
+ }
+ sb.append("\n===================");
+ }
+
+
+ disconnects.setText(sb.toString());
+ }
+
+ private void displayQxdmEnableResult() {
+ String status = mQxdmLogEnabled ? "Start QXDM Log" : "Stop QXDM Log";
+
+ DialogInterface mProgressPanel = new AlertDialog.
+ Builder(this).setMessage(status).show();
+
+ mHandler.postDelayed(
+ new Runnable() {
+ public void run() {
+ finish();
+ }
+ }, 2000);
+ }
+
+ private MenuItem.OnMenuItemClickListener mViewADNCallback = new MenuItem.OnMenuItemClickListener() {
+ public boolean onMenuItemClick(MenuItem item) {
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ // 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
+ // other than the Dialer process, which causes a lot of stuff to
+ // break.
+ intent.setClassName("com.android.phone",
+ "com.android.phone.SimContacts");
+ startActivity(intent);
+ return true;
+ }
+ };
+
+ private MenuItem.OnMenuItemClickListener mViewFDNCallback = new MenuItem.OnMenuItemClickListener() {
+ public boolean onMenuItemClick(MenuItem item) {
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ // 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
+ // other than the Dialer process, which causes a lot of stuff to
+ // break.
+ intent.setClassName("com.android.phone",
+ "com.android.phone.FdnList");
+ startActivity(intent);
+ return true;
+ }
+ };
+
+ private MenuItem.OnMenuItemClickListener mViewSDNCallback = new MenuItem.OnMenuItemClickListener() {
+ public boolean onMenuItemClick(MenuItem item) {
+ Intent intent = new Intent(
+ Intent.ACTION_VIEW, Uri.parse("content://sim/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
+ // other than the Dialer process, which causes a lot of stuff to
+ // break.
+ intent.setClassName("com.android.phone",
+ "com.android.phone.ADNList");
+ startActivity(intent);
+ return true;
+ }
+ };
+
+ private void toggleDataDisabledOnBoot() {
+ SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this.getApplication());
+ SharedPreferences.Editor editor = sp.edit();
+ boolean value = sp.getBoolean(GSMPhone.DATA_DISABLED_ON_BOOT_KEY, false);
+ editor.putBoolean(GSMPhone.DATA_DISABLED_ON_BOOT_KEY, !value);
+ byte[] data = mOem.getPsAutoAttachData(value);
+ if (data == null) {
+ // don't commit
+ return;
+ }
+
+ editor.commit();
+ phone.invokeOemRilRequestRaw(data, null);
+ }
+
+ private MenuItem.OnMenuItemClickListener mToggleDataOnBoot = new MenuItem.OnMenuItemClickListener() {
+ public boolean onMenuItemClick(MenuItem item) {
+ toggleDataDisabledOnBoot();
+ return true;
+ }
+ };
+
+ private MenuItem.OnMenuItemClickListener mToggleData = new MenuItem.OnMenuItemClickListener() {
+ public boolean onMenuItemClick(MenuItem item) {
+ int state = mTelephonyManager.getDataState();
+ switch (state) {
+ case TelephonyManager.DATA_CONNECTED:
+ phone.disableDataConnectivity();
+ break;
+ case TelephonyManager.DATA_DISCONNECTED:
+ phone.enableDataConnectivity();
+ break;
+ default:
+ // do nothing
+ break;
+ }
+ return true;
+ }
+ };
+
+ private MenuItem.OnMenuItemClickListener mGetPdpList = new MenuItem.OnMenuItemClickListener() {
+ public boolean onMenuItemClick(MenuItem item) {
+ phone.getPdpContextList(null);
+ return true;
+ }
+ };
+
+ private MenuItem.OnMenuItemClickListener mSelectBandCallback = new MenuItem.OnMenuItemClickListener() {
+ public boolean onMenuItemClick(MenuItem item) {
+ Intent intent = new Intent();
+ intent.setClass(RadioInfo.this, BandMode.class);
+ startActivity(intent);
+ return true;
+ }
+ };
+
+ OnClickListener mPowerButtonHandler = new OnClickListener() {
+ public void onClick(View v) {
+ //log("toggle radio power: currently " + (isRadioOn()?"on":"off"));
+ phone.setRadioPower(!isRadioOn());
+ }
+ };
+
+ OnClickListener mCipherButtonHandler = new OnClickListener() {
+ public void onClick(View v) {
+ mCipherOn = !getCiphPref();
+ byte[] data = mOem.getCipheringData(mCipherOn);
+
+ if (data == null)
+ return;
+
+ cipherState.setText("Setting...");
+ phone.invokeOemRilRequestRaw(data,
+ mHandler.obtainMessage(EVENT_SET_CIPHER_DONE));
+ }
+ };
+
+ OnClickListener mDnsCheckButtonHandler = new OnClickListener() {
+ public void onClick(View v) {
+ GSMPhone gsmPhone = (GSMPhone) phone;
+ gsmPhone.disableDnsCheck(!gsmPhone.isDnsCheckDisabled());
+ updateDnsCheckState();
+ }
+ };
+
+ OnClickListener mPingButtonHandler = new OnClickListener() {
+ public void onClick(View v) {
+ updatePingState();
+ }
+ };
+
+ OnClickListener mUpdateSmscButtonHandler = new OnClickListener() {
+ public void onClick(View v) {
+ updateSmscButton.setEnabled(false);
+ byte[] data = mOem.getSmscUpdateData(smsc.getText().toString());
+ if (data == null) return;
+ phone.invokeOemRilRequestRaw(data,
+ mHandler.obtainMessage(EVENT_UPDATE_SMSC_DONE));
+ }
+ };
+
+ OnClickListener mRefreshSmscButtonHandler = new OnClickListener() {
+ public void onClick(View v) {
+ refreshSmsc();
+ }
+ };
+
+ OnClickListener mQxdmButtonHandler = new OnClickListener() {
+ public void onClick(View v) {
+ byte[] data = mOem.getQxdmSdlogData(
+ !mQxdmLogEnabled,
+ mOem.OEM_QXDM_SDLOG_DEFAULT_FILE_SIZE,
+ mOem.OEM_QXDM_SDLOG_DEFAULT_MASK,
+ mOem.OEM_QXDM_SDLOG_DEFAULT_MAX_INDEX);
+
+ if (data == null)
+ return;
+
+ phone.invokeOemRilRequestRaw(data,
+ mHandler.obtainMessage(EVENT_SET_QXDMLOG_DONE));
+ }
+ };
+
+ AdapterView.OnItemSelectedListener
+ 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) {
+ phone.setPreferredNetworkType(pos, msg);
+ }
+ }
+
+ public void onNothingSelected(AdapterView parent) {
+ }
+ };
+
+ private String[] mPreferredNetworkLabels = {
+ "WCDMA preferred", "GSM only", "WCDMA only", "Unknown"};
+}
diff --git a/src/com/android/settings/RingerVolumePreference.java b/src/com/android/settings/RingerVolumePreference.java
new file mode 100644
index 0000000..2d21ec6
--- /dev/null
+++ b/src/com/android/settings/RingerVolumePreference.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.content.Context;
+import android.media.AudioManager;
+import android.preference.VolumePreference;
+import android.preference.VolumePreference.SeekBarVolumizer;
+import android.provider.Settings;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.SeekBar;
+import android.widget.TextView;
+
+/**
+ * Special preference type that allows configuration of both the ring volume and
+ * notification volume.
+ */
+public class RingerVolumePreference extends VolumePreference implements
+ CheckBox.OnCheckedChangeListener {
+ private static final String TAG = "RingerVolumePreference";
+
+ private CheckBox mNotificationsUseRingVolumeCheckbox;
+ private SeekBarVolumizer mNotificationSeekBarVolumizer;
+ private TextView mNotificationVolumeTitle;
+
+ public RingerVolumePreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ // The always visible seekbar is for ring volume
+ setStreamType(AudioManager.STREAM_RING);
+
+ setDialogLayoutResource(R.layout.preference_dialog_ringervolume);
+ }
+
+ @Override
+ protected void onBindDialogView(View view) {
+ super.onBindDialogView(view);
+
+ mNotificationsUseRingVolumeCheckbox =
+ (CheckBox) view.findViewById(R.id.same_notification_volume);
+ mNotificationsUseRingVolumeCheckbox.setOnCheckedChangeListener(this);
+ mNotificationsUseRingVolumeCheckbox.setChecked(Settings.System.getInt(
+ getContext().getContentResolver(),
+ Settings.System.NOTIFICATIONS_USE_RING_VOLUME, 1) == 1);
+
+ final SeekBar seekBar = (SeekBar) view.findViewById(R.id.notification_volume_seekbar);
+ mNotificationSeekBarVolumizer = new SeekBarVolumizer(getContext(), seekBar,
+ AudioManager.STREAM_NOTIFICATION);
+
+ mNotificationVolumeTitle = (TextView) view.findViewById(R.id.notification_volume_title);
+
+ setNotificationVolumeVisibility(!mNotificationsUseRingVolumeCheckbox.isChecked());
+ }
+
+ @Override
+ protected void onDialogClosed(boolean positiveResult) {
+ super.onDialogClosed(positiveResult);
+
+ if (!positiveResult && mNotificationSeekBarVolumizer != null) {
+ mNotificationSeekBarVolumizer.revertVolume();
+ }
+
+ cleanup();
+ }
+
+ @Override
+ public void onActivityStop() {
+ super.onActivityStop();
+ cleanup();
+ }
+
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ setNotificationVolumeVisibility(!isChecked);
+
+ Settings.System.putInt(getContext().getContentResolver(),
+ Settings.System.NOTIFICATIONS_USE_RING_VOLUME, isChecked ? 1 : 0);
+
+ if (isChecked) {
+ // The user wants the notification to be same as ring, so do a
+ // one-time sync right now
+ AudioManager audioManager = (AudioManager) getContext()
+ .getSystemService(Context.AUDIO_SERVICE);
+ audioManager.setStreamVolume(AudioManager.STREAM_NOTIFICATION,
+ audioManager.getStreamVolume(AudioManager.STREAM_RING), 0);
+ }
+ }
+
+ @Override
+ protected void onSampleStarting(SeekBarVolumizer volumizer) {
+ super.onSampleStarting(volumizer);
+
+ if (mNotificationSeekBarVolumizer != null && volumizer != mNotificationSeekBarVolumizer) {
+ mNotificationSeekBarVolumizer.stopSample();
+ }
+ }
+
+ private void setNotificationVolumeVisibility(boolean visible) {
+ if (mNotificationSeekBarVolumizer != null) {
+ mNotificationSeekBarVolumizer.getSeekBar().setVisibility(
+ visible ? View.VISIBLE : View.GONE);
+ mNotificationVolumeTitle.setVisibility(visible ? View.VISIBLE : View.GONE);
+ }
+ }
+
+ private void cleanup() {
+ if (mNotificationSeekBarVolumizer != null) {
+ mNotificationSeekBarVolumizer.stop();
+ mNotificationSeekBarVolumizer = null;
+ }
+ }
+
+}
diff --git a/src/com/android/settings/SdCardIntentReceiver.java b/src/com/android/settings/SdCardIntentReceiver.java
new file mode 100644
index 0000000..9648ec1
--- /dev/null
+++ b/src/com/android/settings/SdCardIntentReceiver.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.BroadcastReceiver;
+import android.util.Config;
+import android.util.Log;
+
+/**
+ *
+ */
+public class SdCardIntentReceiver extends BroadcastReceiver {
+
+ private static final int SDCARD_STATUS = 1;
+ private static final String TAG = "SdCardIntentReceiver";
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ NotificationManager nm = (NotificationManager) context
+ .getSystemService(Context.NOTIFICATION_SERVICE);
+ String action = intent.getAction();
+ if (Config.LOGD) Log.d(TAG, "onReceiveIntent " + action);
+
+ if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) {
+ nm.cancel(SDCARD_STATUS);
+
+ Intent statusIntent = new Intent(Intent.ACTION_MAIN, null);
+ statusIntent.setClass(context, SdCardSettings.class);
+ nm.notify(SDCARD_STATUS, new Notification(context,
+ android.R.drawable.stat_notify_sdcard,
+ null,
+ System.currentTimeMillis(),
+ context.getText(R.string.sdcard_setting),
+ null,
+ statusIntent));
+ } else if (action.equals(Intent.ACTION_MEDIA_REMOVED)) {
+ nm.cancel(SDCARD_STATUS);
+ } else if (action.equals(Intent.ACTION_MEDIA_SHARED)) {
+ nm.cancel(SDCARD_STATUS);
+
+ Intent statusIntent = new Intent(Intent.ACTION_MAIN, null);
+ statusIntent.setClass(context, SdCardSettings.class);
+ nm.notify(SDCARD_STATUS, new Notification(context,
+ android.R.drawable.stat_notify_sdcard_usb,
+ null,
+ System.currentTimeMillis(),
+ "SD Card",
+ null,
+ statusIntent));
+ }
+ }
+}
diff --git a/src/com/android/settings/SdCardSettings.java b/src/com/android/settings/SdCardSettings.java
new file mode 100644
index 0000000..b6935a2
--- /dev/null
+++ b/src/com/android/settings/SdCardSettings.java
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.app.Activity;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.os.Environment;
+import android.os.IMountService;
+import android.os.ServiceManager;
+import android.os.StatFs;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.TextView;
+
+import java.io.File;
+
+
+public class SdCardSettings extends Activity
+{
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ setContentView(R.layout.sdcard_settings_screen);
+
+ mMountService = IMountService.Stub.asInterface(ServiceManager.getService("mount"));
+
+ mRemovedLayout = findViewById(R.id.removed);
+ mMountedLayout = findViewById(R.id.mounted);
+ mUnmountedLayout = findViewById(R.id.unmounted);
+ mScanningLayout = findViewById(R.id.scanning);
+ mSharedLayout = findViewById(R.id.shared);
+ mBadRemovalLayout = findViewById(R.id.bad_removal);
+ mReadOnlyStatus = findViewById(R.id.read_only);
+
+ mMassStorage = (CheckBox)findViewById(R.id.mass_storage);
+ mMassStorage.setOnClickListener(mMassStorageListener);
+
+ Button unmountButton = (Button)findViewById(R.id.sdcard_unmount);
+ unmountButton.setOnClickListener(mUnmountButtonHandler);
+
+ Button formatButton = (Button)findViewById(R.id.sdcard_format);
+ formatButton.setOnClickListener(mFormatButtonHandler);
+
+ mTotalSize = (TextView)findViewById(R.id.total);
+ mUsedSize = (TextView)findViewById(R.id.used);
+ mAvailableSize = (TextView)findViewById(R.id.available);
+
+ // install an intent filter to receive SD card related events.
+ IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_REMOVED);
+ intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
+ intentFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
+ intentFilter.addAction(Intent.ACTION_MEDIA_SHARED);
+ intentFilter.addAction(Intent.ACTION_MEDIA_CHECKING);
+ intentFilter.addAction(Intent.ACTION_MEDIA_NOFS);
+ intentFilter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL);
+ intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);
+ intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
+ intentFilter.addDataScheme("file");
+ registerReceiver(mReceiver, intentFilter);
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ update();
+ }
+
+ private void setLayout(View layout) {
+ mRemovedLayout.setVisibility(layout == mRemovedLayout ? View.VISIBLE : View.GONE);
+ mMountedLayout.setVisibility(layout == mMountedLayout ? View.VISIBLE : View.GONE);
+ mUnmountedLayout.setVisibility(layout == mUnmountedLayout ? View.VISIBLE : View.GONE);
+ mScanningLayout.setVisibility(layout == mScanningLayout ? View.VISIBLE : View.GONE);
+ mSharedLayout.setVisibility(layout == mSharedLayout ? View.VISIBLE : View.GONE);
+ mBadRemovalLayout.setVisibility(layout == mBadRemovalLayout ? View.VISIBLE : View.GONE);
+ }
+
+ private void update() {
+ try {
+ mMassStorage.setChecked(mMountService.getMassStorageEnabled());
+ } catch (RemoteException ex) {
+ }
+
+ String scanVolume = null; // this no longer exists: SystemProperties.get(MediaScanner.CURRENT_VOLUME_PROPERTY, "");
+ boolean scanning = "external".equals(scanVolume);
+
+ if (scanning) {
+ setLayout(mScanningLayout);
+ } else {
+ String status = Environment.getExternalStorageState();
+ boolean readOnly = false;
+
+ if (status.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) {
+ status = Environment.MEDIA_MOUNTED;
+ readOnly = true;
+ }
+
+ if (status.equals(Environment.MEDIA_MOUNTED)) {
+ try {
+ File path = Environment.getExternalStorageDirectory();
+ StatFs stat = new StatFs(path.getPath());
+ long blockSize = stat.getBlockSize();
+ long totalBlocks = stat.getBlockCount();
+ long availableBlocks = stat.getAvailableBlocks();
+
+ mTotalSize.setText(formatSize(totalBlocks * blockSize));
+ mUsedSize.setText(formatSize((totalBlocks - availableBlocks) * blockSize));
+ mAvailableSize.setText(formatSize(availableBlocks * blockSize));
+ } catch (IllegalArgumentException e) {
+ // this can occur if the SD card is removed, but we haven't received the
+ // ACTION_MEDIA_REMOVED Intent yet.
+ status = Environment.MEDIA_REMOVED;
+ }
+
+ mReadOnlyStatus.setVisibility(readOnly ? View.VISIBLE : View.GONE);
+ setLayout(mMountedLayout);
+ } else if (status.equals(Environment.MEDIA_UNMOUNTED)) {
+ setLayout(mUnmountedLayout);
+ } else if (status.equals(Environment.MEDIA_REMOVED)) {
+ setLayout(mRemovedLayout);
+ } else if (status.equals(Environment.MEDIA_SHARED)) {
+ setLayout(mSharedLayout);
+ } else if (status.equals(Environment.MEDIA_BAD_REMOVAL)) {
+ setLayout(mBadRemovalLayout);
+ }
+ }
+ }
+
+ private String formatSize(long size) {
+ String suffix = null;
+
+ // add K or M suffix if size is greater than 1K or 1M
+ if (size >= 1024) {
+ suffix = "K";
+ size /= 1024;
+ if (size >= 1024) {
+ suffix = "M";
+ size /= 1024;
+ }
+ }
+
+ StringBuilder resultBuffer = new StringBuilder(Long.toString(size));
+
+ int commaOffset = resultBuffer.length() - 3;
+ while (commaOffset > 0) {
+ resultBuffer.insert(commaOffset, ',');
+ commaOffset -= 3;
+ }
+
+ if (suffix != null)
+ resultBuffer.append(suffix);
+ return resultBuffer.toString();
+ }
+
+ OnClickListener mMassStorageListener = new OnClickListener() {
+ public void onClick(View v) {
+ try {
+ mMountService.setMassStorageEnabled(mMassStorage.isChecked());
+ } catch (RemoteException ex) {
+ }
+ }
+ };
+
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ update();
+ }
+ };
+
+ OnClickListener mUnmountButtonHandler = new OnClickListener() {
+ public void onClick(View v) {
+ try {
+ mMountService.unmountMedia(Environment.getExternalStorageDirectory().toString());
+ } catch (RemoteException ex) {
+ }
+ }
+ };
+
+ OnClickListener mFormatButtonHandler = new OnClickListener() {
+ public void onClick(View v) {
+ try {
+ mMountService.formatMedia(Environment.getExternalStorageDirectory().toString());
+ } catch (RemoteException ex) {
+ }
+ }
+ };
+
+
+ private int mStatus;
+ private IMountService mMountService;
+
+ private CheckBox mMassStorage;
+
+ private TextView mTotalSize;
+ private TextView mUsedSize;
+ private TextView mAvailableSize;
+
+ private View mRemovedLayout;
+ private View mMountedLayout;
+ private View mUnmountedLayout;
+ private View mScanningLayout;
+ private View mSharedLayout;
+ private View mBadRemovalLayout;
+ private View mReadOnlyStatus;
+}
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
new file mode 100644
index 0000000..cd26492
--- /dev/null
+++ b/src/com/android/settings/SecuritySettings.java
@@ -0,0 +1,304 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.location.LocationManager;
+import android.os.Bundle;
+import android.preference.CheckBoxPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceCategory;
+import android.preference.PreferenceScreen;
+import android.provider.Settings;
+import android.util.Config;
+import android.util.Log;
+
+import com.android.internal.widget.LockPatternUtils;
+
+/**
+ * Gesture lock pattern settings.
+ */
+public class SecuritySettings extends PreferenceActivity
+ implements SharedPreferences.OnSharedPreferenceChangeListener {
+
+ // Lock Settings
+
+ private static final String KEY_LOCK_ENABLED = "lockenabled";
+ private static final String KEY_VISIBLE_PATTERN = "visiblepattern";
+ private static final String KEY_TACTILE_FEEDBACK_ENABLED = "tactilefeedback";
+ private static final int CONFIRM_PATTERN_THEN_DISABLE_REQUEST_CODE = 55;
+ private static final int CONFIRM_PATTERN_THEN_ENABLE_REQUEST_CODE = 56;
+
+ private LockPatternUtils mLockPatternUtils;
+ private CheckBoxPreference mLockEnabled;
+ private CheckBoxPreference mVisiblePattern;
+ private CheckBoxPreference mTactileFeedback;
+ private Preference mChoosePattern;
+
+ private CheckBoxPreference mShowPassword;
+
+ // Location Settings
+
+ private static final String LOCATION_NETWORK = "location_network";
+ private static final String LOCATION_GPS = "location_gps";
+
+ private CheckBoxPreference mNetwork;
+ private CheckBoxPreference mGps;
+ private LocationManager mLocationManager;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.xml.security_settings);
+
+ 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);
+ getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
+ updateToggles();
+ }
+
+ private PreferenceScreen createPreferenceHierarchy() {
+ // Root
+ PreferenceScreen root = this.getPreferenceScreen();
+
+ // Inline preferences
+ PreferenceCategory inlinePrefCat = new PreferenceCategory(this);
+ inlinePrefCat.setTitle(R.string.lock_settings_title);
+ root.addPreference(inlinePrefCat);
+
+ // autolock toggle
+ mLockEnabled = new LockEnabledPref(this);
+ mLockEnabled.setTitle(R.string.lockpattern_settings_enable_title);
+ mLockEnabled.setSummary(R.string.lockpattern_settings_enable_summary);
+ mLockEnabled.setKey(KEY_LOCK_ENABLED);
+ inlinePrefCat.addPreference(mLockEnabled);
+
+ // visible pattern
+ mVisiblePattern = new CheckBoxPreference(this);
+ mVisiblePattern.setKey(KEY_VISIBLE_PATTERN);
+ mVisiblePattern.setTitle(R.string.lockpattern_settings_enable_visible_pattern_title);
+ inlinePrefCat.addPreference(mVisiblePattern);
+
+ // tactile feedback
+ mTactileFeedback = new CheckBoxPreference(this);
+ mTactileFeedback.setKey(KEY_TACTILE_FEEDBACK_ENABLED);
+ mTactileFeedback.setTitle(R.string.lockpattern_settings_enable_tactile_feedback_title);
+ inlinePrefCat.addPreference(mTactileFeedback);
+
+ // change pattern lock
+ Intent intent = new Intent();
+ intent.setClassName("com.android.settings",
+ "com.android.settings.ChooseLockPatternTutorial");
+ mChoosePattern = getPreferenceManager().createPreferenceScreen(this);
+ mChoosePattern.setIntent(intent);
+ inlinePrefCat.addPreference(mChoosePattern);
+
+ PreferenceScreen simLockPreferences = getPreferenceManager()
+ .createPreferenceScreen(this);
+ 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");
+ simLockPreferences.setIntent(intent);
+
+ PreferenceCategory simLockCat = new PreferenceCategory(this);
+ simLockCat.setTitle(R.string.sim_lock_settings_title);
+ root.addPreference(simLockCat);
+ simLockCat.addPreference(simLockPreferences);
+
+ // Passwords
+ PreferenceCategory passwordsCat = new PreferenceCategory(this);
+ passwordsCat.setTitle(R.string.security_passwords_title);
+ root.addPreference(passwordsCat);
+
+ CheckBoxPreference showPassword = mShowPassword = new CheckBoxPreference(this);
+ showPassword.setKey("show_password");
+ showPassword.setTitle(R.string.show_password);
+ showPassword.setSummary(R.string.show_password_summary);
+ showPassword.setPersistent(false);
+ passwordsCat.addPreference(showPassword);
+
+ return root;
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ boolean patternExists = mLockPatternUtils.savedPatternExists();
+ mLockEnabled.setEnabled(patternExists);
+ mVisiblePattern.setEnabled(patternExists);
+ mTactileFeedback.setEnabled(patternExists);
+
+ mLockEnabled.setChecked(mLockPatternUtils.isLockPatternEnabled());
+ mVisiblePattern.setChecked(mLockPatternUtils.isVisiblePatternEnabled());
+ mTactileFeedback.setChecked(mLockPatternUtils.isTactileFeedbackEnabled());
+
+ int chooseStringRes = mLockPatternUtils.savedPatternExists() ?
+ R.string.lockpattern_settings_change_lock_pattern :
+ R.string.lockpattern_settings_choose_lock_pattern;
+ mChoosePattern.setTitle(chooseStringRes);
+
+ mShowPassword
+ .setChecked(Settings.System.getInt(getContentResolver(),
+ Settings.System.TEXT_SHOW_PASSWORD, 1) != 0);
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
+ Preference preference) {
+ final String key = preference.getKey();
+
+ if (KEY_LOCK_ENABLED.equals(key)) {
+ mLockPatternUtils.setLockPatternEnabled(isToggled(preference));
+ } else if (KEY_VISIBLE_PATTERN.equals(key)) {
+ mLockPatternUtils.setVisiblePatternEnabled(isToggled(preference));
+ } else if (KEY_TACTILE_FEEDBACK_ENABLED.equals(key)) {
+ mLockPatternUtils.setTactileFeedbackEnabled(isToggled(preference));
+ } else if (preference == mShowPassword) {
+ Settings.System.putInt(getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD,
+ mShowPassword.isChecked() ? 1 : 0);
+ }
+
+ return 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;
+ }
+
+ public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
+ if (LOCATION_NETWORK.equals(key) || LOCATION_GPS.equals(key)) {
+ updateProviders();
+ }
+ }
+
+ private boolean isToggled(Preference pref) {
+ return ((CheckBoxPreference) pref).isChecked();
+ }
+
+
+ /**
+ * For the user to disable keyguard, we first make them verify their
+ * existing pattern.
+ */
+ private class LockEnabledPref extends CheckBoxPreference {
+
+ public LockEnabledPref(Context context) {
+ super(context);
+ }
+
+ @Override
+ protected void onClick() {
+ if (mLockPatternUtils.savedPatternExists()) {
+ if (isChecked()) {
+ confirmPatternThenDisable();
+ } else {
+ confirmPatternThenEnable();
+ }
+ } else {
+ super.onClick();
+ }
+ }
+ }
+
+ private void confirmPatternThenEnable() {
+ final Intent intent = new Intent();
+ intent.setClassName("com.android.settings", "com.android.settings.ConfirmLockPattern");
+ startActivityForResult(intent, CONFIRM_PATTERN_THEN_ENABLE_REQUEST_CODE);
+ }
+
+ /**
+ * Launch screen to confirm the existing lock pattern.
+ * @see #onActivityResult(int, int, android.content.Intent)
+ */
+ private void confirmPatternThenDisable() {
+ final Intent intent = new Intent();
+ intent.setClassName("com.android.settings", "com.android.settings.ConfirmLockPattern");
+ startActivityForResult(intent, CONFIRM_PATTERN_THEN_DISABLE_REQUEST_CODE);
+ }
+
+ /**
+ * @see #confirmPatternThenDisable
+ */
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode,
+ Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+
+ final boolean resultOk = resultCode == Activity.RESULT_OK;
+
+ if ((requestCode == CONFIRM_PATTERN_THEN_DISABLE_REQUEST_CODE) && resultOk) {
+ mLockPatternUtils.setLockPatternEnabled(false);
+ } else if ((requestCode == CONFIRM_PATTERN_THEN_ENABLE_REQUEST_CODE) && resultOk) {
+ mLockPatternUtils.setLockPatternEnabled(true);
+ }
+ }
+}
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
new file mode 100644
index 0000000..0c4545e
--- /dev/null
+++ b/src/com/android/settings/Settings.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.os.Bundle;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceGroup;
+import android.provider.Settings.System;
+
+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";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ addPreferencesFromResource(R.xml.settings);
+
+ PreferenceGroup parent = (PreferenceGroup) findPreference(KEY_PARENT);
+ Utils.updatePreferenceToSpecificActivityOrRemove(this, parent, KEY_SYNC_SETTINGS, 0);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ findPreference(KEY_CALL_SETTINGS).setEnabled(!AirplaneModeEnabler.isAirplaneModeOn(this));
+ }
+
+}
diff --git a/src/com/android/settings/SettingsLicenseActivity.java b/src/com/android/settings/SettingsLicenseActivity.java
new file mode 100644
index 0000000..0b809e1
--- /dev/null
+++ b/src/com/android/settings/SettingsLicenseActivity.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.os.Bundle;
+import android.os.SystemProperties;
+import android.text.TextUtils;
+import android.util.Config;
+import android.util.Log;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import android.widget.Toast;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.zip.GZIPInputStream;
+
+import com.android.internal.app.AlertActivity;
+import com.android.internal.app.AlertController;
+
+/**
+ * The "dialog" that shows from "License" in the Settings app.
+ */
+public class SettingsLicenseActivity extends AlertActivity {
+
+ private static final String TAG = "SettingsLicenseActivity";
+ private static final boolean LOGV = false || Config.LOGV;
+
+ private static final String DEFAULT_LICENSE_PATH = "/system/etc/NOTICE.html.gz";
+ private static final String PROPERTY_LICENSE_PATH = "ro.config.license_path";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ String fileName = SystemProperties.get(PROPERTY_LICENSE_PATH, DEFAULT_LICENSE_PATH);
+ if (TextUtils.isEmpty(fileName)) {
+ Log.e(TAG, "The system property for the license file is empty.");
+ showErrorAndFinish();
+ return;
+ }
+
+ InputStreamReader inputReader = null;
+ StringBuilder data = null;
+ try {
+ data = new StringBuilder(2048);
+ char tmp[] = new char[2048];
+ int numRead;
+ if (fileName.endsWith(".gz")) {
+ inputReader = new InputStreamReader(
+ new GZIPInputStream(new FileInputStream(fileName)));
+ } else {
+ inputReader = new FileReader(fileName);
+ }
+ while ((numRead = inputReader.read(tmp)) >= 0) {
+ data.append(tmp, 0, numRead);
+ }
+ } catch (FileNotFoundException e) {
+ Log.e(TAG, "License HTML file not found at " + fileName, e);
+ showErrorAndFinish();
+ return;
+ } catch (IOException e) {
+ Log.e(TAG, "Error reading license HTML file at " + fileName, e);
+ showErrorAndFinish();
+ return;
+ } finally {
+ try {
+ if (inputReader != null) {
+ inputReader.close();
+ }
+ } catch (IOException e) {
+ }
+ }
+
+ if (TextUtils.isEmpty(data)) {
+ Log.e(TAG, "License HTML is empty (from " + fileName + ")");
+ showErrorAndFinish();
+ return;
+ }
+
+ WebView webView = new WebView(this);
+
+ // Begin the loading. This will be done in a separate thread in WebView.
+ webView.loadDataWithBaseURL(null, data.toString(), "text/html", "utf-8", null);
+ webView.setWebViewClient(new WebViewClient() {
+ @Override
+ public void onPageFinished(WebView view, String url) {
+ // Change from 'Loading...' to the real title
+ mAlert.setTitle(getString(R.string.settings_license_activity_title));
+ }
+ });
+
+ final AlertController.AlertParams p = mAlertParams;
+ p.mTitle = getString(R.string.settings_license_activity_loading);
+ p.mView = webView;
+ p.mForceInverseBackground = true;
+ setupAlert();
+ }
+
+ private void showErrorAndFinish() {
+ Toast.makeText(this, R.string.settings_license_activity_unavailable, Toast.LENGTH_LONG)
+ .show();
+ finish();
+ }
+
+}
diff --git a/src/com/android/settings/SimLockSettings.java b/src/com/android/settings/SimLockSettings.java
new file mode 100644
index 0000000..286e3d6
--- /dev/null
+++ b/src/com/android/settings/SimLockSettings.java
@@ -0,0 +1,321 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.os.AsyncResult;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.CheckBoxPreference;
+import android.preference.PreferenceScreen;
+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.
+ * 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
+ 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 entering the old pin
+ private static final int SIM_OLD_MODE = 2;
+ // State when entering the new pin - first time
+ private static final int SIM_NEW_MODE = 3;
+ // State when entering the new pin - second time
+ private static final int SIM_REENTER_MODE = 4;
+
+ // Keys in xml file
+ private static final String PIN_DIALOG = "sim_pin";
+ private static final String PIN_TOGGLE = "sim_toggle";
+ // Keys in icicle
+ private static final String DIALOG_STATE = "dialogState";
+ private static final String DIALOG_PIN = "dialogPin";
+ private static final String DIALOG_ERROR = "dialogError";
+ private static final String ENABLE_TO_STATE = "enableState";
+
+ private static final int MIN_PIN_LENGTH = 4;
+ private static final int MAX_PIN_LENGTH = 8;
+ // Which dialog to show next when popped up
+ private int mDialogState = OFF_MODE;
+
+ private String mPin;
+ private String mOldPin;
+ private String mNewPin;
+ private String mError;
+ // Are we trying to enable or disable SIM lock?
+ private boolean mToState;
+
+ private Phone mPhone;
+
+ private EditPinPreference mPinDialog;
+ private CheckBoxPreference mPinToggle;
+
+ 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;
+
+ // For replies from SimCard 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);
+ break;
+ case CHANGE_SIM_PIN_COMPLETE:
+ simPinChanged(ar.exception == null);
+ break;
+ }
+
+ return;
+ }
+ };
+
+ // For top-level settings screen to query
+ static boolean isSimLockEnabled() {
+ return PhoneFactory.getDefaultPhone().getSimCard().getSimLockEnabled();
+ }
+
+ static String getSummary(Context context) {
+ Resources res = context.getResources();
+ String summary = isSimLockEnabled()
+ ? 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)) {
+ mDialogState = savedInstanceState.getInt(DIALOG_STATE);
+ mPin = savedInstanceState.getString(DIALOG_PIN);
+ mError = savedInstanceState.getString(DIALOG_ERROR);
+ mToState = savedInstanceState.getBoolean(ENABLE_TO_STATE);
+ }
+
+ mPinDialog.setOnPinEnteredListener(this);
+
+ // Don't need any changes to be remembered
+ getPreferenceScreen().setPersistent(false);
+
+ mPhone = PhoneFactory.getDefaultPhone();
+ mRes = getResources();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ mPinToggle.setChecked(mPhone.getSimCard().getSimLockEnabled());
+
+ if (mDialogState != OFF_MODE) {
+ showPinDialog();
+ } else {
+ // Prep for standard click on "Change PIN"
+ resetDialogState();
+ }
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle out) {
+ // Need to store this state for slider open/close
+ // There is one case where the dialog is popped up by the preference
+ // framework. In that case, let the preference framework store the
+ // dialog state. In other cases, where this activity manually launches
+ // the dialog, store the state of the dialog.
+ if (mPinDialog.isDialogOpen()) {
+ out.putInt(DIALOG_STATE, mDialogState);
+ out.putString(DIALOG_PIN, mPinDialog.getEditText().getText().toString());
+ out.putString(DIALOG_ERROR, mError);
+ out.putBoolean(ENABLE_TO_STATE, mToState);
+ } else {
+ super.onSaveInstanceState(out);
+ }
+ }
+
+ private void showPinDialog() {
+ if (mDialogState == OFF_MODE) {
+ return;
+ }
+ setDialogValues();
+
+ mPinDialog.showPinDialog();
+ }
+
+ private void setDialogValues() {
+ mPinDialog.setText(mPin);
+ String message = "";
+ switch (mDialogState) {
+ case SIM_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:
+ message = mRes.getString(R.string.sim_enter_old);
+ mPinDialog.setDialogTitle(mRes.getString(R.string.sim_change_pin));
+ break;
+ case SIM_NEW_MODE:
+ message = mRes.getString(R.string.sim_enter_new);
+ mPinDialog.setDialogTitle(mRes.getString(R.string.sim_change_pin));
+ break;
+ case SIM_REENTER_MODE:
+ message = mRes.getString(R.string.sim_reenter_new);
+ mPinDialog.setDialogTitle(mRes.getString(R.string.sim_change_pin));
+ break;
+ }
+ if (mError != null) {
+ message = mError + "\n" + message;
+ mError = null;
+ }
+ mPinDialog.setDialogMessage(message);
+ }
+
+ public void onPinEntered(EditPinPreference preference, boolean positiveResult) {
+ if (!positiveResult) {
+ resetDialogState();
+ return;
+ }
+
+ mPin = preference.getText();
+ if (!reasonablePin(mPin)) {
+ // inject error message and display dialog again
+ mError = mRes.getString(R.string.sim_bad_pin);
+ showPinDialog();
+ return;
+ }
+ switch (mDialogState) {
+ case SIM_LOCK_MODE:
+ tryChangeSimLockState();
+ break;
+ case SIM_OLD_MODE:
+ mOldPin = mPin;
+ mDialogState = SIM_NEW_MODE;
+ mError = null;
+ mPin = null;
+ showPinDialog();
+ break;
+ case SIM_NEW_MODE:
+ mNewPin = mPin;
+ mDialogState = SIM_REENTER_MODE;
+ mPin = null;
+ showPinDialog();
+ break;
+ case SIM_REENTER_MODE:
+ if (!mPin.equals(mNewPin)) {
+ mError = mRes.getString(R.string.sim_pins_dont_match);
+ mDialogState = SIM_NEW_MODE;
+ mPin = null;
+ showPinDialog();
+ } else {
+ mError = null;
+ tryChangePin();
+ }
+ break;
+ }
+ }
+
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+ if (preference == mPinToggle) {
+ // Get the new, preferred state
+ mToState = mPinToggle.isChecked();
+ // Flip it back and pop up pin dialog
+ mPinToggle.setChecked(!mToState);
+ mDialogState = SIM_LOCK_MODE;
+ showPinDialog();
+ }
+ return true;
+ }
+
+ private void tryChangeSimLockState() {
+ // Try to change sim 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);
+
+ }
+
+ private void simLockChanged(boolean success) {
+ if (success) {
+ mPinToggle.setChecked(mToState);
+ } else {
+ // TODO: I18N
+ Toast.makeText(this, mRes.getString(R.string.sim_lock_failed), Toast.LENGTH_SHORT)
+ .show();
+ }
+ resetDialogState();
+ }
+
+ private void simPinChanged(boolean success) {
+ if (!success) {
+ // TODO: I18N
+ 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.LENGTH_SHORT)
+ .show();
+
+ }
+ resetDialogState();
+ }
+
+ private void tryChangePin() {
+ Message callback = Message.obtain(mHandler, CHANGE_SIM_PIN_COMPLETE);
+ mPhone.getSimCard().changeSimLockPassword(mOldPin,
+ mNewPin, callback);
+ }
+
+ private boolean reasonablePin(String pin) {
+ if (pin == null || pin.length() < MIN_PIN_LENGTH || pin.length() > MAX_PIN_LENGTH) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ private void resetDialogState() {
+ mError = null;
+ mDialogState = SIM_OLD_MODE; // Default for when Change PIN is clicked
+ mPin = "";
+ setDialogValues();
+ }
+}
diff --git a/src/com/android/settings/SoundAndDisplaySettings.java b/src/com/android/settings/SoundAndDisplaySettings.java
new file mode 100644
index 0000000..53912e3
--- /dev/null
+++ b/src/com/android/settings/SoundAndDisplaySettings.java
@@ -0,0 +1,245 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
+
+import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.media.AudioManager;
+import android.os.Bundle;
+import android.os.IMountService;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceScreen;
+import android.preference.CheckBoxPreference;
+import android.provider.Settings;
+import android.util.Log;
+import android.view.IWindowManager;
+
+public class SoundAndDisplaySettings extends PreferenceActivity implements
+ Preference.OnPreferenceChangeListener {
+ private static final String TAG = "SoundAndDisplaysSettings";
+
+ /** If there is no setting in the provider, use this. */
+ private static final int FALLBACK_SCREEN_TIMEOUT_VALUE = 30000;
+
+ private static final String KEY_SILENT = "silent";
+ private static final String KEY_VIBRATE = "vibrate";
+ private static final String KEY_SCREEN_TIMEOUT = "screen_timeout";
+ private static final String KEY_DTMF_TONE = "dtmf_tone";
+ private static final String KEY_SOUND_EFFECTS = "sound_effects";
+ private static final String KEY_ANIMATIONS = "animations";
+ private static final String KEY_PLAY_MEDIA_NOTIFICATION_SOUNDS = "play_media_notification_sounds";
+
+ private CheckBoxPreference mSilent;
+
+ private CheckBoxPreference mPlayMediaNotificationSounds;
+
+ private IMountService mMountService = null;
+
+ /*
+ * If we are currently in one of the silent modes (the ringer mode is set to either
+ * "silent mode" or "vibrate mode"), then toggling the "Phone vibrate"
+ * preference will switch between "silent mode" and "vibrate mode".
+ * Otherwise, it will adjust the normal ringer mode's ring or ring+vibrate
+ * setting.
+ */
+ private CheckBoxPreference mVibrate;
+ private CheckBoxPreference mDtmfTone;
+ private CheckBoxPreference mSoundEffects;
+ private CheckBoxPreference mAnimations;
+ private float[] mAnimationScales;
+
+ private AudioManager mAudioManager;
+
+ private IWindowManager mWindowManager;
+
+ private BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ updateState(false);
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ContentResolver resolver = getContentResolver();
+
+ mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+ mWindowManager = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
+
+ mMountService = IMountService.Stub.asInterface(ServiceManager.getService("mount"));
+
+ addPreferencesFromResource(R.xml.sound_and_display_settings);
+
+ mSilent = (CheckBoxPreference) findPreference(KEY_SILENT);
+ mPlayMediaNotificationSounds = (CheckBoxPreference) findPreference(KEY_PLAY_MEDIA_NOTIFICATION_SOUNDS);
+
+ mVibrate = (CheckBoxPreference) findPreference(KEY_VIBRATE);
+ mDtmfTone = (CheckBoxPreference) findPreference(KEY_DTMF_TONE);
+ mDtmfTone.setPersistent(false);
+ mDtmfTone.setChecked(Settings.System.getInt(resolver,
+ Settings.System.DTMF_TONE_WHEN_DIALING, 1) != 0);
+ mSoundEffects = (CheckBoxPreference) findPreference(KEY_SOUND_EFFECTS);
+ mSoundEffects.setPersistent(false);
+ mSoundEffects.setChecked(Settings.System.getInt(resolver,
+ Settings.System.SOUND_EFFECTS_ENABLED, 0) != 0);
+ mAnimations = (CheckBoxPreference) findPreference(KEY_ANIMATIONS);
+ mAnimations.setPersistent(false);
+
+ ListPreference screenTimeoutPreference =
+ (ListPreference) findPreference(KEY_SCREEN_TIMEOUT);
+ screenTimeoutPreference.setValue(String.valueOf(Settings.System.getInt(
+ resolver, SCREEN_OFF_TIMEOUT, FALLBACK_SCREEN_TIMEOUT_VALUE)));
+ screenTimeoutPreference.setOnPreferenceChangeListener(this);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ updateState(true);
+
+ IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION);
+ registerReceiver(mReceiver, filter);
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+
+ unregisterReceiver(mReceiver);
+ }
+
+ private void updateState(boolean force) {
+ final int ringerMode = mAudioManager.getRingerMode();
+ final boolean silentOrVibrateMode =
+ ringerMode != AudioManager.RINGER_MODE_NORMAL;
+
+ if (silentOrVibrateMode != mSilent.isChecked() || force) {
+ mSilent.setChecked(silentOrVibrateMode);
+ }
+
+ try {
+ mPlayMediaNotificationSounds.setChecked(mMountService.getPlayNotificationSounds());
+ } catch (RemoteException e) {
+ }
+
+ boolean vibrateSetting;
+ if (silentOrVibrateMode) {
+ vibrateSetting = ringerMode == AudioManager.RINGER_MODE_VIBRATE;
+ } else {
+ vibrateSetting = mAudioManager.getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER)
+ == AudioManager.VIBRATE_SETTING_ON;
+ }
+ if (vibrateSetting != mVibrate.isChecked() || force) {
+ mVibrate.setChecked(vibrateSetting);
+ }
+
+ boolean animations = true;
+ try {
+ mAnimationScales = mWindowManager.getAnimationScales();
+ } catch (RemoteException e) {
+ }
+ if (mAnimationScales != null) {
+ for (int i=0; i<mAnimationScales.length; i++) {
+ if (mAnimationScales[i] == 0) {
+ animations = false;
+ break;
+ }
+ }
+ }
+ if (animations != mAnimations.isChecked() || force) {
+ mAnimations.setChecked(animations);
+ }
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+
+ if (preference == mSilent) {
+ final boolean silent = mSilent.isChecked();
+ mAudioManager.setRingerMode(silent ? AudioManager.RINGER_MODE_SILENT
+ : AudioManager.RINGER_MODE_NORMAL);
+ updateState(false);
+
+ } else if (preference == mPlayMediaNotificationSounds) {
+ try {
+ mMountService.setPlayNotificationSounds(mPlayMediaNotificationSounds.isChecked());
+ } catch (RemoteException e) {
+ }
+ } else if (preference == mVibrate) {
+ final boolean vibrate = mVibrate.isChecked();
+ final boolean silent = mSilent.isChecked();
+
+ if (silent) {
+ mAudioManager.setRingerMode(vibrate ? AudioManager.RINGER_MODE_VIBRATE :
+ AudioManager.RINGER_MODE_SILENT);
+ } else {
+ mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
+ vibrate ? AudioManager.VIBRATE_SETTING_ON
+ : AudioManager.VIBRATE_SETTING_OFF);
+ }
+
+ } else if (preference == mDtmfTone) {
+ Settings.System.putInt(getContentResolver(), Settings.System.DTMF_TONE_WHEN_DIALING,
+ mDtmfTone.isChecked() ? 1 : 0);
+
+ } else if (preference == mSoundEffects) {
+ if (mSoundEffects.isChecked()) {
+ mAudioManager.loadSoundEffects();
+ } else {
+ mAudioManager.unloadSoundEffects();
+ }
+ Settings.System.putInt(getContentResolver(), Settings.System.SOUND_EFFECTS_ENABLED,
+ mSoundEffects.isChecked() ? 1 : 0);
+
+ } else if (preference == mAnimations) {
+ for (int i=0; i<mAnimationScales.length; i++) {
+ mAnimationScales[i] = mAnimations.isChecked() ? 1 : 0;
+ }
+ try {
+ mWindowManager.setAnimationScales(mAnimationScales);
+ } catch (RemoteException e) {
+ }
+ }
+ return true;
+ }
+
+ public boolean onPreferenceChange(Preference preference, Object objValue) {
+ if (KEY_SCREEN_TIMEOUT.equals(preference.getKey())) {
+ int value = Integer.parseInt((String) objValue);
+ try {
+ Settings.System.putInt(getContentResolver(),
+ SCREEN_OFF_TIMEOUT, value);
+ } catch (NumberFormatException e) {
+ Log.e(TAG, "could not persist screen timeout setting", e);
+ }
+ }
+
+ return true;
+ }
+
+}
diff --git a/src/com/android/settings/TestingSettings.java b/src/com/android/settings/TestingSettings.java
new file mode 100644
index 0000000..3994560
--- /dev/null
+++ b/src/com/android/settings/TestingSettings.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.os.Bundle;
+import android.preference.PreferenceActivity;
+
+public class TestingSettings extends PreferenceActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ addPreferencesFromResource(R.xml.testing_settings);
+ }
+
+}
diff --git a/src/com/android/settings/TestingSettingsBroadcastReceiver.java b/src/com/android/settings/TestingSettingsBroadcastReceiver.java
new file mode 100644
index 0000000..c6cd7e1
--- /dev/null
+++ b/src/com/android/settings/TestingSettingsBroadcastReceiver.java
@@ -0,0 +1,28 @@
+package com.android.settings;
+
+import android.provider.Telephony;
+import static android.provider.Telephony.Intents.SECRET_CODE_ACTION;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.BroadcastReceiver;
+import android.util.Config;
+import android.util.Log;
+import android.view.KeyEvent;
+
+
+public class TestingSettingsBroadcastReceiver extends BroadcastReceiver {
+
+ public TestingSettingsBroadcastReceiver() {
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getAction().equals(SECRET_CODE_ACTION)) {
+ Intent i = new Intent(Intent.ACTION_MAIN);
+ i.setClass(context, TestingSettings.class);
+ i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ context.startActivity(i);
+ }
+ }
+}
diff --git a/src/com/android/settings/UsageStats.java b/src/com/android/settings/UsageStats.java
new file mode 100755
index 0000000..89caa54
--- /dev/null
+++ b/src/com/android/settings/UsageStats.java
@@ -0,0 +1,249 @@
+
+
+/**
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.android.settings;
+
+import com.android.internal.app.IUsageStats;
+import com.android.settings.R;
+import android.app.Activity;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import com.android.internal.os.PkgUsageStats;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
+import android.widget.ListView;
+import android.widget.Spinner;
+import android.widget.TextView;
+import android.widget.AdapterView.OnItemSelectedListener;
+
+/**
+ * Activity to display package usage statistics.
+ */
+public class UsageStats extends Activity implements OnItemSelectedListener {
+ private static final String TAG="UsageStatsActivity";
+ private static final boolean localLOGV = true;
+ private Spinner mTypeSpinner;
+ private ListView mListView;
+ private IUsageStats mUsageStatsService;
+ private LayoutInflater mInflater;
+ private UsageStatsAdapter mAdapter;
+ private PackageManager mPm;
+
+ public static class AppNameComparator implements Comparator<PkgUsageStats> {
+ Map<String, CharSequence> mAppLabelList;
+ AppNameComparator(Map<String, CharSequence> appList) {
+ mAppLabelList = appList;
+ }
+ public final int compare(PkgUsageStats a, PkgUsageStats b) {
+ String alabel = mAppLabelList.get(a.packageName).toString();
+ String blabel = mAppLabelList.get(b.packageName).toString();
+ return alabel.compareTo(blabel);
+ }
+ }
+
+ public static class LaunchCountComparator implements Comparator<PkgUsageStats> {
+ public final int compare(PkgUsageStats a, PkgUsageStats b) {
+ // return by descending order
+ return b.launchCount - a.launchCount;
+ }
+ }
+
+ public static class UsageTimeComparator implements Comparator<PkgUsageStats> {
+ public final int compare(PkgUsageStats a, PkgUsageStats b) {
+ long ret = a.usageTime-b.usageTime;
+ if (ret == 0) {
+ return 0;
+ }
+ if (ret < 0) {
+ return 1;
+ }
+ return -1;
+ }
+ }
+
+ // View Holder used when displaying views
+ static class AppViewHolder {
+ TextView pkgName;
+ TextView launchCount;
+ TextView usageTime;
+ }
+
+ class UsageStatsAdapter extends BaseAdapter {
+ // Constants defining order for display order
+ private static final int _DISPLAY_ORDER_USAGE_TIME = 0;
+ private static final int _DISPLAY_ORDER_LAUNCH_COUNT = 1;
+ private static final int _DISPLAY_ORDER_APP_NAME = 2;
+
+ private int mDisplayOrder = _DISPLAY_ORDER_USAGE_TIME;
+ private List<PkgUsageStats> mUsageStats;
+ private LaunchCountComparator mLaunchCountComparator;
+ private UsageTimeComparator mUsageTimeComparator;
+ private AppNameComparator mAppLabelComparator;
+ private HashMap<String, CharSequence> mAppLabelMap;
+
+ UsageStatsAdapter() {
+ mUsageStats = new ArrayList<PkgUsageStats>();
+ mAppLabelMap = new HashMap<String, CharSequence>();
+ PkgUsageStats[] stats;
+ try {
+ stats = mUsageStatsService.getAllPkgUsageStats();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed initializing usage stats service");
+ return;
+ }
+ if (stats == null) {
+ return;
+ }
+ for (PkgUsageStats ps : stats) {
+ mUsageStats.add(ps);
+ // load application labels for each application
+ CharSequence label;
+ try {
+ ApplicationInfo appInfo = mPm.getApplicationInfo(ps.packageName, 0);
+ label = appInfo.loadLabel(mPm);
+ } catch (NameNotFoundException e) {
+ label = ps.packageName;
+ }
+ mAppLabelMap.put(ps.packageName, label);
+ }
+ // Sort list
+ mLaunchCountComparator = new LaunchCountComparator();
+ mUsageTimeComparator = new UsageTimeComparator();
+ mAppLabelComparator = new AppNameComparator(mAppLabelMap);
+ sortList();
+ }
+ public int getCount() {
+ return mUsageStats.size();
+ }
+
+ public Object getItem(int position) {
+ return mUsageStats.get(position);
+ }
+
+ public long getItemId(int position) {
+ return position;
+ }
+
+ public View getView(int position, View convertView, ViewGroup parent) {
+ // A ViewHolder keeps references to children views to avoid unneccessary calls
+ // to findViewById() on each row.
+ AppViewHolder holder;
+
+ // When convertView is not null, we can reuse it directly, there is no need
+ // to reinflate it. We only inflate a new View when the convertView supplied
+ // by ListView is null.
+ if (convertView == null) {
+ convertView = mInflater.inflate(R.layout.usage_stats_item, null);
+
+ // Creates a ViewHolder and store references to the two children views
+ // we want to bind data to.
+ holder = new AppViewHolder();
+ holder.pkgName = (TextView) convertView.findViewById(R.id.package_name);
+ holder.launchCount = (TextView) convertView.findViewById(R.id.launch_count);
+ holder.usageTime = (TextView) convertView.findViewById(R.id.usage_time);
+ convertView.setTag(holder);
+ } else {
+ // Get the ViewHolder back to get fast access to the TextView
+ // and the ImageView.
+ holder = (AppViewHolder) convertView.getTag();
+ }
+
+ // Bind the data efficiently with the holder
+ PkgUsageStats pkgStats = mUsageStats.get(position);
+ if (pkgStats != null) {
+ CharSequence label = mAppLabelMap.get(pkgStats.packageName);
+ holder.pkgName.setText(label);
+ holder.launchCount.setText(String.valueOf(pkgStats.launchCount));
+ holder.usageTime.setText(String.valueOf(pkgStats.usageTime)+" ms");
+ } else {
+ Log.w(TAG, "No usage stats info for package:"+pkgStats.packageName);
+ }
+ return convertView;
+ }
+
+ void sortList(int sortOrder) {
+ if (mDisplayOrder == sortOrder) {
+ // do nothing
+ return;
+ }
+ mDisplayOrder= sortOrder;
+ sortList();
+ }
+ private void sortList() {
+ if (mDisplayOrder == _DISPLAY_ORDER_USAGE_TIME) {
+ if (localLOGV) Log.i(TAG, "Sorting by usage time");
+ Collections.sort(mUsageStats, mUsageTimeComparator);
+ } else if (mDisplayOrder == _DISPLAY_ORDER_LAUNCH_COUNT) {
+ if (localLOGV) Log.i(TAG, "Sorting launch count");
+ Collections.sort(mUsageStats, mLaunchCountComparator);
+ } else if (mDisplayOrder == _DISPLAY_ORDER_APP_NAME) {
+ if (localLOGV) Log.i(TAG, "Sorting by application name");
+ Collections.sort(mUsageStats, mAppLabelComparator);
+ }
+ notifyDataSetChanged();
+ }
+ }
+
+ /** Called when the activity is first created. */
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ mUsageStatsService = IUsageStats.Stub.asInterface(ServiceManager.getService("usagestats"));
+ if (mUsageStatsService == null) {
+ Log.e(TAG, "Failed to retrieve usagestats service");
+ return;
+ }
+ mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ mPm = getPackageManager();
+
+ setContentView(R.layout.usage_stats);
+ mTypeSpinner = (Spinner) findViewById(R.id.typeSpinner);
+ mTypeSpinner.setOnItemSelectedListener(this);
+
+ mListView = (ListView) findViewById(R.id.pkg_list);
+ // Initialize the inflater
+
+ mAdapter = new UsageStatsAdapter();
+ mListView.setAdapter(mAdapter);
+ }
+
+ public void onItemSelected(AdapterView<?> parent, View view, int position,
+ long id) {
+ mAdapter.sortList(position);
+ }
+
+ public void onNothingSelected(AdapterView<?> parent) {
+ // do nothing
+ }
+}
+
diff --git a/src/com/android/settings/UserDictionarySettings.java b/src/com/android/settings/UserDictionarySettings.java
new file mode 100644
index 0000000..aeddcf7
--- /dev/null
+++ b/src/com/android/settings/UserDictionarySettings.java
@@ -0,0 +1,271 @@
+/**
+ * Copyright (C) 2007 Google Inc.
+ *
+ * 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.Dialog;
+import android.app.ListActivity;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.database.Cursor;
+import android.os.Bundle;
+import android.provider.UserDictionary;
+import android.text.InputType;
+import android.view.ContextMenu;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ContextMenu.ContextMenuInfo;
+import android.widget.AlphabetIndexer;
+import android.widget.EditText;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.SectionIndexer;
+import android.widget.SimpleCursorAdapter;
+import android.widget.TextView;
+import android.widget.AdapterView.AdapterContextMenuInfo;
+
+import java.util.Locale;
+
+public class UserDictionarySettings extends ListActivity {
+
+ private static final String INSTANCE_KEY_DIALOG_EDITING_WORD = "DIALOG_EDITING_WORD";
+ private static final String INSTANCE_KEY_ADDED_WORD = "DIALOG_ADDED_WORD";
+
+ private static final String[] QUERY_PROJECTION = {
+ UserDictionary.Words._ID, UserDictionary.Words.WORD
+ };
+
+ // Either the locale is empty (means the word is applicable to all locales)
+ // or the word equals our current locale
+ private static final String QUERY_SELECTION = UserDictionary.Words.LOCALE + "=? OR "
+ + UserDictionary.Words.LOCALE + " is null";
+
+ private static final String DELETE_SELECTION = UserDictionary.Words.WORD + "=?";
+
+ private static final String EXTRA_WORD = "word";
+
+ private static final int CONTEXT_MENU_EDIT = Menu.FIRST;
+ private static final int CONTEXT_MENU_DELETE = Menu.FIRST + 1;
+
+ private static final int OPTIONS_MENU_ADD = Menu.FIRST;
+
+ private static final int DIALOG_ADD_OR_EDIT = 0;
+
+ /** The word being edited in the dialog (null means the user is adding a word). */
+ private String mDialogEditingWord;
+
+ private Cursor mCursor;
+
+ private boolean mAddedWordAlready;
+ private boolean mAutoReturn;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setContentView(R.layout.list_content_with_empty_view);
+
+ mCursor = createCursor();
+ setListAdapter(createAdapter());
+
+ TextView emptyView = (TextView) findViewById(R.id.empty);
+ emptyView.setText(R.string.user_dict_settings_empty_text);
+
+ ListView listView = getListView();
+ listView.setFastScrollEnabled(true);
+ listView.setEmptyView(emptyView);
+
+ registerForContextMenu(listView);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ if (!mAddedWordAlready
+ && getIntent().getAction().equals("com.android.settings.USER_DICTIONARY_INSERT")) {
+ String word = getIntent().getStringExtra(EXTRA_WORD);
+ mAutoReturn = true;
+ if (word != null) {
+ showAddOrEditDialog(word);
+ }
+ }
+ }
+ @Override
+ protected void onRestoreInstanceState(Bundle state) {
+ super.onRestoreInstanceState(state);
+ mDialogEditingWord = state.getString(INSTANCE_KEY_DIALOG_EDITING_WORD);
+ mAddedWordAlready = state.getBoolean(INSTANCE_KEY_ADDED_WORD, false);
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putString(INSTANCE_KEY_DIALOG_EDITING_WORD, mDialogEditingWord);
+ outState.putBoolean(INSTANCE_KEY_ADDED_WORD, mAddedWordAlready);
+ }
+
+ private Cursor createCursor() {
+ String currentLocale = Locale.getDefault().toString();
+ // Case-insensitive sort
+ return managedQuery(UserDictionary.Words.CONTENT_URI, QUERY_PROJECTION,
+ QUERY_SELECTION, new String[] { currentLocale },
+ "UPPER(" + UserDictionary.Words.WORD + ")");
+ }
+
+ private ListAdapter createAdapter() {
+ return new MyAdapter(this,
+ android.R.layout.simple_list_item_1, mCursor,
+ new String[] { UserDictionary.Words.WORD },
+ new int[] { android.R.id.text1 });
+ }
+
+ @Override
+ protected void onListItemClick(ListView l, View v, int position, long id) {
+ showAddOrEditDialog(getWord(position));
+ }
+
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
+ if (!(menuInfo instanceof AdapterContextMenuInfo)) return;
+
+ AdapterContextMenuInfo adapterMenuInfo = (AdapterContextMenuInfo) menuInfo;
+ menu.setHeaderTitle(getWord(adapterMenuInfo.position));
+ menu.add(0, CONTEXT_MENU_EDIT, 0, R.string.user_dict_settings_context_menu_edit_title);
+ menu.add(0, CONTEXT_MENU_DELETE, 0, R.string.user_dict_settings_context_menu_delete_title);
+ }
+
+ @Override
+ public boolean onContextItemSelected(MenuItem item) {
+ ContextMenuInfo menuInfo = item.getMenuInfo();
+ if (!(menuInfo instanceof AdapterContextMenuInfo)) return false;
+
+ AdapterContextMenuInfo adapterMenuInfo = (AdapterContextMenuInfo) menuInfo;
+ String word = getWord(adapterMenuInfo.position);
+
+ switch (item.getItemId()) {
+ case CONTEXT_MENU_DELETE:
+ deleteWord(word);
+ return true;
+
+ case CONTEXT_MENU_EDIT:
+ showAddOrEditDialog(word);
+ return true;
+ }
+
+ return false;
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ menu.add(0, OPTIONS_MENU_ADD, 0, R.string.user_dict_settings_add_menu_title)
+ .setIcon(R.drawable.ic_menu_add);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ showAddOrEditDialog(null);
+ return true;
+ }
+
+ private void showAddOrEditDialog(String editingWord) {
+ mDialogEditingWord = editingWord;
+ showDialog(DIALOG_ADD_OR_EDIT);
+ }
+
+ private String getWord(int position) {
+ mCursor.moveToPosition(position);
+ return mCursor.getString(
+ mCursor.getColumnIndexOrThrow(UserDictionary.Words.WORD));
+ }
+
+ @Override
+ protected Dialog onCreateDialog(int id) {
+ View content = getLayoutInflater().inflate(R.layout.dialog_edittext, null);
+ final EditText editText = (EditText) content.findViewById(R.id.edittext);
+ // No prediction in soft keyboard mode. TODO: Create a better way to disable prediction
+ editText.setInputType(InputType.TYPE_CLASS_TEXT
+ | InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE);
+
+ return new AlertDialog.Builder(this)
+ .setTitle(R.string.user_dict_settings_add_dialog_title)
+ .setView(content)
+ .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ onAddOrEditFinished(editText.getText().toString());
+ if (mAutoReturn) finish();
+ }})
+ .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ if (mAutoReturn) finish();
+ }})
+ .create();
+ }
+
+ @Override
+ protected void onPrepareDialog(int id, Dialog d) {
+ AlertDialog dialog = (AlertDialog) d;
+ EditText editText = (EditText) dialog.findViewById(R.id.edittext);
+ editText.setText(mDialogEditingWord);
+ }
+
+ private void onAddOrEditFinished(String word) {
+ if (mDialogEditingWord != null) {
+ // The user was editing a word, so do a delete/add
+ deleteWord(mDialogEditingWord);
+ }
+
+ // Disallow duplicates
+ deleteWord(word);
+
+ // TODO: present UI for picking whether to add word to all locales, or current.
+ UserDictionary.Words.addWord(this, word.toString(),
+ 250, UserDictionary.Words.LOCALE_TYPE_ALL);
+ mCursor.requery();
+ mAddedWordAlready = true;
+ }
+
+ private void deleteWord(String word) {
+ getContentResolver().delete(UserDictionary.Words.CONTENT_URI, DELETE_SELECTION,
+ new String[] { word });
+ }
+
+ private static class MyAdapter extends SimpleCursorAdapter implements SectionIndexer {
+ private AlphabetIndexer mIndexer;
+
+ public MyAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
+ super(context, layout, c, from, to);
+
+ int wordColIndex = c.getColumnIndexOrThrow(UserDictionary.Words.WORD);
+ String alphabet = context.getString(com.android.internal.R.string.fast_scroll_alphabet);
+ mIndexer = new AlphabetIndexer(c, wordColIndex, alphabet);
+ }
+
+ public int getPositionForSection(int section) {
+ return mIndexer.getPositionForSection(section);
+ }
+
+ public int getSectionForPosition(int position) {
+ return mIndexer.getSectionForPosition(position);
+ }
+
+ public Object[] getSections() {
+ return mIndexer.getSections();
+ }
+ }
+}
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
new file mode 100644
index 0000000..a23272b
--- /dev/null
+++ b/src/com/android/settings/Utils.java
@@ -0,0 +1,91 @@
+/**
+ * Copyright (C) 2007 Google Inc.
+ *
+ * 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.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.preference.Preference;
+import android.preference.PreferenceGroup;
+
+import java.util.List;
+
+public class Utils {
+
+ /**
+ * Set the preference's title to the matching activity's label.
+ */
+ public static final int UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY = 1;
+
+ /**
+ * Finds a matching activity for a preference's intent. If a matching
+ * activity is not found, it will remove the preference.
+ *
+ * @param context The context.
+ * @param parentPreferenceGroup The preference group that contains the
+ * preference whose intent is being resolved.
+ * @param preferenceKey The key of the preference whose intent is being
+ * resolved.
+ * @param flags 0 or one or more of
+ * {@link #UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY}
+ * .
+ * @return Whether an activity was found. If false, the preference was
+ * removed.
+ */
+ public static boolean updatePreferenceToSpecificActivityOrRemove(Context context,
+ PreferenceGroup parentPreferenceGroup, String preferenceKey, int flags) {
+
+ Preference preference = parentPreferenceGroup.findPreference(preferenceKey);
+ if (preference == null) {
+ return false;
+ }
+
+ Intent intent = preference.getIntent();
+ if (intent != null) {
+ // Find the activity that is in the system image
+ PackageManager pm = context.getPackageManager();
+ List<ResolveInfo> list = pm.queryIntentActivities(intent, 0);
+ int listSize = list.size();
+ for (int i = 0; i < listSize; i++) {
+ ResolveInfo resolveInfo = list.get(i);
+ if ((resolveInfo.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)
+ != 0) {
+
+ // Replace the intent with this specific activity
+ preference.setIntent(new Intent().setClassName(
+ resolveInfo.activityInfo.packageName,
+ resolveInfo.activityInfo.name));
+
+ if ((flags & UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY) != 0) {
+ // Set the preference title to the activity's label
+ preference.setTitle(resolveInfo.loadLabel(pm));
+ }
+
+ return true;
+ }
+ }
+ }
+
+ // Did not find a matching activity, so remove the preference
+ parentPreferenceGroup.removePreference(preference);
+
+ return true;
+ }
+
+}
diff --git a/src/com/android/settings/WirelessSettings.java b/src/com/android/settings/WirelessSettings.java
new file mode 100644
index 0000000..d112915
--- /dev/null
+++ b/src/com/android/settings/WirelessSettings.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import com.android.settings.bluetooth.BluetoothEnabler;
+import com.android.settings.wifi.WifiEnabler;
+
+import android.net.wifi.WifiManager;
+import android.os.Bundle;
+import android.preference.PreferenceActivity;
+import android.preference.CheckBoxPreference;
+
+public class WirelessSettings extends PreferenceActivity {
+
+ private static final String KEY_TOGGLE_AIRPLANE = "toggle_airplane";
+ private static final String KEY_TOGGLE_BLUETOOTH = "toggle_bluetooth";
+ private static final String KEY_TOGGLE_WIFI = "toggle_wifi";
+
+ private WifiEnabler mWifiEnabler;
+ private AirplaneModeEnabler mAirplaneModeEnabler;
+ private BluetoothEnabler mBtEnabler;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ addPreferencesFromResource(R.xml.wireless_settings);
+
+ initToggles();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ mWifiEnabler.resume();
+ mAirplaneModeEnabler.resume();
+ mBtEnabler.resume();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+
+ mWifiEnabler.pause();
+ mAirplaneModeEnabler.pause();
+ mBtEnabler.pause();
+ }
+
+ private void initToggles() {
+
+ mWifiEnabler = new WifiEnabler(
+ this,
+ (WifiManager) getSystemService(WIFI_SERVICE),
+ (CheckBoxPreference) findPreference(KEY_TOGGLE_WIFI));
+
+ mAirplaneModeEnabler = new AirplaneModeEnabler(
+ this,
+ (CheckBoxPreference) findPreference(KEY_TOGGLE_AIRPLANE));
+
+ mBtEnabler = new BluetoothEnabler(
+ this,
+ (CheckBoxPreference) findPreference(KEY_TOGGLE_BLUETOOTH));
+ }
+
+}
diff --git a/src/com/android/settings/ZoneList.java b/src/com/android/settings/ZoneList.java
new file mode 100644
index 0000000..2877f00
--- /dev/null
+++ b/src/com/android/settings/ZoneList.java
@@ -0,0 +1,273 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.app.AlarmManager;
+import android.app.ListActivity;
+import android.content.Context;
+import android.content.res.XmlResourceParser;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.SimpleAdapter;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+
+/**
+ * This activity displays a list of time zones that match a filter string
+ * such as "Africa", "Europe", etc. Choosing an item from the list will set
+ * the time zone. Pressing Back without choosing from the list will not
+ * result in a change in the time zone setting.
+ */
+public class ZoneList extends ListActivity {
+
+ private static final String TAG = "ZoneList";
+ private static final String KEY_ID = "id";
+ private static final String KEY_DISPLAYNAME = "name";
+ private static final String KEY_GMT = "gmt";
+ private static final String KEY_OFFSET = "offset";
+ private static final String XMLTAG_TIMEZONE = "timezone";
+
+ private static final int HOURS_1 = 60 * 60000;
+ private static final int HOURS_24 = 24 * HOURS_1;
+ private static final int HOURS_HALF = HOURS_1 / 2;
+
+ private static final int MENU_TIMEZONE = Menu.FIRST+1;
+ private static final int MENU_ALPHABETICAL = Menu.FIRST;
+
+ // Initial focus position
+ private int mDefault;
+
+ private boolean mSortedByTimezone;
+
+ private SimpleAdapter mTimezoneSortedAdapter;
+ private SimpleAdapter mAlphabeticalAdapter;
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ String[] from = new String[] {KEY_DISPLAYNAME, KEY_GMT};
+ int[] to = new int[] {android.R.id.text1, android.R.id.text2};
+
+ MyComparator comparator = new MyComparator(KEY_OFFSET);
+
+ List<HashMap> timezoneSortedList = getZones();
+ Collections.sort(timezoneSortedList, comparator);
+ mTimezoneSortedAdapter = new SimpleAdapter(this,
+ (List) timezoneSortedList,
+ android.R.layout.simple_list_item_2,
+ from,
+ to);
+
+ List<HashMap> alphabeticalList = new ArrayList<HashMap>(timezoneSortedList);
+ comparator.setSortingKey(KEY_DISPLAYNAME);
+ Collections.sort(alphabeticalList, comparator);
+ mAlphabeticalAdapter = new SimpleAdapter(this,
+ (List) alphabeticalList,
+ android.R.layout.simple_list_item_2,
+ from,
+ to);
+
+ // Sets the adapter
+ setSorting(true);
+
+ // If current timezone is in this list, move focus to it
+ setSelection(mDefault);
+
+ // Assume user may press Back
+ setResult(RESULT_CANCELED);
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ menu.add(0, MENU_ALPHABETICAL, 0, R.string.zone_list_menu_sort_alphabetically)
+ .setIcon(android.R.drawable.ic_menu_sort_alphabetically);
+ menu.add(0, MENU_TIMEZONE, 0, R.string.zone_list_menu_sort_by_timezone)
+ .setIcon(R.drawable.ic_menu_3d_globe);
+
+ return true;
+ }
+
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+
+ if (mSortedByTimezone) {
+ menu.findItem(MENU_TIMEZONE).setVisible(false);
+ menu.findItem(MENU_ALPHABETICAL).setVisible(true);
+ } else {
+ menu.findItem(MENU_TIMEZONE).setVisible(true);
+ menu.findItem(MENU_ALPHABETICAL).setVisible(false);
+ }
+
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+
+ case MENU_TIMEZONE:
+ setSorting(true);
+ return true;
+
+ case MENU_ALPHABETICAL:
+ setSorting(false);
+ return true;
+
+ default:
+ return false;
+ }
+ }
+
+ private void setSorting(boolean timezone) {
+ setListAdapter(timezone ? mTimezoneSortedAdapter : mAlphabeticalAdapter);
+ mSortedByTimezone = timezone;
+ }
+
+ private List<HashMap> getZones() {
+ List<HashMap> myData = new ArrayList<HashMap>();
+ long date = Calendar.getInstance().getTimeInMillis();
+ try {
+ XmlResourceParser xrp = getResources().getXml(R.xml.timezones);
+ while (xrp.next() != XmlResourceParser.START_TAG)
+ ;
+ xrp.next();
+ while (xrp.getEventType() != XmlResourceParser.END_TAG) {
+ while (xrp.getEventType() != XmlResourceParser.START_TAG) {
+ if (xrp.getEventType() == XmlResourceParser.END_DOCUMENT) {
+ return myData;
+ }
+ xrp.next();
+ }
+ if (xrp.getName().equals(XMLTAG_TIMEZONE)) {
+ String id = xrp.getAttributeValue(0);
+ String displayName = xrp.nextText();
+ addItem(myData, id, displayName, date);
+ }
+ while (xrp.getEventType() != XmlResourceParser.END_TAG) {
+ xrp.next();
+ }
+ xrp.next();
+ }
+ xrp.close();
+ } catch (XmlPullParserException xppe) {
+ Log.e(TAG, "Ill-formatted timezones.xml file");
+ } catch (java.io.IOException ioe) {
+ Log.e(TAG, "Unable to read timezones.xml file");
+ }
+
+ return myData;
+ }
+
+ protected void addItem(List<HashMap> myData, String id, String displayName,
+ long date) {
+ HashMap map = new HashMap();
+ map.put(KEY_ID, id);
+ map.put(KEY_DISPLAYNAME, displayName);
+ TimeZone tz = TimeZone.getTimeZone(id);
+ int offset = tz.getOffset(date);
+ int p = Math.abs(offset);
+ StringBuilder name = new StringBuilder();
+ name.append("GMT");
+
+ if (offset < 0) {
+ name.append('-');
+ } else {
+ name.append('+');
+ }
+
+ name.append(p / (HOURS_1));
+ name.append(':');
+
+ int min = p / 60000;
+ min %= 60;
+
+ if (min < 10) {
+ name.append('0');
+ }
+ name.append(min);
+
+ map.put(KEY_GMT, name.toString());
+ map.put(KEY_OFFSET, offset);
+
+ if (id.equals(TimeZone.getDefault().getID())) {
+ mDefault = myData.size();
+ }
+
+ myData.add(map);
+ }
+
+ @Override
+ protected void onListItemClick(ListView l, View v, int position, long id) {
+ Map map = (Map) l.getItemAtPosition(position);
+ // Update the system timezone value
+ AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
+ alarm.setTimeZone((String) map.get(KEY_ID));
+ setResult(RESULT_OK);
+ finish();
+ }
+
+ private static class MyComparator implements Comparator<HashMap> {
+ private String mSortingKey;
+
+ public MyComparator(String sortingKey) {
+ mSortingKey = sortingKey;
+ }
+
+ public void setSortingKey(String sortingKey) {
+ mSortingKey = sortingKey;
+ }
+
+ public int compare(HashMap map1, HashMap map2) {
+ Object value1 = map1.get(mSortingKey);
+ Object value2 = map2.get(mSortingKey);
+
+ /*
+ * This should never happen, but just in-case, put non-comparable
+ * items at the end.
+ */
+ if (!isComparable(value1)) {
+ return isComparable(value2) ? 1 : 0;
+ } else if (!isComparable(value2)) {
+ return -1;
+ }
+
+ return ((Comparable) value1).compareTo(value2);
+ }
+
+ private boolean isComparable(Object value) {
+ return (value != null) && (value instanceof Comparable);
+ }
+ }
+
+}
diff --git a/src/com/android/settings/ZonePicker.java b/src/com/android/settings/ZonePicker.java
new file mode 100644
index 0000000..def5036
--- /dev/null
+++ b/src/com/android/settings/ZonePicker.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.app.ListActivity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class ZonePicker extends ListActivity {
+
+ private ArrayAdapter<CharSequence> mFilterAdapter;
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ mFilterAdapter = ArrayAdapter.createFromResource(this,
+ R.array.timezone_filters, android.R.layout.simple_list_item_1);
+ setListAdapter(mFilterAdapter);
+ }
+
+ protected void addItem(List<Map> data, String name, String zone) {
+ HashMap temp = new HashMap();
+ temp.put("title", name);
+ temp.put("zone", zone);
+ data.add(temp);
+ }
+
+ @Override
+ protected void onListItemClick(ListView l, View v, int position, long id) {
+ String filter = (String) mFilterAdapter.getItem(position);
+ // If All is chosen, reset the filter
+ if (filter.equals("All")) {
+ filter = null;
+ }
+ Intent zoneList = new Intent();
+ zoneList.setClass(this, ZoneList.class);
+ zoneList.putExtra("filter", filter);
+
+ startActivityForResult(zoneList, 0);
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ // If subactivity has resulted in a timezone selection, close this act.
+ if (resultCode == RESULT_OK) {
+ finish();
+ }
+ }
+}
diff --git a/src/com/android/settings/battery_history/BatteryHistory.java b/src/com/android/settings/battery_history/BatteryHistory.java
new file mode 100644
index 0000000..dcf6cbf
--- /dev/null
+++ b/src/com/android/settings/battery_history/BatteryHistory.java
@@ -0,0 +1,861 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.battery_history;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+import com.android.internal.app.IBatteryStats;
+import com.android.settings.R;
+
+import android.app.Activity;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.BatteryStats;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.SystemClock;
+import android.os.BatteryStats.Timer;
+import android.os.BatteryStats.Uid;
+import android.util.Log;
+import android.util.LogPrinter;
+import android.util.SparseArray;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.AdapterView;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.Spinner;
+import android.widget.TextView;
+import android.widget.AdapterView.OnItemSelectedListener;
+
+public class BatteryHistory extends Activity implements OnClickListener, OnItemSelectedListener {
+ private static final String TAG = "BatteryHistory";
+
+ private static final int SECONDS_PER_MINUTE = 60;
+ private static final int SECONDS_PER_HOUR = 60 * 60;
+ private static final int SECONDS_PER_DAY = 24 * 60 * 60;
+
+ // Must be in sync with the values in res/values/array.xml (id battery_history_type_spinner)
+ private static final int CPU_USAGE = 0;
+ private static final int NETWORK_USAGE = 1;
+ private static final int GPS_USAGE = 2;
+ private static final int SENSOR_USAGE = 3;
+ private static final int WAKELOCK_USAGE = 4;
+ private static final int MISC_USAGE = 5;
+
+ // Must be in sync with the values in res/values/array.xml (id battery_history_which_spinner)
+ private static final int UNPLUGGED = 0;
+ private static final int CURRENT = 1;
+ private static final int TOTAL = 2;
+
+ private BatteryStats mStats;
+ private int mWhich = BatteryStats.STATS_UNPLUGGED;
+ private int mType = CPU_USAGE;
+
+ private GraphableButton[] mButtons;
+ IBatteryStats mBatteryInfo;
+
+ private List<CpuUsage> mCpuUsage = new ArrayList<CpuUsage>();
+ private List<NetworkUsage> mNetworkUsage = new ArrayList<NetworkUsage>();
+ private List<SensorUsage> mSensorUsage = new ArrayList<SensorUsage>();
+ private List<SensorUsage> mGpsUsage = new ArrayList<SensorUsage>();
+ private List<WakelockUsage> mWakelockUsage = new ArrayList<WakelockUsage>();
+ private List<MiscUsage> mMiscUsage = new ArrayList<MiscUsage>();
+
+ private boolean mHaveCpuUsage, mHaveNetworkUsage, mHaveSensorUsage,
+ mHaveWakelockUsage, mHaveMiscUsage;
+
+ private LinearLayout mGraphLayout;
+ private LinearLayout mTextLayout;
+ private TextView mMessageText;
+ private TextView mDetailsText;
+ private Button mDetailsBackButton;
+ private Spinner mTypeSpinner;
+ private Spinner mWhichSpinner;
+
+ private boolean mDetailsShown = false;
+
+ private static String getLabel(String packageName, PackageManager pm) {
+ try {
+ ApplicationInfo ai = pm.getApplicationInfo(packageName, 0);
+ CharSequence label = ai.loadLabel(pm);
+ if (label != null) {
+ return label.toString();
+ }
+ } catch (NameNotFoundException e) {
+ return packageName;
+ }
+
+ return "";
+ }
+
+ void formatTime(double millis, StringBuilder sb) {
+ int seconds = (int) Math.floor(millis / 1000);
+
+ int days = 0, hours = 0, minutes = 0;
+ if (seconds > SECONDS_PER_DAY) {
+ days = seconds / SECONDS_PER_DAY;
+ seconds -= days * SECONDS_PER_DAY;
+ }
+ if (seconds > SECONDS_PER_HOUR) {
+ hours = seconds / SECONDS_PER_HOUR;
+ seconds -= hours * SECONDS_PER_HOUR;
+ }
+ if (seconds > SECONDS_PER_MINUTE) {
+ minutes = seconds / SECONDS_PER_MINUTE;
+ seconds -= minutes * SECONDS_PER_MINUTE;
+ }
+ if (days > 0) {
+ sb.append(getString(R.string.battery_history_days, days, hours, minutes, seconds));
+ } else if (hours > 0) {
+ sb.append(getString(R.string.battery_history_hours, hours, minutes, seconds));
+ } else if (minutes > 0) {
+ sb.append(getString(R.string.battery_history_minutes, minutes, seconds));
+ } else {
+ sb.append(getString(R.string.battery_history_seconds, seconds));
+ }
+ }
+
+ abstract class Graphable implements Comparable<Graphable> {
+ protected String mName;
+ protected String mNamePackage;
+ protected boolean mUniqueName;
+ protected String[] mPackages;
+ protected String[] mPackageNames;
+
+ public abstract String getLabel();
+ public abstract double getSortValue();
+ public abstract double[] getValues();
+ public abstract void getInfo(StringBuilder info);
+
+ public double getMaxValue() {
+ return -Double.MAX_VALUE;
+ }
+
+ public int compareTo(Graphable o) {
+ double t = getSortValue();
+ double ot = o.getSortValue();
+ if (t < ot) {
+ // Largest first
+ return 1;
+ } else if (t > ot) {
+ return -1;
+ } else {
+ return 0;
+ }
+ }
+
+ // Side effects: sets mName and mUniqueName
+ void getNameForUid(int uid) {
+ PackageManager pm = getPackageManager();
+ mPackages = pm.getPackagesForUid(uid);
+ if (mPackages == null) {
+ mName = Integer.toString(uid);
+ mNamePackage = null;
+ return;
+ }
+
+ mPackageNames = new String[mPackages.length];
+ System.arraycopy(mPackages, 0, mPackageNames, 0, mPackages.length);
+
+ // Convert package names to user-facing labels where possible
+ for (int i = 0; i < mPackageNames.length; i++) {
+ mPackageNames[i] = BatteryHistory.getLabel(mPackageNames[i], pm);
+ }
+
+ if (mPackageNames.length == 1) {
+ mNamePackage = mPackages[0];
+ mName = mPackageNames[0];
+ mUniqueName = true;
+ } else {
+ mName = getString(R.string.battery_history_uid, uid); // Default name
+ // Look for an official name for this UID.
+ for (String name : mPackages) {
+ try {
+ PackageInfo pi = pm.getPackageInfo(name, 0);
+ if (pi.sharedUserLabel != 0) {
+ CharSequence nm = pm.getText(name,
+ pi.sharedUserLabel, pi.applicationInfo);
+ if (nm != null) {
+ mName = nm.toString();
+ break;
+ }
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ }
+ }
+ }
+ }
+ }
+
+ class CpuUsage extends Graphable {
+ String mProcess;
+ double[] mUsage;
+ double mTotalRuntime;
+ long mStarts;
+
+ public CpuUsage(int uid, String process, long userTime, long systemTime,
+ long starts, long totalRuntime) {
+ getNameForUid(uid);
+ mProcess = process;
+ PackageManager pm = BatteryHistory.this.getPackageManager();
+ mName = BatteryHistory.getLabel(process, pm);
+ mUsage = new double[2];
+
+ mUsage[0] = userTime;
+ mUsage[1] = userTime + systemTime;
+ mTotalRuntime = totalRuntime;
+ mStarts = starts;
+ }
+
+ public String getLabel() {
+ return mName;
+ }
+
+ public double getSortValue() {
+ return mUsage[1];
+ }
+
+ public double[] getValues() {
+ return mUsage;
+ }
+
+ public double getMaxValue() {
+ return mTotalRuntime;
+ }
+
+ public void getInfo(StringBuilder info) {
+ info.append(getString(R.string.battery_history_cpu_usage, mProcess));
+ info.append("\n\n");
+ info.append(getString(R.string.battery_history_user_time));
+ formatTime(mUsage[0] * 10, info);
+ info.append('\n');
+ info.append(getString(R.string.battery_history_system_time));
+ formatTime((mUsage[1] - mUsage[0]) * 10, info);
+ info.append('\n');
+ info.append(getString(R.string.battery_history_total_time));
+ formatTime((mUsage[1]) * 10, info);
+ info.append('\n');
+ info.append(getString(R.string.battery_history_starts, mStarts));
+ }
+ }
+
+ class NetworkUsage extends Graphable {
+ double[] mUsage;
+
+ public NetworkUsage(int uid, long received, long sent) {
+ getNameForUid(uid);
+
+ mUsage = new double[2];
+ mUsage[0] = received;
+ mUsage[1] = received + sent;
+ }
+
+ public String getLabel() {
+ return mName;
+ }
+
+ public double getSortValue() {
+ return mUsage[1];
+ }
+
+ public double[] getValues() {
+ return mUsage;
+ }
+
+ public void getInfo(StringBuilder info) {
+ info.append(getString(R.string.battery_history_network_usage, mName));
+ info.append("\n\n");
+ info.append(getString(R.string.battery_history_bytes_received, (long) mUsage[0]));
+ info.append('\n');
+ info.append(getString(R.string.battery_history_bytes_sent,
+ (long) mUsage[1] - (long) mUsage[0]));
+ info.append('\n');
+ info.append(getString(R.string.battery_history_bytes_total, (long) mUsage[1]));
+
+ if (!mUniqueName) {
+ info.append("\n\n");
+ info.append(getString(R.string.battery_history_packages_sharing_this_uid));
+ info.append('\n');
+
+ PackageManager pm = BatteryHistory.this.getPackageManager();
+ List<String> names = new ArrayList<String>();
+ for (String name : mPackageNames) {
+ names.add(BatteryHistory.getLabel(name, pm));
+ }
+ Collections.sort(names);
+ for (String name : names) {
+ info.append(" ");
+ info.append(name);
+ info.append('\n');
+ }
+ }
+ }
+ }
+
+ class SensorUsage extends Graphable {
+ double[] mUsage;
+ double mTotalRealtime;
+ int mCount;
+
+ public SensorUsage(int uid, long time, int count, long totalRealtime) {
+ getNameForUid(uid);
+
+ mUsage = new double[1];
+ mUsage[0] = time;
+ mTotalRealtime = totalRealtime;
+
+ mCount = count;
+ }
+
+ public String getLabel() {
+ return mName;
+ }
+
+ public double getSortValue() {
+ return mUsage[0];
+ }
+
+ public double[] getValues() {
+ return mUsage;
+ }
+
+ public double getMaxValue() {
+ return mTotalRealtime;
+ }
+
+ public void getInfo(StringBuilder info) {
+ info.append(getString(R.string.battery_history_sensor));
+ info.append(mName);
+ info.append("\n\n");
+ info.append(getString(R.string.battery_history_total_time));
+ formatTime(mUsage[0], info);
+ info.append("\n\n");
+ }
+ }
+
+
+ class WakelockUsage extends Graphable {
+ double[] mUsage;
+ double mTotalRealtime;
+ int mCount;
+
+ public WakelockUsage(int uid, long time, int count, long totalRealtime) {
+ getNameForUid(uid);
+
+ mUsage = new double[1];
+ mUsage[0] = time;
+ mTotalRealtime = totalRealtime;
+
+ mCount = count;
+ }
+
+ public String getLabel() {
+ return mName;
+ }
+
+ public double getSortValue() {
+ return mUsage[0];
+ }
+
+ public double[] getValues() {
+ return mUsage;
+ }
+
+ public double getMaxValue() {
+ return mTotalRealtime;
+ }
+
+ public void getInfo(StringBuilder info) {
+ info.append(getString(R.string.battery_history_wakelock));
+ info.append(mName);
+ info.append("\n\n");
+ info.append(getString(R.string.battery_history_total_time));
+ formatTime(mUsage[0], info);
+ info.append("\n\n");
+ }
+ }
+
+ class MiscUsage extends Graphable {
+ int mInfoLabelRes;
+ double[] mUsage;
+ double mTotalRealtime;
+
+ public MiscUsage(String name, int infoLabelRes, long value,
+ long totalRealtime) {
+ mName = name;
+
+ mInfoLabelRes = infoLabelRes;
+
+ mUsage = new double[2];
+ mUsage[0] = value;
+ mTotalRealtime = totalRealtime;
+ }
+
+ public String getLabel() {
+ return mName;
+ }
+
+ public double getSortValue() {
+ return mUsage[1];
+ }
+
+ public double[] getValues() {
+ return mUsage;
+ }
+
+ public double getMaxValue() {
+ return mTotalRealtime;
+ }
+
+ public void getInfo(StringBuilder info) {
+ info.append(getString(mInfoLabelRes));
+ info.append(' ');
+ formatTime(mUsage[0], info);
+ info.append(" (");
+ info.append((mUsage[0]*100)/mTotalRealtime);
+ info.append("%)");
+ }
+ }
+
+ private List<? extends Graphable> getGraphRecords() {
+ switch (mType) {
+ case CPU_USAGE: return mCpuUsage;
+ case NETWORK_USAGE : return mNetworkUsage;
+ case SENSOR_USAGE: return mSensorUsage;
+ case GPS_USAGE: return mGpsUsage;
+ case WAKELOCK_USAGE: return mWakelockUsage;
+ case MISC_USAGE: return mMiscUsage;
+ default:
+ return (List<? extends Graphable>) null; // TODO
+ }
+ }
+
+ private void displayGraph() {
+ Log.i(TAG, "displayGraph");
+
+ collectStatistics();
+
+ // Hide the UI and selectively enable it below
+ mMessageText.setVisibility(View.GONE);
+ for (int i = 0; i < mButtons.length; i++) {
+ mButtons[i].setVisibility(View.INVISIBLE);
+ }
+
+ double maxValue = -Double.MAX_VALUE;
+
+ List<? extends Graphable> records = getGraphRecords();
+ for (Graphable g : records) {
+ double[] values = g.getValues();
+ maxValue = Math.max(maxValue, values[values.length - 1]);
+ maxValue = Math.max(maxValue, g.getMaxValue());
+ }
+
+ int[] colors = new int[2];
+ colors[0] = 0xff0000ff;
+ colors[1] = 0xffff0000;
+
+ for (int i = 0; i < mButtons.length; i++) {
+ mButtons[i].setVisibility(View.INVISIBLE);
+ }
+
+ int numRecords = Math.min(records.size(), mButtons.length);
+ if (numRecords == 0) {
+ mMessageText.setVisibility(View.VISIBLE);
+ mMessageText.setText(R.string.battery_history_no_data);
+ } else {
+ for (int i = 0; i < numRecords; i++) {
+ Graphable r = records.get(i);
+
+ mButtons[i].setText(r.getLabel());
+ mButtons[i].setValues(r.getValues(), maxValue);
+ mButtons[i].setVisibility(View.VISIBLE);
+ }
+ }
+ }
+
+ private void hideDetails() {
+ mTextLayout.setVisibility(View.GONE);
+ mGraphLayout.setVisibility(View.VISIBLE);
+ mDetailsShown = false;
+ }
+
+ private void showDetails(int id) {
+ mGraphLayout.setVisibility(View.GONE);
+ mTextLayout.setVisibility(View.VISIBLE);
+
+ StringBuilder info = new StringBuilder();
+ List<? extends Graphable> records = getGraphRecords();
+ if (id < records.size()) {
+ Graphable record = records.get(id);
+ record.getInfo(info);
+ } else {
+ info.append(getString(R.string.battery_history_details_for, id));
+ }
+ mDetailsText.setText(info.toString());
+ mDetailsShown = true;
+ }
+
+ private void processCpuUsage() {
+ mCpuUsage.clear();
+
+ long uSecTime = SystemClock.uptimeMillis() * 1000;
+ final long uSecNow = mStats.computeBatteryUptime(uSecTime, mWhich) / 1000;
+
+ SparseArray<? extends Uid> uidStats = mStats.getUidStats();
+ final int NU = uidStats.size();
+ for (int iu = 0; iu < NU; iu++) {
+ Uid u = uidStats.valueAt(iu);
+
+ Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
+ if (processStats.size() > 0) {
+ for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
+ : processStats.entrySet()) {
+
+ Uid.Proc ps = ent.getValue();
+ long userTime = ps.getUserTime(mWhich);
+ long systemTime = ps.getSystemTime(mWhich);
+ long starts = ps.getStarts(mWhich);
+
+ if (userTime != 0 || systemTime != 0) {
+ mCpuUsage.add(new CpuUsage(u.getUid(), ent.getKey(),
+ userTime, systemTime, starts, uSecNow));
+ }
+ }
+ }
+ }
+ Collections.sort(mCpuUsage);
+ }
+
+ private void processNetworkUsage() {
+ mNetworkUsage.clear();
+
+ SparseArray<? extends Uid> uidStats = mStats.getUidStats();
+ final int NU = uidStats.size();
+ for (int iu = 0; iu < NU; iu++) {
+ Uid u = uidStats.valueAt(iu);
+
+ long received = u.getTcpBytesReceived(mWhich);
+ long sent = u.getTcpBytesSent(mWhich);
+ if (received + sent > 0) {
+ mNetworkUsage.add(new NetworkUsage(u.getUid(), received, sent));
+ }
+ }
+ Collections.sort(mNetworkUsage);
+ }
+
+ private void processSensorUsage() {
+ mGpsUsage.clear();
+ mSensorUsage.clear();
+
+ long uSecTime = SystemClock.elapsedRealtime() * 1000;
+ final long uSecNow = mStats.computeBatteryRealtime(uSecTime, mWhich) / 1000;
+
+ SparseArray<? extends Uid> uidStats = mStats.getUidStats();
+ final int NU = uidStats.size();
+ for (int iu = 0; iu < NU; iu++) {
+ Uid u = uidStats.valueAt(iu);
+ int uid = u.getUid();
+
+ Map<Integer, ? extends BatteryStats.Uid.Sensor> sensorStats = u.getSensorStats();
+ long timeGps = 0;
+ int countGps = 0;
+ long timeOther = 0;
+ int countOther = 0;
+ if (sensorStats.size() > 0) {
+ for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent
+ : sensorStats.entrySet()) {
+
+ Uid.Sensor se = ent.getValue();
+ int handle = se.getHandle();
+ Timer timer = se.getSensorTime();
+ if (timer != null) {
+ // Convert from microseconds to milliseconds with rounding
+ long totalTime = (timer.getTotalTime(uSecNow, mWhich) + 500) / 1000;
+ int count = timer.getCount(mWhich);
+ if (handle == BatteryStats.Uid.Sensor.GPS) {
+ timeGps += totalTime;
+ countGps += count;
+ } else {
+ timeOther += totalTime;
+ countOther += count;
+ }
+ }
+ }
+ }
+
+ if (timeGps > 0) {
+ mGpsUsage.add(new SensorUsage(uid, timeGps, countGps, uSecNow));
+ }
+ if (timeOther > 0) {
+ mSensorUsage.add(new SensorUsage(uid, timeOther, countOther, uSecNow));
+ }
+ }
+
+ Collections.sort(mGpsUsage);
+ Collections.sort(mSensorUsage);
+ }
+
+ private void processWakelockUsage() {
+ mWakelockUsage.clear();
+
+ long uSecTime = SystemClock.elapsedRealtime() * 1000;
+ final long uSecNow = mStats.computeBatteryRealtime(uSecTime, mWhich) / 1000;
+
+ SparseArray<? extends Uid> uidStats = mStats.getUidStats();
+ final int NU = uidStats.size();
+ for (int iu = 0; iu < NU; iu++) {
+ Uid u = uidStats.valueAt(iu);
+ int uid = u.getUid();
+
+ Map<String, ? extends BatteryStats.Uid.Wakelock> wakelockStats = u.getWakelockStats();
+ long time = 0;
+ int count = 0;
+ if (wakelockStats.size() > 0) {
+ for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
+ : wakelockStats.entrySet()) {
+
+ Uid.Wakelock wl = ent.getValue();
+ Timer timer = wl.getWakeTime(BatteryStats.WAKE_TYPE_PARTIAL);
+ if (timer != null) {
+ // Convert from microseconds to milliseconds with rounding
+ time += (timer.getTotalTime(uSecNow, mWhich) + 500) / 1000;
+ count += timer.getCount(mWhich);
+ }
+ }
+ }
+
+ if (time > 0) {
+ mWakelockUsage.add(new WakelockUsage(uid, time, count, uSecNow));
+ }
+ }
+
+ Collections.sort(mWakelockUsage);
+ }
+
+ private void processMiscUsage() {
+ mMiscUsage.clear();
+
+ long rawRealtime = SystemClock.elapsedRealtime() * 1000;
+ final long batteryRealtime = mStats.getBatteryRealtime(rawRealtime);
+ final long whichRealtime = mStats.computeBatteryRealtime(rawRealtime, mWhich) / 1000;
+
+ long time = mStats.computeBatteryUptime(SystemClock.uptimeMillis() * 1000, mWhich) / 1000;
+ if (time > 0) {
+ mMiscUsage.add(new MiscUsage(getString(
+ R.string.battery_history_awake_label),
+ R.string.battery_history_awake,
+ time, whichRealtime));
+ }
+
+ time = mStats.getScreenOnTime(batteryRealtime, mWhich) / 1000;
+ if (time > 0) {
+ mMiscUsage.add(new MiscUsage(getString(
+ R.string.battery_history_screen_on_label),
+ R.string.battery_history_screen_on,
+ time, whichRealtime));
+ }
+
+ time = mStats.getPhoneOnTime(batteryRealtime, mWhich) / 1000;
+ if (time > 0) {
+ mMiscUsage.add(new MiscUsage(getString(
+ R.string.battery_history_phone_on_label),
+ R.string.battery_history_phone_on,
+ time, whichRealtime));
+ }
+
+ Collections.sort(mMiscUsage);
+ }
+
+ private void collectStatistics() {
+ if (mType == CPU_USAGE) {
+ if (!mHaveCpuUsage) {
+ mHaveCpuUsage = true;
+ processCpuUsage();
+ }
+ }
+ if (mType == NETWORK_USAGE) {
+ if (!mHaveNetworkUsage) {
+ mHaveNetworkUsage = true;
+ processNetworkUsage();
+ }
+ }
+ if (mType == GPS_USAGE || mType == SENSOR_USAGE) {
+ if (!mHaveSensorUsage) {
+ mHaveSensorUsage = true;
+ processSensorUsage();
+ }
+ }
+ if (mType == WAKELOCK_USAGE) {
+ if (!mHaveWakelockUsage) {
+ mHaveWakelockUsage = true;
+ processWakelockUsage();
+ }
+ }
+ if (mType == MISC_USAGE) {
+ if (!mHaveMiscUsage) {
+ mHaveMiscUsage = true;
+ processMiscUsage();
+ }
+ }
+ }
+
+ private void load() {
+ try {
+ byte[] data = mBatteryInfo.getStatistics();
+ Parcel parcel = Parcel.obtain();
+ //Log.i(TAG, "Got data: " + data.length + " bytes");
+ parcel.unmarshall(data, 0, data.length);
+ parcel.setDataPosition(0);
+ mStats = com.android.internal.os.BatteryStatsImpl.CREATOR
+ .createFromParcel(parcel);
+ //Log.i(TAG, "RECEIVED BATTERY INFO:");
+ //mStats.dumpLocked(new LogPrinter(Log.INFO, TAG));
+
+ mHaveCpuUsage = mHaveNetworkUsage = mHaveSensorUsage
+ = mHaveWakelockUsage = mHaveMiscUsage = false;
+ } catch (RemoteException e) {
+ Log.e(TAG, "RemoteException:", e);
+ }
+ }
+
+ public void onClick(View v) {
+ if (v == mDetailsBackButton) {
+ hideDetails();
+ return;
+ }
+
+ int id = ((Integer) v.getTag()).intValue();
+ showDetails(id);
+ }
+
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_BACK && mDetailsShown) {
+ hideDetails();
+ return true;
+ }
+ return super.onKeyDown(keyCode, event);
+ }
+
+ public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+ int oldWhich = mWhich;
+
+ if (parent.equals(mTypeSpinner)) {
+ mType = position;
+ } else if (parent.equals(mWhichSpinner)) {
+ switch (position) {
+ case UNPLUGGED:
+ mWhich = BatteryStats.STATS_UNPLUGGED;
+ break;
+ case CURRENT:
+ mWhich = BatteryStats.STATS_CURRENT;
+ break;
+ case TOTAL:
+ mWhich = BatteryStats.STATS_TOTAL;
+ break;
+ }
+ }
+
+ if (oldWhich != mWhich) {
+ mHaveCpuUsage = mHaveNetworkUsage = mHaveSensorUsage
+ = mHaveWakelockUsage = mHaveMiscUsage = false;
+ }
+
+ displayGraph();
+ }
+
+ public void onNothingSelected(AdapterView<?> parent) {
+ // Do nothing
+ }
+
+ @Override
+ public Object onRetainNonConfigurationInstance() {
+ BatteryStats stats = mStats;
+ mStats = null;
+ return stats;
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ if (mStats != null) {
+ outState.putParcelable("stats", mStats);
+ }
+ outState.putInt("type", mType);
+ outState.putInt("which", mWhich);
+ }
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ Log.i(TAG, "onCreate");
+
+ setContentView(R.layout.battery_history);
+
+ mGraphLayout = (LinearLayout) findViewById(R.id.graphLayout);
+ mTextLayout = (LinearLayout) findViewById(R.id.textLayout);
+ mDetailsText = (TextView) findViewById(R.id.detailsText);
+ mMessageText = (TextView) findViewById(R.id.messageText);
+
+ mTypeSpinner = (Spinner) findViewById(R.id.typeSpinner);
+ mTypeSpinner.setOnItemSelectedListener(this);
+
+ mWhichSpinner = (Spinner) findViewById(R.id.whichSpinner);
+ mWhichSpinner.setOnItemSelectedListener(this);
+ mWhichSpinner.setEnabled(true);
+
+ mButtons = new GraphableButton[8];
+ mButtons[0] = (GraphableButton) findViewById(R.id.button0);
+ mButtons[1] = (GraphableButton) findViewById(R.id.button1);
+ mButtons[2] = (GraphableButton) findViewById(R.id.button2);
+ mButtons[3] = (GraphableButton) findViewById(R.id.button3);
+ mButtons[4] = (GraphableButton) findViewById(R.id.button4);
+ mButtons[5] = (GraphableButton) findViewById(R.id.button5);
+ mButtons[6] = (GraphableButton) findViewById(R.id.button6);
+ mButtons[7] = (GraphableButton) findViewById(R.id.button7);
+
+ for (int i = 0; i < mButtons.length; i++) {
+ mButtons[i].setTag(i);
+ mButtons[i].setOnClickListener(this);
+ }
+
+ mBatteryInfo = IBatteryStats.Stub.asInterface(
+ ServiceManager.getService("batteryinfo"));
+
+ mStats = (BatteryStats)getLastNonConfigurationInstance();
+ if (icicle != null) {
+ if (mStats == null) {
+ mStats = (BatteryStats)icicle.getParcelable("stats");
+ }
+ mType = icicle.getInt("type");
+ mWhich = icicle.getInt("which");
+ }
+ if (mStats == null) {
+ load();
+ }
+ displayGraph();
+ }
+}
diff --git a/src/com/android/settings/battery_history/GraphableButton.java b/src/com/android/settings/battery_history/GraphableButton.java
new file mode 100644
index 0000000..39028d0
--- /dev/null
+++ b/src/com/android/settings/battery_history/GraphableButton.java
@@ -0,0 +1,55 @@
+package com.android.settings.battery_history;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.widget.Button;
+
+public class GraphableButton extends Button {
+ private static final String TAG = "GraphableButton";
+
+ static Paint[] sPaint = new Paint[2];
+ static {
+ sPaint[0] = new Paint();
+ sPaint[0].setStyle(Paint.Style.FILL);
+ sPaint[0].setColor(Color.BLUE);
+
+ sPaint[1] = new Paint();
+ sPaint[1].setStyle(Paint.Style.FILL);
+ sPaint[1].setColor(Color.RED);
+ }
+
+ double[] mValues;
+
+ public GraphableButton(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public void setValues(double[] values, double maxValue) {
+ mValues = values.clone();
+ for (int i = 0; i < values.length; i++) {
+ mValues[i] /= maxValue;
+ }
+ }
+
+ @Override
+ public void onDraw(Canvas canvas) {
+ Log.i(TAG, "onDraw: w = " + getWidth() + ", h = " + getHeight());
+
+ int xmin = getPaddingLeft();
+ int xmax = getWidth() - getPaddingRight();
+ int ymin = getPaddingTop();
+ int ymax = getHeight() - getPaddingBottom();
+
+ int startx = xmin;
+ for (int i = 0; i < mValues.length; i++) {
+ int endx = xmin + (int) (mValues[i] * (xmax - xmin));
+ canvas.drawRect(startx, ymin, endx, ymax, sPaint[i]);
+ startx = endx;
+ }
+ super.onDraw(canvas);
+ }
+}
diff --git a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
new file mode 100644
index 0000000..f0a8189
--- /dev/null
+++ b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import com.android.settings.R;
+
+import android.content.Context;
+import android.preference.Preference;
+import android.util.TypedValue;
+import android.view.View;
+import android.widget.ImageView;
+
+/**
+ * BluetoothDevicePreference is the preference type used to display each remote
+ * Bluetooth device in the Bluetooth Settings screen.
+ */
+public class BluetoothDevicePreference extends Preference implements LocalBluetoothDevice.Callback {
+ private static final String TAG = "BluetoothDevicePreference";
+
+ private static int sDimAlpha = Integer.MIN_VALUE;
+
+ private LocalBluetoothDevice mLocalDevice;
+
+ /**
+ * Cached local copy of whether the device is busy. This is only updated
+ * from {@link #onDeviceAttributesChanged(LocalBluetoothDevice)}.
+ */
+ private boolean mIsBusy;
+
+ public BluetoothDevicePreference(Context context, LocalBluetoothDevice localDevice) {
+ super(context);
+
+ if (sDimAlpha == Integer.MIN_VALUE) {
+ TypedValue outValue = new TypedValue();
+ context.getTheme().resolveAttribute(android.R.attr.disabledAlpha, outValue, true);
+ sDimAlpha = (int) (outValue.getFloat() * 255);
+ }
+
+ mLocalDevice = localDevice;
+
+ setLayoutResource(R.layout.preference_bluetooth);
+
+ localDevice.registerCallback(this);
+
+ onDeviceAttributesChanged(localDevice);
+ }
+
+ public LocalBluetoothDevice getDevice() {
+ return mLocalDevice;
+ }
+
+ @Override
+ protected void onPrepareForRemoval() {
+ super.onPrepareForRemoval();
+ mLocalDevice.unregisterCallback(this);
+ }
+
+ public void onDeviceAttributesChanged(LocalBluetoothDevice device) {
+
+ /*
+ * The preference framework takes care of making sure the value has
+ * changed before proceeding.
+ */
+
+ setTitle(mLocalDevice.getName());
+
+ /*
+ * TODO: Showed "Paired" even though it was "Connected". This may be
+ * related to BluetoothHeadset not bound to the actual
+ * BluetoothHeadsetService when we got here.
+ */
+ setSummary(mLocalDevice.getSummary());
+
+ // Used to gray out the item
+ mIsBusy = mLocalDevice.isBusy();
+
+ // Data has changed
+ notifyChanged();
+
+ // This could affect ordering, so notify that also
+ notifyHierarchyChanged();
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return super.isEnabled() && !mIsBusy;
+ }
+
+ @Override
+ protected void onBindView(View view) {
+ super.onBindView(view);
+
+ ImageView btClass = (ImageView) view.findViewById(R.id.btClass);
+ btClass.setImageResource(mLocalDevice.getBtClassDrawable());
+ btClass.setAlpha(isEnabled() ? 255 : sDimAlpha);
+ }
+
+ @Override
+ public int compareTo(Preference another) {
+ if (!(another instanceof BluetoothDevicePreference)) {
+ // Put other preference types above us
+ return 1;
+ }
+
+ return mLocalDevice.compareTo(((BluetoothDevicePreference) another).mLocalDevice);
+ }
+
+}
diff --git a/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java b/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java
new file mode 100644
index 0000000..a51f9b5
--- /dev/null
+++ b/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.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;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.SharedPreferences;
+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"
+ * checkbox. It sets/unsets discoverability and keeps track of how much time
+ * until the the discoverability is automatically turned off.
+ */
+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";
+ private static final int DISCOVERABLE_TIMEOUT = 120;
+
+ private static final String SHARED_PREFERENCES_KEY_DISCOVERABLE_END_TIMESTAMP =
+ "discoverable_end_timestamp";
+
+ private final Context mContext;
+ private final Handler mUiHandler;
+ private final CheckBoxPreference mCheckBoxPreference;
+
+ private final LocalBluetoothManager mLocalManager;
+
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (BluetoothIntent.SCAN_MODE_CHANGED_ACTION.equals(intent.getAction())) {
+ int mode = intent.getIntExtra(BluetoothIntent.SCAN_MODE, BluetoothError.ERROR);
+ if (mode != BluetoothError.ERROR) {
+ handleModeChanged(mode);
+ }
+ }
+ }
+ };
+
+ private final Runnable mUpdateCountdownSummaryRunnable = new Runnable() {
+ public void run() {
+ updateCountdownSummary();
+ }
+ };
+
+ public BluetoothDiscoverableEnabler(Context context, CheckBoxPreference checkBoxPreference) {
+ mContext = context;
+ mUiHandler = new Handler();
+ mCheckBoxPreference = checkBoxPreference;
+
+ checkBoxPreference.setPersistent(false);
+
+ mLocalManager = LocalBluetoothManager.getInstance(context);
+ if (mLocalManager == null) {
+ // Bluetooth not supported
+ checkBoxPreference.setEnabled(false);
+ }
+ }
+
+ public void resume() {
+ if (mLocalManager == null) {
+ return;
+ }
+
+ IntentFilter filter = new IntentFilter(BluetoothIntent.SCAN_MODE_CHANGED_ACTION);
+ filter.addAction(BluetoothIntent.DISABLED_ACTION);
+ mContext.registerReceiver(mReceiver, filter);
+ mCheckBoxPreference.setOnPreferenceChangeListener(this);
+
+ handleModeChanged(mLocalManager.getBluetoothManager().getScanMode());
+ }
+
+ public void pause() {
+ if (mLocalManager == null) {
+ return;
+ }
+
+ mUiHandler.removeCallbacks(mUpdateCountdownSummaryRunnable);
+ mCheckBoxPreference.setOnPreferenceChangeListener(null);
+ mContext.unregisterReceiver(mReceiver);
+ }
+
+ public boolean onPreferenceChange(Preference preference, Object value) {
+ if (V) {
+ Log.v(TAG, "Preference changed to " + value);
+ }
+
+ // Turn on/off BT discoverability
+ setEnabled((Boolean) value);
+
+ return true;
+ }
+
+ private void setEnabled(final boolean enable) {
+ BluetoothDevice manager = mLocalManager.getBluetoothManager();
+
+ if (enable) {
+
+ int timeout = getDiscoverableTimeout();
+ manager.setDiscoverableTimeout(timeout);
+
+ long endTimestamp = System.currentTimeMillis() + timeout * 1000;
+ persistDiscoverableEndTimestamp(endTimestamp);
+
+ manager.setScanMode(BluetoothDevice.SCAN_MODE_CONNECTABLE_DISCOVERABLE);
+ } else {
+ manager.setScanMode(BluetoothDevice.SCAN_MODE_CONNECTABLE);
+ }
+ }
+
+ private int getDiscoverableTimeout() {
+ int timeout = SystemProperties.getInt(SYSTEM_PROPERTY_DISCOVERABLE_TIMEOUT, -1);
+ if (timeout <= 0) {
+ timeout = DISCOVERABLE_TIMEOUT;
+ }
+
+ return timeout;
+ }
+
+ private void persistDiscoverableEndTimestamp(long endTimestamp) {
+ SharedPreferences.Editor editor = mLocalManager.getSharedPreferences().edit();
+ editor.putLong(SHARED_PREFERENCES_KEY_DISCOVERABLE_END_TIMESTAMP, endTimestamp);
+ editor.commit();
+ }
+
+ 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();
+
+ } else {
+ mCheckBoxPreference.setChecked(false);
+ }
+ }
+
+ private void updateCountdownSummary() {
+ int mode = mLocalManager.getBluetoothManager().getScanMode();
+ if (mode != BluetoothDevice.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
+ return;
+ }
+
+ long currentTimestamp = System.currentTimeMillis();
+ long endTimestamp = mLocalManager.getSharedPreferences().getLong(
+ SHARED_PREFERENCES_KEY_DISCOVERABLE_END_TIMESTAMP, 0);
+
+ if (currentTimestamp > endTimestamp) {
+ // We're still in discoverable mode, but maybe there isn't a timeout.
+ mCheckBoxPreference.setSummaryOn(null);
+ return;
+ }
+
+ String formattedTimeLeft = String.valueOf((endTimestamp - currentTimestamp) / 1000);
+
+ mCheckBoxPreference.setSummaryOn(
+ mContext.getResources().getString(R.string.bluetooth_is_discoverable,
+ formattedTimeLeft));
+
+ synchronized (this) {
+ mUiHandler.removeCallbacks(mUpdateCountdownSummaryRunnable);
+ mUiHandler.postDelayed(mUpdateCountdownSummaryRunnable, 1000);
+ }
+ }
+
+
+}
diff --git a/src/com/android/settings/bluetooth/BluetoothEnabler.java b/src/com/android/settings/bluetooth/BluetoothEnabler.java
new file mode 100644
index 0000000..661700f
--- /dev/null
+++ b/src/com/android/settings/bluetooth/BluetoothEnabler.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import com.android.settings.R;
+import com.android.settings.bluetooth.LocalBluetoothManager.ExtendedBluetoothState;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.preference.Preference;
+import android.preference.CheckBoxPreference;
+import android.text.TextUtils;
+import android.util.Config;
+
+/**
+ * BluetoothEnabler is a helper to manage the Bluetooth on/off checkbox
+ * preference. It is turns on/off Bluetooth and ensures the summary of the
+ * preference reflects the current state.
+ */
+public class BluetoothEnabler implements Preference.OnPreferenceChangeListener {
+
+ private static final boolean LOCAL_LOGD = Config.LOGD || false;
+ private static final String TAG = "BluetoothEnabler";
+
+ private final Context mContext;
+ private final CheckBoxPreference mCheckBoxPreference;
+ private final CharSequence mOriginalSummary;
+
+ private final LocalBluetoothManager mLocalManager;
+
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ handleStateChanged(mLocalManager.getBluetoothState());
+ }
+ };
+
+ public BluetoothEnabler(Context context, CheckBoxPreference checkBoxPreference) {
+ mContext = context;
+ mCheckBoxPreference = checkBoxPreference;
+
+ mOriginalSummary = checkBoxPreference.getSummary();
+ checkBoxPreference.setPersistent(false);
+
+ mLocalManager = LocalBluetoothManager.getInstance(context);
+ if (mLocalManager == null) {
+ // Bluetooth not supported
+ checkBoxPreference.setEnabled(false);
+ }
+ }
+
+ public void resume() {
+ if (mLocalManager == null) {
+ return;
+ }
+
+ ExtendedBluetoothState state = mLocalManager.getBluetoothState();
+ // This is the widget enabled state, not the preference toggled state
+ mCheckBoxPreference.setEnabled(state == ExtendedBluetoothState.ENABLED ||
+ state == ExtendedBluetoothState.DISABLED);
+ // BT state is not a sticky broadcast, so set it manually
+ handleStateChanged(state);
+
+ mContext.registerReceiver(mReceiver,
+ new IntentFilter(LocalBluetoothManager.EXTENDED_BLUETOOTH_STATE_CHANGED_ACTION));
+ mCheckBoxPreference.setOnPreferenceChangeListener(this);
+ }
+
+ public void pause() {
+ if (mLocalManager == null) {
+ return;
+ }
+
+ mContext.unregisterReceiver(mReceiver);
+ mCheckBoxPreference.setOnPreferenceChangeListener(null);
+ }
+
+ public boolean onPreferenceChange(Preference preference, Object value) {
+ // Turn on/off BT
+ setEnabled((Boolean) value);
+
+ // Don't update UI to opposite state until we're sure
+ return false;
+ }
+
+ private void setEnabled(final boolean enable) {
+ // Disable preference
+ mCheckBoxPreference.setEnabled(false);
+
+ mLocalManager.setBluetoothEnabled(enable);
+ }
+
+ private void handleStateChanged(ExtendedBluetoothState state) {
+
+ if (state == ExtendedBluetoothState.DISABLED || state == ExtendedBluetoothState.ENABLED) {
+ mCheckBoxPreference.setChecked(state == ExtendedBluetoothState.ENABLED);
+ mCheckBoxPreference
+ .setSummary(state == ExtendedBluetoothState.DISABLED ? mOriginalSummary : null);
+
+ mCheckBoxPreference.setEnabled(isEnabledByDependency());
+
+ } else if (state == ExtendedBluetoothState.ENABLING ||
+ state == ExtendedBluetoothState.DISABLING) {
+ mCheckBoxPreference.setSummary(state == ExtendedBluetoothState.ENABLING
+ ? R.string.wifi_starting
+ : R.string.wifi_stopping);
+
+ } else if (state == ExtendedBluetoothState.UNKNOWN) {
+ mCheckBoxPreference.setChecked(false);
+ mCheckBoxPreference.setSummary(R.string.wifi_error);
+ mCheckBoxPreference.setEnabled(true);
+ }
+ }
+
+ private boolean isEnabledByDependency() {
+ Preference dep = getDependencyPreference();
+ if (dep == null) {
+ return true;
+ }
+
+ return !dep.shouldDisableDependents();
+ }
+
+ private Preference getDependencyPreference() {
+ String depKey = mCheckBoxPreference.getDependency();
+ if (TextUtils.isEmpty(depKey)) {
+ return null;
+ }
+
+ return mCheckBoxPreference.getPreferenceManager().findPreference(depKey);
+ }
+
+}
diff --git a/src/com/android/settings/bluetooth/BluetoothEventRedirector.java b/src/com/android/settings/bluetooth/BluetoothEventRedirector.java
new file mode 100644
index 0000000..2ad5726
--- /dev/null
+++ b/src/com/android/settings/bluetooth/BluetoothEventRedirector.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import com.android.settings.bluetooth.LocalBluetoothManager.ExtendedBluetoothState;
+
+import android.bluetooth.BluetoothA2dp;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothHeadset;
+import android.bluetooth.BluetoothError;
+import android.bluetooth.BluetoothIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.util.Log;
+
+/**
+ * BluetoothEventRedirector receives broadcasts and callbacks from the Bluetooth
+ * API and dispatches the event on the UI thread to the right class in the
+ * Settings.
+ */
+public class BluetoothEventRedirector {
+ private static final String TAG = "BluetoothEventRedirector";
+ private static final boolean V = LocalBluetoothManager.V;
+
+ private LocalBluetoothManager mManager;
+
+ private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (V) {
+ Log.v(TAG, "Received " + intent.getAction());
+ }
+
+ String action = intent.getAction();
+ String address = intent.getStringExtra(BluetoothIntent.ADDRESS);
+
+ if (action.equals(BluetoothIntent.ENABLED_ACTION)) {
+ mManager.setBluetoothStateInt(ExtendedBluetoothState.ENABLED);
+
+ } else if (action.equals(BluetoothIntent.DISABLED_ACTION)) {
+ mManager.setBluetoothStateInt(ExtendedBluetoothState.DISABLED);
+
+ } else if (action.equals(BluetoothIntent.DISCOVERY_STARTED_ACTION)) {
+ mManager.onScanningStateChanged(true);
+
+ } else if (action.equals(BluetoothIntent.DISCOVERY_COMPLETED_ACTION)) {
+ mManager.onScanningStateChanged(false);
+
+ } else if (action.equals(BluetoothIntent.REMOTE_DEVICE_FOUND_ACTION)) {
+ short rssi = intent.getShortExtra(BluetoothIntent.RSSI, Short.MIN_VALUE);
+ mManager.getLocalDeviceManager().onDeviceAppeared(address, rssi);
+
+ } else if (action.equals(BluetoothIntent.REMOTE_DEVICE_DISAPPEARED_ACTION)) {
+ mManager.getLocalDeviceManager().onDeviceDisappeared(address);
+
+ } else if (action.equals(BluetoothIntent.REMOTE_NAME_UPDATED_ACTION)) {
+ mManager.getLocalDeviceManager().onDeviceNameUpdated(address);
+
+ } else if (action.equals(BluetoothIntent.BOND_STATE_CHANGED_ACTION)) {
+ int bondState = intent.getIntExtra(BluetoothIntent.BOND_STATE,
+ BluetoothError.ERROR);
+ mManager.getLocalDeviceManager().onBondingStateChanged(address, bondState);
+ if (bondState == BluetoothDevice.BOND_NOT_BONDED) {
+ int reason = intent.getIntExtra(BluetoothIntent.REASON, BluetoothError.ERROR);
+ if (reason == BluetoothDevice.UNBOND_REASON_AUTH_FAILED ||
+ reason == BluetoothDevice.UNBOND_REASON_AUTH_REJECTED ||
+ reason == BluetoothDevice.UNBOND_REASON_REMOTE_DEVICE_DOWN) {
+ mManager.getLocalDeviceManager().onBondingError(address, reason);
+ }
+ }
+
+ } else if (action.equals(BluetoothIntent.HEADSET_STATE_CHANGED_ACTION)) {
+ mManager.getLocalDeviceManager().onProfileStateChanged(address);
+
+ int newState = intent.getIntExtra(BluetoothIntent.HEADSET_STATE, 0);
+ int oldState = intent.getIntExtra(BluetoothIntent.HEADSET_PREVIOUS_STATE, 0);
+ if (newState == BluetoothHeadset.STATE_DISCONNECTED &&
+ oldState == BluetoothHeadset.STATE_CONNECTING) {
+ Log.i(TAG, "Failed to connect BT headset");
+ }
+
+ } else if (action.equals(BluetoothA2dp.SINK_STATE_CHANGED_ACTION)) {
+ mManager.getLocalDeviceManager().onProfileStateChanged(address);
+
+ int newState = intent.getIntExtra(BluetoothA2dp.SINK_STATE, 0);
+ int oldState = intent.getIntExtra(BluetoothA2dp.SINK_PREVIOUS_STATE, 0);
+ if (newState == BluetoothA2dp.STATE_DISCONNECTED &&
+ oldState == BluetoothA2dp.STATE_CONNECTING) {
+ Log.i(TAG, "Failed to connect BT A2DP");
+ }
+
+ } else if (action.equals(BluetoothIntent.REMOTE_DEVICE_CLASS_UPDATED_ACTION)) {
+ mManager.getLocalDeviceManager().onBtClassChanged(address);
+
+ }
+ }
+ };
+
+ public BluetoothEventRedirector(LocalBluetoothManager localBluetoothManager) {
+ mManager = localBluetoothManager;
+ }
+
+ public void start() {
+ IntentFilter filter = new IntentFilter();
+
+ // Bluetooth on/off broadcasts
+ filter.addAction(BluetoothIntent.ENABLED_ACTION);
+ filter.addAction(BluetoothIntent.DISABLED_ACTION);
+
+ // Discovery broadcasts
+ filter.addAction(BluetoothIntent.DISCOVERY_STARTED_ACTION);
+ filter.addAction(BluetoothIntent.DISCOVERY_COMPLETED_ACTION);
+ filter.addAction(BluetoothIntent.REMOTE_DEVICE_DISAPPEARED_ACTION);
+ filter.addAction(BluetoothIntent.REMOTE_DEVICE_FOUND_ACTION);
+ filter.addAction(BluetoothIntent.REMOTE_NAME_UPDATED_ACTION);
+
+ // Pairing broadcasts
+ filter.addAction(BluetoothIntent.BOND_STATE_CHANGED_ACTION);
+
+ // Fine-grained state broadcasts
+ filter.addAction(BluetoothA2dp.SINK_STATE_CHANGED_ACTION);
+ filter.addAction(BluetoothIntent.HEADSET_STATE_CHANGED_ACTION);
+ filter.addAction(BluetoothIntent.REMOTE_DEVICE_CLASS_UPDATED_ACTION);
+
+ mManager.getContext().registerReceiver(mBroadcastReceiver, filter);
+ }
+
+ public void stop() {
+ mManager.getContext().unregisterReceiver(mBroadcastReceiver);
+ }
+}
diff --git a/src/com/android/settings/bluetooth/BluetoothNamePreference.java b/src/com/android/settings/bluetooth/BluetoothNamePreference.java
new file mode 100644
index 0000000..3065b26
--- /dev/null
+++ b/src/com/android/settings/bluetooth/BluetoothNamePreference.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.preference.EditTextPreference;
+import android.preference.PreferenceManager;
+import android.util.AttributeSet;
+
+/**
+ * BluetoothNamePreference is the preference type for editing the device's
+ * Bluetooth name. It asks the user for a name, and persists it via the
+ * Bluetooth API.
+ */
+public class BluetoothNamePreference extends EditTextPreference {
+ private static final String TAG = "BluetoothNamePreference";
+
+ private LocalBluetoothManager mLocalManager;
+
+ private BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ setSummaryToName();
+ }
+ };
+
+ public BluetoothNamePreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ mLocalManager = LocalBluetoothManager.getInstance(context);
+
+ setSummaryToName();
+ }
+
+ public void resume() {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(BluetoothIntent.ENABLED_ACTION);
+ filter.addAction(BluetoothIntent.NAME_CHANGED_ACTION);
+ getContext().registerReceiver(mReceiver, filter);
+ }
+
+ public void pause() {
+ getContext().unregisterReceiver(mReceiver);
+ }
+
+ private void setSummaryToName() {
+ BluetoothDevice manager = mLocalManager.getBluetoothManager();
+ if (manager.isEnabled()) {
+ setSummary(manager.getName());
+ }
+ }
+
+ @Override
+ protected boolean persistString(String value) {
+ BluetoothDevice manager = mLocalManager.getBluetoothManager();
+ manager.setName(value);
+ return true;
+ }
+
+}
diff --git a/src/com/android/settings/bluetooth/BluetoothPinDialog.java b/src/com/android/settings/bluetooth/BluetoothPinDialog.java
new file mode 100644
index 0000000..5e289f7
--- /dev/null
+++ b/src/com/android/settings/bluetooth/BluetoothPinDialog.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.InputFilter;
+import android.text.TextWatcher;
+import android.text.InputFilter.LengthFilter;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import com.android.internal.app.AlertActivity;
+import com.android.internal.app.AlertController;
+import com.android.settings.R;
+
+/**
+ * BluetoothPinDialog asks the user to enter a PIN for pairing with a remote
+ * Bluetooth device. It is an activity that appears as a dialog.
+ */
+public class BluetoothPinDialog extends AlertActivity implements DialogInterface.OnClickListener,
+ TextWatcher {
+ private static final String TAG = "BluetoothPinDialog";
+
+ private LocalBluetoothManager mLocalManager;
+ private String mAddress;
+ private EditText mPinView;
+ private Button mOkButton;
+
+ private static final String INSTANCE_KEY_PAIRING_CANCELED = "received_pairing_canceled";
+ private boolean mReceivedPairingCanceled;
+
+ private BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (!BluetoothIntent.PAIRING_CANCEL_ACTION.equals(intent.getAction())) {
+ return;
+ }
+
+ String address = intent.getStringExtra(BluetoothIntent.ADDRESS);
+ if (address == null || address.equals(mAddress)) {
+ onReceivedPairingCanceled();
+ }
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ Intent intent = getIntent();
+ if (!intent.getAction().equals(BluetoothIntent.PAIRING_REQUEST_ACTION))
+ {
+ Log.e(TAG,
+ "Error: this activity may be started only with intent " +
+ BluetoothIntent.PAIRING_REQUEST_ACTION);
+ finish();
+ }
+
+ mLocalManager = LocalBluetoothManager.getInstance(this);
+ mAddress = intent.getStringExtra(BluetoothIntent.ADDRESS);
+
+ // Set up the "dialog"
+ final AlertController.AlertParams p = mAlertParams;
+ p.mIconId = android.R.drawable.ic_dialog_info;
+ p.mTitle = getString(R.string.bluetooth_pin_entry);
+ p.mView = createView();
+ p.mPositiveButtonText = getString(android.R.string.ok);
+ p.mPositiveButtonListener = this;
+ p.mNegativeButtonText = getString(android.R.string.cancel);
+ p.mNegativeButtonListener = this;
+ setupAlert();
+
+ mOkButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE);
+ mOkButton.setEnabled(false);
+
+ /*
+ * Leave this registered through pause/resume since we still want to
+ * finish the activity in the background if pairing is canceled.
+ */
+ registerReceiver(mReceiver, new IntentFilter(BluetoothIntent.PAIRING_CANCEL_ACTION));
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Bundle savedInstanceState) {
+ super.onRestoreInstanceState(savedInstanceState);
+
+ mReceivedPairingCanceled = savedInstanceState.getBoolean(INSTANCE_KEY_PAIRING_CANCELED);
+ if (mReceivedPairingCanceled) {
+ onReceivedPairingCanceled();
+ }
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+
+ outState.putBoolean(INSTANCE_KEY_PAIRING_CANCELED, mReceivedPairingCanceled);
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+
+ unregisterReceiver(mReceiver);
+ }
+
+ private View createView() {
+ View view = getLayoutInflater().inflate(R.layout.bluetooth_pin_entry, null);
+
+ String name = mLocalManager.getLocalDeviceManager().getName(mAddress);
+ TextView messageView = (TextView) view.findViewById(R.id.message);
+ messageView.setText(getString(R.string.bluetooth_enter_pin_msg, name));
+
+ mPinView = (EditText) view.findViewById(R.id.text);
+ mPinView.addTextChangedListener(this);
+ // Maximum of 10 characters in a PIN
+ mPinView.setFilters(new InputFilter[] { new LengthFilter(10) });
+
+ return view;
+ }
+
+ public void afterTextChanged(Editable s) {
+ if (s.length() > 0) {
+ mOkButton.setEnabled(true);
+ }
+ }
+
+ private void onReceivedPairingCanceled() {
+ mReceivedPairingCanceled = true;
+
+ TextView messageView = (TextView) findViewById(R.id.message);
+ messageView.setText(getString(R.string.bluetooth_pairing_error_message,
+ mLocalManager.getLocalDeviceManager().getName(mAddress)));
+
+ mPinView.setVisibility(View.GONE);
+ mPinView.clearFocus();
+ mPinView.removeTextChangedListener(this);
+
+ mOkButton.setEnabled(true);
+ mAlert.getButton(DialogInterface.BUTTON_NEGATIVE).setVisibility(View.GONE);
+ }
+
+ private void onPair(String pin) {
+ byte[] pinBytes = BluetoothDevice.convertPinToBytes(pin);
+
+ if (pinBytes == null) {
+ return;
+ }
+
+ mLocalManager.getBluetoothManager().setPin(mAddress, pinBytes);
+ }
+
+ private void onCancel() {
+ mLocalManager.getBluetoothManager().cancelBondProcess(mAddress);
+ }
+
+ public void onClick(DialogInterface dialog, int which) {
+ switch (which) {
+ case DialogInterface.BUTTON_POSITIVE:
+ onPair(mPinView.getText().toString());
+ break;
+
+ case DialogInterface.BUTTON_NEGATIVE:
+ onCancel();
+ break;
+ }
+ }
+
+ /* Not used */
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+
+ /* Not used */
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ }
+
+}
diff --git a/src/com/android/settings/bluetooth/BluetoothPinRequest.java b/src/com/android/settings/bluetooth/BluetoothPinRequest.java
new file mode 100644
index 0000000..619052d
--- /dev/null
+++ b/src/com/android/settings/bluetooth/BluetoothPinRequest.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import com.android.settings.R;
+
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.text.TextUtils;
+
+/**
+ * BluetoothPinRequest is a receiver for any Bluetooth pairing PIN request. It
+ * checks if the Bluetooth Settings is currently visible and brings up the PIN
+ * entry dialog. Otherwise it puts a Notification in the status bar, which can
+ * be clicked to bring up the PIN entry dialog.
+ */
+public class BluetoothPinRequest extends BroadcastReceiver {
+
+ public static final int NOTIFICATION_ID = android.R.drawable.stat_sys_data_bluetooth;
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (action.equals(BluetoothIntent.PAIRING_REQUEST_ACTION)) {
+
+ LocalBluetoothManager localManager = LocalBluetoothManager.getInstance(context);
+
+ String address = intent.getStringExtra(BluetoothIntent.ADDRESS);
+ Intent pinIntent = new Intent();
+ pinIntent.setClass(context, BluetoothPinDialog.class);
+ pinIntent.putExtra(BluetoothIntent.ADDRESS, address);
+ pinIntent.setAction(BluetoothIntent.PAIRING_REQUEST_ACTION);
+ pinIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ if (localManager.getForegroundActivity() != null) {
+ // Since the BT-related activity is in the foreground, just open the dialog
+ context.startActivity(pinIntent);
+
+ } else {
+
+ // Put up a notification that leads to the dialog
+ Resources res = context.getResources();
+ Notification notification = new Notification(
+ android.R.drawable.stat_sys_data_bluetooth,
+ res.getString(R.string.bluetooth_notif_ticker),
+ System.currentTimeMillis());
+
+ PendingIntent pending = PendingIntent.getActivity(context, 0,
+ pinIntent, PendingIntent.FLAG_ONE_SHOT);
+
+ String name = intent.getStringExtra(BluetoothIntent.NAME);
+ if (TextUtils.isEmpty(name)) {
+ name = localManager.getLocalDeviceManager().getName(address);
+ }
+
+ notification.setLatestEventInfo(context,
+ res.getString(R.string.bluetooth_notif_title),
+ res.getString(R.string.bluetooth_notif_message) + name,
+ pending);
+ notification.flags |= Notification.FLAG_AUTO_CANCEL;
+
+ NotificationManager manager = (NotificationManager)
+ context.getSystemService(Context.NOTIFICATION_SERVICE);
+ manager.notify(NOTIFICATION_ID, notification);
+ }
+
+ } else if (action.equals(BluetoothIntent.PAIRING_CANCEL_ACTION)) {
+
+ // Remove the notification
+ NotificationManager manager = (NotificationManager) context
+ .getSystemService(Context.NOTIFICATION_SERVICE);
+ manager.cancel(NOTIFICATION_ID);
+ }
+ }
+}
diff --git a/src/com/android/settings/bluetooth/BluetoothSettings.java b/src/com/android/settings/bluetooth/BluetoothSettings.java
new file mode 100644
index 0000000..5adada3
--- /dev/null
+++ b/src/com/android/settings/bluetooth/BluetoothSettings.java
@@ -0,0 +1,260 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import com.android.settings.ProgressCategory;
+import com.android.settings.R;
+import com.android.settings.bluetooth.LocalBluetoothManager.ExtendedBluetoothState;
+
+import java.util.List;
+import java.util.WeakHashMap;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.preference.CheckBoxPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceScreen;
+import android.view.ContextMenu;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ContextMenu.ContextMenuInfo;
+import android.widget.AdapterView.AdapterContextMenuInfo;
+
+/**
+ * BluetoothSettings is the Settings screen for Bluetooth configuration and
+ * connection management.
+ */
+public class BluetoothSettings extends PreferenceActivity
+ implements LocalBluetoothManager.Callback {
+
+ private static final String TAG = "BluetoothSettings";
+
+ private static final int MENU_SCAN = Menu.FIRST;
+
+ private static final String KEY_BT_CHECKBOX = "bt_checkbox";
+ private static final String KEY_BT_DISCOVERABLE = "bt_discoverable";
+ private static final String KEY_BT_DEVICE_LIST = "bt_device_list";
+ private static final String KEY_BT_NAME = "bt_name";
+ private static final String KEY_BT_SCAN = "bt_scan";
+
+ private LocalBluetoothManager mLocalManager;
+
+ private BluetoothEnabler mEnabler;
+ private BluetoothDiscoverableEnabler mDiscoverableEnabler;
+
+ private BluetoothNamePreference mNamePreference;
+
+ private ProgressCategory mDeviceList;
+
+ private WeakHashMap<LocalBluetoothDevice, BluetoothDevicePreference> mDevicePreferenceMap =
+ new WeakHashMap<LocalBluetoothDevice, BluetoothDevicePreference>();
+
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ // TODO: put this in callback instead of receiving
+ onBluetoothStateChanged(mLocalManager.getBluetoothState());
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ mLocalManager = LocalBluetoothManager.getInstance(this);
+ if (mLocalManager == null) finish();
+
+ addPreferencesFromResource(R.xml.bluetooth_settings);
+
+ mEnabler = new BluetoothEnabler(
+ this,
+ (CheckBoxPreference) findPreference(KEY_BT_CHECKBOX));
+
+ mDiscoverableEnabler = new BluetoothDiscoverableEnabler(
+ this,
+ (CheckBoxPreference) findPreference(KEY_BT_DISCOVERABLE));
+
+ mNamePreference = (BluetoothNamePreference) findPreference(KEY_BT_NAME);
+
+ mDeviceList = (ProgressCategory) findPreference(KEY_BT_DEVICE_LIST);
+
+ registerForContextMenu(getListView());
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ // Repopulate (which isn't too bad since it's cached in the settings
+ // bluetooth manager
+ mDevicePreferenceMap.clear();
+ mDeviceList.removeAll();
+ addDevices();
+
+ mEnabler.resume();
+ mDiscoverableEnabler.resume();
+ mNamePreference.resume();
+ mLocalManager.registerCallback(this);
+
+ mLocalManager.startScanning(false);
+
+ registerReceiver(mReceiver,
+ new IntentFilter(LocalBluetoothManager.EXTENDED_BLUETOOTH_STATE_CHANGED_ACTION));
+
+ mLocalManager.setForegroundActivity(this);
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+
+ mLocalManager.setForegroundActivity(null);
+
+ unregisterReceiver(mReceiver);
+
+ mLocalManager.unregisterCallback(this);
+ mNamePreference.pause();
+ mDiscoverableEnabler.pause();
+ mEnabler.pause();
+ }
+
+ private void addDevices() {
+ List<LocalBluetoothDevice> devices = mLocalManager.getLocalDeviceManager().getDevicesCopy();
+ for (LocalBluetoothDevice device : devices) {
+ onDeviceAdded(device);
+ }
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ menu.add(0, MENU_SCAN, 0, R.string.bluetooth_scan_for_devices)
+ .setIcon(com.android.internal.R.drawable.ic_menu_refresh)
+ .setAlphabeticShortcut('r');
+ return true;
+ }
+
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ menu.findItem(MENU_SCAN).setEnabled(mLocalManager.getBluetoothManager().isEnabled());
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+
+ case MENU_SCAN:
+ mLocalManager.startScanning(true);
+ return true;
+
+ default:
+ return false;
+ }
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
+ Preference preference) {
+
+ if (KEY_BT_SCAN.equals(preference.getKey())) {
+ mLocalManager.startScanning(true);
+ return true;
+ }
+
+ if (preference instanceof BluetoothDevicePreference) {
+ BluetoothDevicePreference btPreference = (BluetoothDevicePreference) preference;
+ btPreference.getDevice().onClicked();
+ return true;
+ }
+
+ return super.onPreferenceTreeClick(preferenceScreen, preference);
+ }
+
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View v,
+ ContextMenuInfo menuInfo) {
+ LocalBluetoothDevice device = getDeviceFromMenuInfo(menuInfo);
+ if (device == null) return;
+
+ device.onCreateContextMenu(menu);
+ }
+
+ @Override
+ public boolean onContextItemSelected(MenuItem item) {
+ LocalBluetoothDevice device = getDeviceFromMenuInfo(item.getMenuInfo());
+ if (device == null) return false;
+
+ device.onContextItemSelected(item);
+ return true;
+ }
+
+ private LocalBluetoothDevice getDeviceFromMenuInfo(ContextMenuInfo menuInfo) {
+ if ((menuInfo == null) || !(menuInfo instanceof AdapterContextMenuInfo)) {
+ return null;
+ }
+
+ AdapterContextMenuInfo adapterMenuInfo = (AdapterContextMenuInfo) menuInfo;
+ Preference pref = (Preference) getPreferenceScreen().getRootAdapter().getItem(
+ adapterMenuInfo.position);
+ if (pref == null || !(pref instanceof BluetoothDevicePreference)) {
+ return null;
+ }
+
+ return ((BluetoothDevicePreference) pref).getDevice();
+ }
+
+ public void onDeviceAdded(LocalBluetoothDevice device) {
+
+ if (mDevicePreferenceMap.get(device) != null) {
+ throw new IllegalStateException("Got onDeviceAdded, but device already exists");
+ }
+
+ createDevicePreference(device);
+ }
+
+ private void createDevicePreference(LocalBluetoothDevice device) {
+ BluetoothDevicePreference preference = new BluetoothDevicePreference(this, device);
+ mDeviceList.addPreference(preference);
+ mDevicePreferenceMap.put(device, preference);
+ }
+
+ public void onDeviceDeleted(LocalBluetoothDevice device) {
+ BluetoothDevicePreference preference = mDevicePreferenceMap.remove(device);
+ if (preference != null) {
+ mDeviceList.removePreference(preference);
+ }
+ }
+
+ public void onScanningStateChanged(boolean started) {
+ mDeviceList.setProgress(started);
+ }
+
+ private void onBluetoothStateChanged(ExtendedBluetoothState bluetoothState) {
+ // When bluetooth is enabled (and we are in the activity, which we are),
+ // we should start a scan
+ if (bluetoothState == ExtendedBluetoothState.ENABLED) {
+ mLocalManager.startScanning(false);
+ } else if (bluetoothState == ExtendedBluetoothState.DISABLED) {
+ mDeviceList.setProgress(false);
+ }
+ }
+}
diff --git a/src/com/android/settings/bluetooth/ConnectSpecificProfilesActivity.java b/src/com/android/settings/bluetooth/ConnectSpecificProfilesActivity.java
new file mode 100644
index 0000000..7dd1b70
--- /dev/null
+++ b/src/com/android/settings/bluetooth/ConnectSpecificProfilesActivity.java
@@ -0,0 +1,298 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import com.android.settings.R;
+import com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.preference.CheckBoxPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceGroup;
+import android.text.TextUtils;
+import android.util.Log;
+
+/**
+ * ConnectSpecificProfilesActivity presents the user with all of the profiles
+ * for a particular device, and allows him to choose which should be connected
+ * (or disconnected).
+ */
+public class ConnectSpecificProfilesActivity extends PreferenceActivity
+ implements LocalBluetoothDevice.Callback, Preference.OnPreferenceChangeListener {
+ private static final String TAG = "ConnectSpecificProfilesActivity";
+
+ private static final String KEY_ONLINE_MODE = "online_mode";
+ private static final String KEY_TITLE = "title";
+ private static final String KEY_PROFILE_CONTAINER = "profile_container";
+
+ public static final String EXTRA_ADDRESS = "address";
+
+ private LocalBluetoothManager mManager;
+ private LocalBluetoothDevice mDevice;
+
+ private PreferenceGroup mProfileContainer;
+ private CheckBoxPreference mOnlineModePreference;
+
+ /**
+ * The current mode of this activity and its checkboxes (either online mode
+ * or offline mode). In online mode, user interactions with the profile
+ * checkboxes will also toggle the profile's connectivity. In offline mode,
+ * they will not, and only the preferred state will be saved for the
+ * profile.
+ */
+ private boolean mOnlineMode;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ String address;
+ if (savedInstanceState != null) {
+ address = savedInstanceState.getString(EXTRA_ADDRESS);
+ } else {
+ Intent intent = getIntent();
+ address = intent.getStringExtra(EXTRA_ADDRESS);
+ }
+
+ if (TextUtils.isEmpty(address)) {
+ Log.w(TAG, "Activity started without address");
+ finish();
+ }
+
+ mManager = LocalBluetoothManager.getInstance(this);
+ mDevice = mManager.getLocalDeviceManager().findDevice(address);
+ if (mDevice == null) {
+ Log.w(TAG, "Device not found, cannot connect to it");
+ finish();
+ }
+
+ addPreferencesFromResource(R.xml.bluetooth_device_advanced);
+ mProfileContainer = (PreferenceGroup) findPreference(KEY_PROFILE_CONTAINER);
+
+ // Set the title of the screen
+ findPreference(KEY_TITLE).setTitle(
+ getString(R.string.bluetooth_device_advanced_title, mDevice.getName()));
+
+ // Listen for check/uncheck of the online mode checkbox
+ mOnlineModePreference = (CheckBoxPreference) findPreference(KEY_ONLINE_MODE);
+ mOnlineModePreference.setOnPreferenceChangeListener(this);
+
+ // Add a preference for each profile
+ addPreferencesForProfiles();
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+
+ outState.putString(EXTRA_ADDRESS, mDevice.getAddress());
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ mManager.setForegroundActivity(this);
+ mDevice.registerCallback(this);
+
+ refresh();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+
+ mDevice.unregisterCallback(this);
+ mManager.setForegroundActivity(null);
+ }
+
+ private void addPreferencesForProfiles() {
+ for (Profile profile : mDevice.getProfiles()) {
+ Preference pref = createProfilePreference(profile);
+ mProfileContainer.addPreference(pref);
+ }
+ }
+
+ /**
+ * Creates a checkbox preference for the particular profile. The key will be
+ * the profile's name.
+ *
+ * @param profile The profile for which the preference controls.
+ * @return A preference that allows the user to choose whether this profile
+ * will be connected to.
+ */
+ private CheckBoxPreference createProfilePreference(Profile profile) {
+ CheckBoxPreference pref = new CheckBoxPreference(this);
+ pref.setKey(profile.toString());
+ pref.setTitle(profile.localizedString);
+ pref.setPersistent(false);
+ pref.setOnPreferenceChangeListener(this);
+
+ refreshProfilePreference(pref, profile);
+
+ return pref;
+ }
+
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ String key = preference.getKey();
+ if (TextUtils.isEmpty(key) || newValue == null) return true;
+
+ if (key.equals(KEY_ONLINE_MODE)) {
+ onOnlineModeCheckedStateChanged((Boolean) newValue);
+
+ } else {
+ Profile profile = getProfileOf(preference);
+ if (profile == null) return false;
+ onProfileCheckedStateChanged(profile, (Boolean) newValue);
+ }
+
+ return true;
+ }
+
+ private void onOnlineModeCheckedStateChanged(boolean checked) {
+ setOnlineMode(checked, true);
+ }
+
+ private void onProfileCheckedStateChanged(Profile profile, boolean checked) {
+ if (mOnlineMode) {
+ if (checked) {
+ mDevice.connect(profile);
+ } else {
+ mDevice.disconnect(profile);
+ }
+ }
+
+ LocalBluetoothProfileManager profileManager = LocalBluetoothProfileManager
+ .getProfileManager(mManager, profile);
+ profileManager.setPreferred(mDevice.getAddress(), checked);
+ }
+
+ public void onDeviceAttributesChanged(LocalBluetoothDevice device) {
+ refresh();
+ }
+
+ private void refresh() {
+ // We are in 'online mode' if we are connected, connecting, or disconnecting
+ setOnlineMode(mDevice.isConnected() || mDevice.isBusy(), false);
+ refreshProfiles();
+ }
+
+ /**
+ * Switches between online/offline mode.
+ *
+ * @param onlineMode Whether to be in online mode, or offline mode.
+ * @param takeAction Whether to take action (i.e., connect or disconnect)
+ * based on the new online mode.
+ */
+ private void setOnlineMode(boolean onlineMode, boolean takeAction) {
+ mOnlineMode = onlineMode;
+
+ if (takeAction) {
+ if (onlineMode) {
+ mDevice.connect();
+ } else {
+ mDevice.disconnect();
+ }
+ }
+
+ refreshOnlineModePreference();
+ }
+
+ private void refreshOnlineModePreference() {
+ mOnlineModePreference.setChecked(mOnlineMode);
+
+ /* Gray out checkbox while connecting and disconnecting */
+ mOnlineModePreference.setEnabled(!mDevice.isBusy());
+
+ /**
+ * If the device is online, show status. Otherwise, show a summary that
+ * describes what the checkbox does.
+ */
+ mOnlineModePreference.setSummary(mOnlineMode ? mDevice.getSummary()
+ : R.string.bluetooth_device_advanced_online_mode_summary);
+ }
+
+ private void refreshProfiles() {
+ for (Profile profile : mDevice.getProfiles()) {
+ CheckBoxPreference profilePref =
+ (CheckBoxPreference) findPreference(profile.toString());
+ if (profilePref == null) {
+ profilePref = createProfilePreference(profile);
+ mProfileContainer.addPreference(profilePref);
+ } else {
+ refreshProfilePreference(profilePref, profile);
+ }
+ }
+ }
+
+ private void refreshProfilePreference(CheckBoxPreference profilePref, Profile profile) {
+ String address = mDevice.getAddress();
+ LocalBluetoothProfileManager profileManager = LocalBluetoothProfileManager
+ .getProfileManager(mManager, profile);
+
+ int connectionStatus = profileManager.getConnectionStatus(address);
+
+ /* Gray out checkbox while connecting and disconnecting */
+ profilePref.setEnabled(!mDevice.isBusy());
+
+ profilePref.setSummary(getProfileSummary(profileManager, profile, address,
+ connectionStatus, mOnlineMode));
+
+ profilePref.setChecked(profileManager.isPreferred(address));
+ }
+
+ private Profile getProfileOf(Preference pref) {
+ if (!(pref instanceof CheckBoxPreference)) return null;
+ String key = pref.getKey();
+ if (TextUtils.isEmpty(key)) return null;
+
+ try {
+ return Profile.valueOf(pref.getKey());
+ } catch (IllegalArgumentException e) {
+ return null;
+ }
+ }
+
+ private static int getProfileSummary(LocalBluetoothProfileManager profileManager,
+ Profile profile, String address, int connectionStatus, boolean onlineMode) {
+ if (!onlineMode || connectionStatus == SettingsBtStatus.CONNECTION_STATUS_DISCONNECTED) {
+ return getProfileSummaryForSettingPreference(profile);
+ } else {
+ return profileManager.getSummary(address);
+ }
+ }
+
+ /**
+ * Gets the summary that describes when checked, it will become a preferred profile.
+ *
+ * @param profile The profile to get the summary for.
+ * @return The summary.
+ */
+ private static final int getProfileSummaryForSettingPreference(Profile profile) {
+ switch (profile) {
+ case A2DP:
+ return R.string.bluetooth_a2dp_profile_summary_use_for;
+ case HEADSET:
+ return R.string.bluetooth_headset_profile_summary_use_for;
+ default:
+ return 0;
+ }
+ }
+
+}
diff --git a/src/com/android/settings/bluetooth/LocalBluetoothDevice.java b/src/com/android/settings/bluetooth/LocalBluetoothDevice.java
new file mode 100644
index 0000000..a488540
--- /dev/null
+++ b/src/com/android/settings/bluetooth/LocalBluetoothDevice.java
@@ -0,0 +1,576 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import com.android.settings.R;
+import com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile;
+
+import android.app.AlertDialog;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothClass;
+import android.bluetooth.IBluetoothDeviceCallback;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.ContextMenu;
+import android.view.Menu;
+import android.view.MenuItem;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * LocalBluetoothDevice represents a remote Bluetooth device. It contains
+ * attributes of the device (such as the address, name, RSSI, etc.) and
+ * functionality that can be performed on the device (connect, pair, disconnect,
+ * etc.).
+ */
+public class LocalBluetoothDevice implements Comparable<LocalBluetoothDevice> {
+ private static final String TAG = "LocalBluetoothDevice";
+
+ private static final int CONTEXT_ITEM_CONNECT = Menu.FIRST + 1;
+ private static final int CONTEXT_ITEM_DISCONNECT = Menu.FIRST + 2;
+ private static final int CONTEXT_ITEM_UNPAIR = Menu.FIRST + 3;
+ private static final int CONTEXT_ITEM_CONNECT_ADVANCED = Menu.FIRST + 4;
+
+ private final String mAddress;
+ private String mName;
+ private short mRssi;
+ private int mBtClass = BluetoothClass.ERROR;
+
+ private List<Profile> mProfiles = new ArrayList<Profile>();
+
+ private boolean mVisible;
+
+ private final LocalBluetoothManager mLocalManager;
+
+ private List<Callback> mCallbacks = new ArrayList<Callback>();
+
+ /**
+ * When we connect to multiple profiles, we only want to display a single
+ * error even if they all fail. This tracks that state.
+ */
+ private boolean mIsConnectingErrorPossible;
+
+ LocalBluetoothDevice(Context context, String address) {
+ mLocalManager = LocalBluetoothManager.getInstance(context);
+ if (mLocalManager == null) {
+ throw new IllegalStateException(
+ "Cannot use LocalBluetoothDevice without Bluetooth hardware");
+ }
+
+ mAddress = address;
+
+ fillData();
+ }
+
+ public void onClicked() {
+ int bondState = getBondState();
+
+ if (isConnected()) {
+ askDisconnect();
+ } else if (bondState == BluetoothDevice.BOND_BONDED) {
+ connect();
+ } else if (bondState == BluetoothDevice.BOND_NOT_BONDED) {
+ pair();
+ }
+ }
+
+ public void disconnect() {
+ for (Profile profile : mProfiles) {
+ disconnect(profile);
+ }
+ }
+
+ public void disconnect(Profile profile) {
+ LocalBluetoothProfileManager profileManager =
+ LocalBluetoothProfileManager.getProfileManager(mLocalManager, profile);
+ int status = profileManager.getConnectionStatus(mAddress);
+ if (SettingsBtStatus.isConnectionStatusConnected(status)) {
+ profileManager.disconnect(mAddress);
+ }
+ }
+
+ public void askDisconnect() {
+ Context context = mLocalManager.getForegroundActivity();
+ if (context == null) {
+ // Cannot ask, since we need an activity context
+ disconnect();
+ return;
+ }
+
+ Resources res = context.getResources();
+
+ String name = getName();
+ if (TextUtils.isEmpty(name)) {
+ name = res.getString(R.string.bluetooth_device);
+ }
+ String message = res.getString(R.string.bluetooth_disconnect_blank, name);
+
+ DialogInterface.OnClickListener disconnectListener = new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ disconnect();
+ }
+ };
+
+ AlertDialog ad = new AlertDialog.Builder(context)
+ .setTitle(getName())
+ .setMessage(message)
+ .setPositiveButton(android.R.string.ok, disconnectListener)
+ .setNegativeButton(android.R.string.cancel, null)
+ .show();
+ }
+
+ public void connect() {
+ if (!ensurePaired()) return;
+
+ // Reset the only-show-one-error-dialog tracking variable
+ mIsConnectingErrorPossible = true;
+
+ Context context = mLocalManager.getContext();
+ boolean hasAtLeastOnePreferredProfile = false;
+ for (Profile profile : mProfiles) {
+ LocalBluetoothProfileManager profileManager =
+ LocalBluetoothProfileManager.getProfileManager(mLocalManager, profile);
+ if (profileManager.isPreferred(mAddress)) {
+ hasAtLeastOnePreferredProfile = true;
+ connectInt(profile);
+ }
+ }
+
+ if (!hasAtLeastOnePreferredProfile) {
+ connectAndPreferAllProfiles();
+ }
+ }
+
+ private void connectAndPreferAllProfiles() {
+ if (!ensurePaired()) return;
+
+ // Reset the only-show-one-error-dialog tracking variable
+ mIsConnectingErrorPossible = true;
+
+ Context context = mLocalManager.getContext();
+ for (Profile profile : mProfiles) {
+ LocalBluetoothProfileManager profileManager =
+ LocalBluetoothProfileManager.getProfileManager(mLocalManager, profile);
+ profileManager.setPreferred(mAddress, true);
+ connectInt(profile);
+ }
+ }
+
+ public void connect(Profile profile) {
+ // Reset the only-show-one-error-dialog tracking variable
+ mIsConnectingErrorPossible = true;
+ connectInt(profile);
+ }
+
+ public void connectInt(Profile profile) {
+ if (!ensurePaired()) return;
+
+ LocalBluetoothProfileManager profileManager =
+ LocalBluetoothProfileManager.getProfileManager(mLocalManager, profile);
+ int status = profileManager.getConnectionStatus(mAddress);
+ if (!SettingsBtStatus.isConnectionStatusConnected(status)) {
+ if (profileManager.connect(mAddress) != BluetoothDevice.RESULT_SUCCESS) {
+ Log.i(TAG, "Failed to connect " + profile.toString() + " to " + mName);
+ }
+ }
+ }
+
+ public void showConnectingError() {
+ if (!mIsConnectingErrorPossible) return;
+ mIsConnectingErrorPossible = false;
+
+ mLocalManager.showError(mAddress, R.string.bluetooth_error_title,
+ R.string.bluetooth_connecting_error_message);
+ }
+
+ private boolean ensurePaired() {
+ if (getBondState() == BluetoothDevice.BOND_NOT_BONDED) {
+ pair();
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ public void pair() {
+ BluetoothDevice manager = mLocalManager.getBluetoothManager();
+
+ // Pairing is unreliable while scanning, so cancel discovery
+ if (manager.isDiscovering()) {
+ manager.cancelDiscovery();
+ }
+
+ if (!mLocalManager.getBluetoothManager().createBond(mAddress)) {
+ mLocalManager.showError(mAddress, R.string.bluetooth_error_title,
+ R.string.bluetooth_pairing_error_message);
+ }
+ }
+
+ public void unpair() {
+ BluetoothDevice manager = mLocalManager.getBluetoothManager();
+
+ switch (getBondState()) {
+ case BluetoothDevice.BOND_BONDED:
+ manager.removeBond(mAddress);
+ break;
+
+ case BluetoothDevice.BOND_BONDING:
+ manager.cancelBondProcess(mAddress);
+ break;
+ }
+ }
+
+ private void fillData() {
+ BluetoothDevice manager = mLocalManager.getBluetoothManager();
+
+ fetchName();
+ fetchBtClass();
+
+ mVisible = false;
+
+ dispatchAttributesChanged();
+ }
+
+ public String getAddress() {
+ return mAddress;
+ }
+
+ public String getName() {
+ return mName;
+ }
+
+ public void refreshName() {
+ fetchName();
+ dispatchAttributesChanged();
+ }
+
+ private void fetchName() {
+ mName = mLocalManager.getBluetoothManager().getRemoteName(mAddress);
+
+ if (TextUtils.isEmpty(mName)) {
+ mName = mAddress;
+ }
+ }
+
+ public void refresh() {
+ dispatchAttributesChanged();
+ }
+
+ public boolean isVisible() {
+ return mVisible;
+ }
+
+ void setVisible(boolean visible) {
+ if (mVisible != visible) {
+ mVisible = visible;
+ dispatchAttributesChanged();
+ }
+ }
+
+ public int getBondState() {
+ return mLocalManager.getBluetoothManager().getBondState(mAddress);
+ }
+
+ void setRssi(short rssi) {
+ if (mRssi != rssi) {
+ mRssi = rssi;
+ dispatchAttributesChanged();
+ }
+ }
+
+ /**
+ * Checks whether we are connected to this device (any profile counts).
+ *
+ * @return Whether it is connected.
+ */
+ public boolean isConnected() {
+ for (Profile profile : mProfiles) {
+ int status = LocalBluetoothProfileManager.getProfileManager(mLocalManager, profile)
+ .getConnectionStatus(mAddress);
+ if (SettingsBtStatus.isConnectionStatusConnected(status)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public boolean isBusy() {
+ for (Profile profile : mProfiles) {
+ int status = LocalBluetoothProfileManager.getProfileManager(mLocalManager, profile)
+ .getConnectionStatus(mAddress);
+ if (SettingsBtStatus.isConnectionStatusBusy(status)) {
+ return true;
+ }
+ }
+
+ if (getBondState() == BluetoothDevice.BOND_BONDING) {
+ return true;
+ }
+
+ return false;
+ }
+
+ public int getBtClassDrawable() {
+
+ // First try looking at profiles
+ if (mProfiles.contains(Profile.A2DP)) {
+ return R.drawable.ic_bt_headphones_a2dp;
+ } else if (mProfiles.contains(Profile.HEADSET)) {
+ return R.drawable.ic_bt_headset_hfp;
+ }
+
+ // Fallback on class
+ switch (BluetoothClass.Device.Major.getDeviceMajor(mBtClass)) {
+ case BluetoothClass.Device.Major.COMPUTER:
+ return R.drawable.ic_bt_laptop;
+
+ case BluetoothClass.Device.Major.PHONE:
+ return R.drawable.ic_bt_cellphone;
+
+ default:
+ return 0;
+ }
+ }
+
+ /**
+ * Fetches a new value for the cached BT class.
+ */
+ private void fetchBtClass() {
+ mBtClass = mLocalManager.getBluetoothManager().getRemoteClass(mAddress);
+ mProfiles.clear();
+ LocalBluetoothProfileManager.fill(mBtClass, mProfiles);
+ }
+
+ /**
+ * Refreshes the UI for the BT class, including fetching the latest value
+ * for the class.
+ */
+ public void refreshBtClass() {
+ fetchBtClass();
+ dispatchAttributesChanged();
+ }
+
+ public int getSummary() {
+ // TODO: clean up
+ int oneOffSummary = getOneOffSummary();
+ if (oneOffSummary != 0) {
+ return oneOffSummary;
+ }
+
+ for (Profile profile : mProfiles) {
+ LocalBluetoothProfileManager profileManager = LocalBluetoothProfileManager
+ .getProfileManager(mLocalManager, profile);
+ int connectionStatus = profileManager.getConnectionStatus(mAddress);
+
+ if (SettingsBtStatus.isConnectionStatusConnected(connectionStatus) ||
+ connectionStatus == SettingsBtStatus.CONNECTION_STATUS_CONNECTING ||
+ connectionStatus == SettingsBtStatus.CONNECTION_STATUS_DISCONNECTING) {
+ return SettingsBtStatus.getConnectionStatusSummary(connectionStatus);
+ }
+ }
+
+ return SettingsBtStatus.getPairingStatusSummary(getBondState());
+ }
+
+ /**
+ * We have special summaries when particular profiles are connected. This
+ * checks for those states and returns an applicable summary.
+ *
+ * @return A one-off summary that is applicable for the current state, or 0.
+ */
+ private int getOneOffSummary() {
+ boolean isA2dpConnected = false, isHeadsetConnected = false, isConnecting = false;
+
+ if (mProfiles.contains(Profile.A2DP)) {
+ LocalBluetoothProfileManager profileManager = LocalBluetoothProfileManager
+ .getProfileManager(mLocalManager, Profile.A2DP);
+ isConnecting = profileManager.getConnectionStatus(mAddress) ==
+ SettingsBtStatus.CONNECTION_STATUS_CONNECTING;
+ isA2dpConnected = profileManager.isConnected(mAddress);
+ }
+
+ if (mProfiles.contains(Profile.HEADSET)) {
+ LocalBluetoothProfileManager profileManager = LocalBluetoothProfileManager
+ .getProfileManager(mLocalManager, Profile.HEADSET);
+ isConnecting |= profileManager.getConnectionStatus(mAddress) ==
+ SettingsBtStatus.CONNECTION_STATUS_CONNECTING;
+ isHeadsetConnected = profileManager.isConnected(mAddress);
+ }
+
+ if (isConnecting) {
+ // If any of these important profiles is connecting, prefer that
+ return SettingsBtStatus.getConnectionStatusSummary(
+ SettingsBtStatus.CONNECTION_STATUS_CONNECTING);
+ } else if (isA2dpConnected && isHeadsetConnected) {
+ return R.string.bluetooth_summary_connected_to_a2dp_headset;
+ } else if (isA2dpConnected) {
+ return R.string.bluetooth_summary_connected_to_a2dp;
+ } else if (isHeadsetConnected) {
+ return R.string.bluetooth_summary_connected_to_headset;
+ } else {
+ return 0;
+ }
+ }
+
+ public List<Profile> getProfiles() {
+ return new ArrayList<Profile>(mProfiles);
+ }
+
+ public void onCreateContextMenu(ContextMenu menu) {
+ // No context menu if it is busy (none of these items are applicable if busy)
+ if (isBusy()) return;
+
+ int bondState = getBondState();
+ boolean isConnected = isConnected();
+ boolean hasProfiles = mProfiles.size() > 0;
+
+ menu.setHeaderTitle(getName());
+
+ if (isConnected) {
+ menu.add(0, CONTEXT_ITEM_DISCONNECT, 0, R.string.bluetooth_device_context_disconnect);
+ } else if (hasProfiles) {
+ // For connection action, show either "Connect" or "Pair & connect"
+ int connectString = (bondState == BluetoothDevice.BOND_NOT_BONDED)
+ ? R.string.bluetooth_device_context_pair_connect
+ : R.string.bluetooth_device_context_connect;
+ menu.add(0, CONTEXT_ITEM_CONNECT, 0, connectString);
+ }
+
+ if (bondState == BluetoothDevice.BOND_BONDED) {
+ // For unpair action, show either "Unpair" or "Disconnect & unpair"
+ int unpairString = isConnected
+ ? R.string.bluetooth_device_context_disconnect_unpair
+ : R.string.bluetooth_device_context_unpair;
+ menu.add(0, CONTEXT_ITEM_UNPAIR, 0, unpairString);
+
+ // Show the connection options item
+ menu.add(0, CONTEXT_ITEM_CONNECT_ADVANCED, 0,
+ R.string.bluetooth_device_context_connect_advanced);
+ }
+ }
+
+ /**
+ * Called when a context menu item is clicked.
+ *
+ * @param item The item that was clicked.
+ */
+ public void onContextItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case CONTEXT_ITEM_DISCONNECT:
+ disconnect();
+ break;
+
+ case CONTEXT_ITEM_CONNECT:
+ connect();
+ break;
+
+ case CONTEXT_ITEM_UNPAIR:
+ mLocalManager.getBluetoothManager().disconnectRemoteDeviceAcl(mAddress);
+ unpair();
+ break;
+
+ case CONTEXT_ITEM_CONNECT_ADVANCED:
+ Intent intent = new Intent();
+ // Need an activity context to open this in our task
+ Context context = mLocalManager.getForegroundActivity();
+ if (context == null) {
+ // Fallback on application context, and open in a new task
+ context = mLocalManager.getContext();
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+ intent.setClass(context, ConnectSpecificProfilesActivity.class);
+ intent.putExtra(ConnectSpecificProfilesActivity.EXTRA_ADDRESS, mAddress);
+ context.startActivity(intent);
+ break;
+ }
+ }
+
+ public void registerCallback(Callback callback) {
+ synchronized (mCallbacks) {
+ mCallbacks.add(callback);
+ }
+ }
+
+ public void unregisterCallback(Callback callback) {
+ synchronized (mCallbacks) {
+ mCallbacks.remove(callback);
+ }
+ }
+
+ private void dispatchAttributesChanged() {
+ synchronized (mCallbacks) {
+ for (Callback callback : mCallbacks) {
+ callback.onDeviceAttributesChanged(this);
+ }
+ }
+ }
+
+ @Override
+ public String toString() {
+ return mAddress;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if ((o == null) || !(o instanceof LocalBluetoothDevice)) {
+ throw new ClassCastException();
+ }
+
+ return mAddress.equals(((LocalBluetoothDevice) o).mAddress);
+ }
+
+ @Override
+ public int hashCode() {
+ return mAddress.hashCode();
+ }
+
+ public int compareTo(LocalBluetoothDevice another) {
+ int comparison;
+
+ // Connected above not connected
+ comparison = (another.isConnected() ? 1 : 0) - (isConnected() ? 1 : 0);
+ if (comparison != 0) return comparison;
+
+ // Paired above not paired
+ comparison = (another.getBondState() == BluetoothDevice.BOND_BONDED ? 1 : 0) -
+ (getBondState() == BluetoothDevice.BOND_BONDED ? 1 : 0);
+ if (comparison != 0) return comparison;
+
+ // Visible above not visible
+ comparison = (another.mVisible ? 1 : 0) - (mVisible ? 1 : 0);
+ if (comparison != 0) return comparison;
+
+ // Stronger signal above weaker signal
+ comparison = another.mRssi - mRssi;
+ if (comparison != 0) return comparison;
+
+ // Fallback on name
+ return getName().compareTo(another.getName());
+ }
+
+ public interface Callback {
+ void onDeviceAttributesChanged(LocalBluetoothDevice device);
+ }
+}
diff --git a/src/com/android/settings/bluetooth/LocalBluetoothDeviceManager.java b/src/com/android/settings/bluetooth/LocalBluetoothDeviceManager.java
new file mode 100644
index 0000000..6bb2b4a
--- /dev/null
+++ b/src/com/android/settings/bluetooth/LocalBluetoothDeviceManager.java
@@ -0,0 +1,229 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import android.app.AlertDialog;
+import android.bluetooth.BluetoothDevice;
+import android.util.Log;
+import android.widget.Toast;
+import android.content.Context;
+
+import com.android.settings.R;
+import com.android.settings.bluetooth.LocalBluetoothManager.Callback;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * LocalBluetoothDeviceManager manages the set of remote Bluetooth devices.
+ */
+public class LocalBluetoothDeviceManager {
+ private static final String TAG = "LocalBluetoothDeviceManager";
+
+ final LocalBluetoothManager mLocalManager;
+ final List<Callback> mCallbacks;
+
+ final List<LocalBluetoothDevice> mDevices = new ArrayList<LocalBluetoothDevice>();
+
+ public LocalBluetoothDeviceManager(LocalBluetoothManager localManager) {
+ mLocalManager = localManager;
+ mCallbacks = localManager.getCallbacks();
+ readPairedDevices();
+ }
+
+ private synchronized boolean readPairedDevices() {
+ BluetoothDevice manager = mLocalManager.getBluetoothManager();
+ String[] bondedAddresses = manager.listBonds();
+ if (bondedAddresses == null) return false;
+
+ boolean deviceAdded = false;
+ for (String address : bondedAddresses) {
+ LocalBluetoothDevice device = findDevice(address);
+ if (device == null) {
+ device = new LocalBluetoothDevice(mLocalManager.getContext(), address);
+ mDevices.add(device);
+ dispatchDeviceAdded(device);
+ deviceAdded = true;
+ }
+ }
+
+ return deviceAdded;
+ }
+
+ public synchronized List<LocalBluetoothDevice> getDevicesCopy() {
+ return new ArrayList<LocalBluetoothDevice>(mDevices);
+ }
+
+ void onBluetoothStateChanged(boolean enabled) {
+ if (enabled) {
+ readPairedDevices();
+ }
+ }
+
+ public synchronized void onDeviceAppeared(String address, short rssi) {
+ boolean deviceAdded = false;
+
+ LocalBluetoothDevice device = findDevice(address);
+ if (device == null) {
+ device = new LocalBluetoothDevice(mLocalManager.getContext(), address);
+ mDevices.add(device);
+ deviceAdded = true;
+ }
+
+ device.setRssi(rssi);
+ device.setVisible(true);
+
+ if (deviceAdded) {
+ dispatchDeviceAdded(device);
+ }
+ }
+
+ public synchronized void onDeviceDisappeared(String address) {
+ LocalBluetoothDevice device = findDevice(address);
+ if (device == null) return;
+
+ device.setVisible(false);
+ checkForDeviceRemoval(device);
+ }
+
+ private void checkForDeviceRemoval(LocalBluetoothDevice device) {
+ if (device.getBondState() == BluetoothDevice.BOND_NOT_BONDED &&
+ !device.isVisible()) {
+ // If device isn't paired, remove it altogether
+ mDevices.remove(device);
+ dispatchDeviceDeleted(device);
+ }
+ }
+
+ public synchronized void onDeviceNameUpdated(String address) {
+ LocalBluetoothDevice device = findDevice(address);
+ if (device != null) {
+ device.refreshName();
+ }
+ }
+
+ public synchronized LocalBluetoothDevice findDevice(String address) {
+
+ for (int i = mDevices.size() - 1; i >= 0; i--) {
+ LocalBluetoothDevice device = mDevices.get(i);
+
+ if (device.getAddress().equals(address)) {
+ return device;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Attempts to get the name of a remote device, otherwise returns the address.
+ *
+ * @param address The address.
+ * @return The name, or if unavailable, the address.
+ */
+ public String getName(String address) {
+ LocalBluetoothDevice device = findDevice(address);
+ return device != null ? device.getName() : address;
+ }
+
+ private void dispatchDeviceAdded(LocalBluetoothDevice device) {
+ synchronized (mCallbacks) {
+ for (Callback callback : mCallbacks) {
+ callback.onDeviceAdded(device);
+ }
+ }
+
+ // TODO: divider between prev paired/connected and scanned
+ }
+
+ private void dispatchDeviceDeleted(LocalBluetoothDevice device) {
+ synchronized (mCallbacks) {
+ for (Callback callback : mCallbacks) {
+ callback.onDeviceDeleted(device);
+ }
+ }
+ }
+
+ public synchronized void onBondingStateChanged(String address, int bondState) {
+ LocalBluetoothDevice device = findDevice(address);
+ if (device == null) {
+ if (!readPairedDevices()) {
+ Log.e(TAG, "Got bonding state changed for " + address +
+ ", but we have no record of that device.");
+ }
+ return;
+ }
+
+ device.refresh();
+
+ if (bondState == BluetoothDevice.BOND_BONDED) {
+ // Auto-connect after pairing
+ device.connect();
+ }
+ }
+
+ /**
+ * Called when there is a bonding error.
+ *
+ * @param address The address of the remote device.
+ * @param reason The reason, one of the error reasons from
+ * 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);
+ }
+
+ public synchronized void onProfileStateChanged(String address) {
+ LocalBluetoothDevice device = findDevice(address);
+ if (device == null) return;
+
+ device.refresh();
+ }
+
+ public synchronized void onConnectingError(String address) {
+ LocalBluetoothDevice device = findDevice(address);
+ if (device == null) return;
+
+ /*
+ * Go through the device's delegate so we don't spam the user with
+ * errors connecting to different profiles, and instead make sure the
+ * user sees a single error for his single 'connect' action.
+ */
+ device.showConnectingError();
+ }
+
+ public synchronized void onScanningStateChanged(boolean started) {
+ if (!started) return;
+
+ // If starting a new scan, clear old visibility
+ for (int i = mDevices.size() - 1; i >= 0; i--) {
+ LocalBluetoothDevice device = mDevices.get(i);
+ device.setVisible(false);
+ checkForDeviceRemoval(device);
+ }
+ }
+
+ public synchronized void onBtClassChanged(String address) {
+ LocalBluetoothDevice device = findDevice(address);
+ if (device != null) {
+ device.refreshBtClass();
+ }
+ }
+}
diff --git a/src/com/android/settings/bluetooth/LocalBluetoothManager.java b/src/com/android/settings/bluetooth/LocalBluetoothManager.java
new file mode 100644
index 0000000..4671fac
--- /dev/null
+++ b/src/com/android/settings/bluetooth/LocalBluetoothManager.java
@@ -0,0 +1,279 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import com.android.settings.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.bluetooth.BluetoothA2dp;
+import android.bluetooth.BluetoothDevice;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.util.Log;
+import android.widget.Toast;
+
+// TODO: have some notion of shutting down. Maybe a minute after they leave BT settings?
+/**
+ * LocalBluetoothManager provides a simplified interface on top of a subset of
+ * the Bluetooth API.
+ */
+public class LocalBluetoothManager {
+ private static final String TAG = "LocalBluetoothManager";
+ static final boolean V = true;
+
+ public static final String EXTENDED_BLUETOOTH_STATE_CHANGED_ACTION =
+ "com.android.settings.bluetooth.intent.action.EXTENDED_BLUETOOTH_STATE_CHANGED";
+ private static final String SHARED_PREFERENCES_NAME = "bluetooth_settings";
+
+ private static LocalBluetoothManager INSTANCE;
+ /** Used when obtaining a reference to the singleton instance. */
+ private static Object INSTANCE_LOCK = new Object();
+ private boolean mInitialized;
+
+ private Context mContext;
+ /** If a BT-related activity is in the foreground, this will be it. */
+ private Activity mForegroundActivity;
+ private AlertDialog mErrorDialog = null;
+
+ private BluetoothDevice mManager;
+
+ private LocalBluetoothDeviceManager mLocalDeviceManager;
+ private BluetoothEventRedirector mEventRedirector;
+ private BluetoothA2dp mBluetoothA2dp;
+
+ public static enum ExtendedBluetoothState { ENABLED, ENABLING, DISABLED, DISABLING, UNKNOWN }
+ private ExtendedBluetoothState mState = ExtendedBluetoothState.UNKNOWN;
+
+ private List<Callback> mCallbacks = new ArrayList<Callback>();
+
+ private static final int SCAN_EXPIRATION_MS = 5 * 60 * 1000; // 5 mins
+ private long mLastScan;
+
+ public static LocalBluetoothManager getInstance(Context context) {
+ synchronized (INSTANCE_LOCK) {
+ if (INSTANCE == null) {
+ INSTANCE = new LocalBluetoothManager();
+ }
+
+ if (!INSTANCE.init(context)) {
+ return null;
+ }
+
+ return INSTANCE;
+ }
+ }
+
+ private boolean init(Context context) {
+ if (mInitialized) return true;
+ mInitialized = true;
+
+ // This will be around as long as this process is
+ mContext = context.getApplicationContext();
+
+ mManager = (BluetoothDevice) context.getSystemService(Context.BLUETOOTH_SERVICE);
+ if (mManager == null) {
+ return false;
+ }
+
+ mLocalDeviceManager = new LocalBluetoothDeviceManager(this);
+
+ mEventRedirector = new BluetoothEventRedirector(this);
+ mEventRedirector.start();
+
+ mBluetoothA2dp = new BluetoothA2dp(context);
+
+ return true;
+ }
+
+ public BluetoothDevice getBluetoothManager() {
+ return mManager;
+ }
+
+ public Context getContext() {
+ return mContext;
+ }
+
+ public Activity getForegroundActivity() {
+ return mForegroundActivity;
+ }
+
+ public void setForegroundActivity(Activity activity) {
+ if (mErrorDialog != null) {
+ mErrorDialog.dismiss();
+ mErrorDialog = null;
+ }
+ mForegroundActivity = activity;
+ }
+
+ public SharedPreferences getSharedPreferences() {
+ return mContext.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
+ }
+
+ public LocalBluetoothDeviceManager getLocalDeviceManager() {
+ return mLocalDeviceManager;
+ }
+
+ List<Callback> getCallbacks() {
+ return mCallbacks;
+ }
+
+ public void registerCallback(Callback callback) {
+ synchronized (mCallbacks) {
+ mCallbacks.add(callback);
+ }
+ }
+
+ public void unregisterCallback(Callback callback) {
+ synchronized (mCallbacks) {
+ mCallbacks.remove(callback);
+ }
+ }
+
+ public void startScanning(boolean force) {
+ if (mManager.isDiscovering()) {
+ /*
+ * Already discovering, but give the callback that information.
+ * Note: we only call the callbacks, not the same path as if the
+ * scanning state had really changed (in that case the device
+ * manager would clear its list of unpaired scanned devices).
+ */
+ dispatchScanningStateChanged(true);
+ } else {
+ if (!force) {
+ // Don't scan more than frequently than SCAN_EXPIRATION_MS,
+ // unless forced
+ if (mLastScan + SCAN_EXPIRATION_MS > System.currentTimeMillis()) {
+ return;
+ }
+
+ // If we are playing music, don't scan unless forced.
+ List<String> sinks = mBluetoothA2dp.listConnectedSinks();
+ if (sinks != null) {
+ for (String address : sinks) {
+ if (mBluetoothA2dp.getSinkState(address) == BluetoothA2dp.STATE_PLAYING) {
+ return;
+ }
+ }
+ }
+ }
+
+ if (mManager.startDiscovery(true)) {
+ mLastScan = System.currentTimeMillis();
+ }
+ }
+ }
+
+ public ExtendedBluetoothState getBluetoothState() {
+
+ if (mState == ExtendedBluetoothState.UNKNOWN) {
+ syncBluetoothState();
+ }
+
+ return mState;
+ }
+
+ void setBluetoothStateInt(ExtendedBluetoothState state) {
+ mState = state;
+
+ /*
+ * TODO: change to callback method. originally it was broadcast to
+ * parallel the framework's method, but it just complicates things here.
+ */
+ // If this were a real API, I'd add as an extra
+ mContext.sendBroadcast(new Intent(EXTENDED_BLUETOOTH_STATE_CHANGED_ACTION));
+
+ if (state == ExtendedBluetoothState.ENABLED || state == ExtendedBluetoothState.DISABLED) {
+ mLocalDeviceManager.onBluetoothStateChanged(state == ExtendedBluetoothState.ENABLED);
+ }
+ }
+
+ private void syncBluetoothState() {
+ setBluetoothStateInt(mManager.isEnabled()
+ ? ExtendedBluetoothState.ENABLED
+ : ExtendedBluetoothState.DISABLED);
+ }
+
+ public void setBluetoothEnabled(boolean enabled) {
+ boolean wasSetStateSuccessful = enabled
+ ? mManager.enable()
+ : mManager.disable();
+
+ if (wasSetStateSuccessful) {
+ setBluetoothStateInt(enabled
+ ? ExtendedBluetoothState.ENABLING
+ : ExtendedBluetoothState.DISABLING);
+ } else {
+ if (V) {
+ Log.v(TAG,
+ "setBluetoothEnabled call, manager didn't return success for enabled: "
+ + enabled);
+ }
+
+ syncBluetoothState();
+ }
+ }
+
+ /**
+ * @param started True if scanning started, false if scanning finished.
+ */
+ void onScanningStateChanged(boolean started) {
+ // TODO: have it be a callback (once we switch bluetooth state changed to callback)
+ mLocalDeviceManager.onScanningStateChanged(started);
+ dispatchScanningStateChanged(started);
+ }
+
+ private void dispatchScanningStateChanged(boolean started) {
+ synchronized (mCallbacks) {
+ for (Callback callback : mCallbacks) {
+ callback.onScanningStateChanged(started);
+ }
+ }
+ }
+
+ public void showError(String address, int titleResId, int messageResId) {
+ LocalBluetoothDevice device = mLocalDeviceManager.findDevice(address);
+ if (device == null) return;
+
+ String name = device.getName();
+ String message = mContext.getString(messageResId, name);
+
+ if (mForegroundActivity != null) {
+ // Need an activity context to show a dialog
+ mErrorDialog = new AlertDialog.Builder(mForegroundActivity)
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setTitle(titleResId)
+ .setMessage(message)
+ .setPositiveButton(android.R.string.ok, null)
+ .show();
+ } else {
+ // Fallback on a toast
+ Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ public interface Callback {
+ void onScanningStateChanged(boolean started);
+ void onDeviceAdded(LocalBluetoothDevice device);
+ void onDeviceDeleted(LocalBluetoothDevice device);
+ }
+
+}
diff --git a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java
new file mode 100644
index 0000000..a1a2af6
--- /dev/null
+++ b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java
@@ -0,0 +1,280 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.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 java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * LocalBluetoothProfileManager is an abstract class defining the basic
+ * functionality related to a profile.
+ */
+public abstract class LocalBluetoothProfileManager {
+
+ // TODO: close profiles when we're shutting down
+ private static Map<Profile, LocalBluetoothProfileManager> sProfileMap =
+ new HashMap<Profile, LocalBluetoothProfileManager>();
+
+ protected LocalBluetoothManager mLocalManager;
+
+ public static LocalBluetoothProfileManager getProfileManager(LocalBluetoothManager localManager,
+ Profile profile) {
+
+ LocalBluetoothProfileManager profileManager;
+
+ synchronized (sProfileMap) {
+ profileManager = sProfileMap.get(profile);
+
+ if (profileManager == null) {
+ switch (profile) {
+ case A2DP:
+ profileManager = new A2dpProfileManager(localManager);
+ break;
+
+ case HEADSET:
+ profileManager = new HeadsetProfileManager(localManager);
+ break;
+ }
+
+ sProfileMap.put(profile, profileManager);
+ }
+ }
+
+ return profileManager;
+ }
+
+ /**
+ * Temporary method to fill profiles based on a device's class.
+ *
+ * @param btClass The class
+ * @param profiles The list of profiles to fill
+ */
+ public static void fill(int btClass, List<Profile> profiles) {
+ profiles.clear();
+
+ if (BluetoothA2dp.doesClassMatchSink(btClass)) {
+ profiles.add(Profile.A2DP);
+ }
+
+ if (BluetoothHeadset.doesClassMatch(btClass)) {
+ profiles.add(Profile.HEADSET);
+ }
+ }
+
+ protected LocalBluetoothProfileManager(LocalBluetoothManager localManager) {
+ mLocalManager = localManager;
+ }
+
+ public abstract int connect(String address);
+
+ public abstract int disconnect(String address);
+
+ public abstract int getConnectionStatus(String address);
+
+ public abstract int getSummary(String address);
+
+ public abstract boolean isPreferred(String address);
+
+ public abstract void setPreferred(String address, boolean preferred);
+
+ public boolean isConnected(String address) {
+ return SettingsBtStatus.isConnectionStatusConnected(getConnectionStatus(address));
+ }
+
+ // TODO: int instead of enum
+ public enum Profile {
+ HEADSET(R.string.bluetooth_profile_headset),
+ A2DP(R.string.bluetooth_profile_a2dp);
+
+ public final int localizedString;
+
+ private Profile(int localizedString) {
+ this.localizedString = localizedString;
+ }
+ }
+
+ /**
+ * A2dpProfileManager is an abstraction for the {@link BluetoothA2dp} service.
+ */
+ private static class A2dpProfileManager extends LocalBluetoothProfileManager {
+ private BluetoothA2dp mService;
+
+ public A2dpProfileManager(LocalBluetoothManager localManager) {
+ super(localManager);
+ mService = new BluetoothA2dp(localManager.getContext());
+ }
+
+ @Override
+ public int connect(String address) {
+ return mService.connectSink(address);
+ }
+
+ @Override
+ public int disconnect(String address) {
+ return mService.disconnectSink(address);
+ }
+
+ @Override
+ public int getConnectionStatus(String address) {
+ return convertState(mService.getSinkState(address));
+ }
+
+ @Override
+ public int getSummary(String address) {
+ int connectionStatus = getConnectionStatus(address);
+
+ if (SettingsBtStatus.isConnectionStatusConnected(connectionStatus)) {
+ return R.string.bluetooth_a2dp_profile_summary_connected;
+ } else {
+ return SettingsBtStatus.getConnectionStatusSummary(connectionStatus);
+ }
+ }
+
+ @Override
+ public boolean isPreferred(String address) {
+ return mService.getSinkPriority(address) > BluetoothA2dp.PRIORITY_OFF;
+ }
+
+ @Override
+ public void setPreferred(String address, boolean preferred) {
+ mService.setSinkPriority(address,
+ preferred ? BluetoothA2dp.PRIORITY_AUTO : BluetoothA2dp.PRIORITY_OFF);
+ }
+
+ private static int convertState(int a2dpState) {
+ switch (a2dpState) {
+ case BluetoothA2dp.STATE_CONNECTED:
+ return SettingsBtStatus.CONNECTION_STATUS_CONNECTED;
+ case BluetoothA2dp.STATE_CONNECTING:
+ return SettingsBtStatus.CONNECTION_STATUS_CONNECTING;
+ case BluetoothA2dp.STATE_DISCONNECTED:
+ return SettingsBtStatus.CONNECTION_STATUS_DISCONNECTED;
+ case BluetoothA2dp.STATE_DISCONNECTING:
+ return SettingsBtStatus.CONNECTION_STATUS_DISCONNECTING;
+ case BluetoothA2dp.STATE_PLAYING:
+ return SettingsBtStatus.CONNECTION_STATUS_ACTIVE;
+ default:
+ return SettingsBtStatus.CONNECTION_STATUS_UNKNOWN;
+ }
+ }
+ }
+
+ /**
+ * HeadsetProfileManager is an abstraction for the {@link BluetoothHeadset} service.
+ */
+ private static class HeadsetProfileManager extends LocalBluetoothProfileManager
+ implements BluetoothHeadset.ServiceListener {
+ private BluetoothHeadset mService;
+ private Handler mUiHandler = new Handler();
+
+ public HeadsetProfileManager(LocalBluetoothManager localManager) {
+ super(localManager);
+ mService = new BluetoothHeadset(localManager.getContext(), this);
+ }
+
+ public void onServiceConnected() {
+ // This could be called on a non-UI thread, funnel to UI thread.
+ mUiHandler.post(new Runnable() {
+ public void run() {
+ /*
+ * We just bound to the service, so refresh the UI of the
+ * headset device.
+ */
+ String address = mService.getHeadsetAddress();
+ if (TextUtils.isEmpty(address)) return;
+ mLocalManager.getLocalDeviceManager().onProfileStateChanged(address);
+ }
+ });
+ }
+
+ public void onServiceDisconnected() {
+ }
+
+ @Override
+ public int connect(String address) {
+ // Since connectHeadset fails if already connected to a headset, we
+ // disconnect from any headset first
+ mService.disconnectHeadset();
+ return mService.connectHeadset(address)
+ ? BluetoothError.SUCCESS : BluetoothError.ERROR;
+ }
+
+ @Override
+ public int disconnect(String address) {
+ if (mService.getHeadsetAddress().equals(address)) {
+ return mService.disconnectHeadset() ? BluetoothError.SUCCESS : BluetoothError.ERROR;
+ } else {
+ return BluetoothError.SUCCESS;
+ }
+ }
+
+ @Override
+ public int getConnectionStatus(String address) {
+ String headsetAddress = mService.getHeadsetAddress();
+ return headsetAddress != null && headsetAddress.equals(address)
+ ? convertState(mService.getState())
+ : SettingsBtStatus.CONNECTION_STATUS_DISCONNECTED;
+ }
+
+ @Override
+ public int getSummary(String address) {
+ int connectionStatus = getConnectionStatus(address);
+
+ if (SettingsBtStatus.isConnectionStatusConnected(connectionStatus)) {
+ return R.string.bluetooth_headset_profile_summary_connected;
+ } else {
+ return SettingsBtStatus.getConnectionStatusSummary(connectionStatus);
+ }
+ }
+
+ @Override
+ public boolean isPreferred(String address) {
+ return mService.getPriority(address) > BluetoothHeadset.PRIORITY_OFF;
+ }
+
+ @Override
+ public void setPreferred(String address, boolean preferred) {
+ mService.setPriority(address,
+ preferred ? BluetoothHeadset.PRIORITY_AUTO : BluetoothHeadset.PRIORITY_OFF);
+ }
+
+ private static int convertState(int headsetState) {
+ switch (headsetState) {
+ case BluetoothHeadset.STATE_CONNECTED:
+ return SettingsBtStatus.CONNECTION_STATUS_CONNECTED;
+ case BluetoothHeadset.STATE_CONNECTING:
+ return SettingsBtStatus.CONNECTION_STATUS_CONNECTING;
+ case BluetoothHeadset.STATE_DISCONNECTED:
+ return SettingsBtStatus.CONNECTION_STATUS_DISCONNECTED;
+ default:
+ return SettingsBtStatus.CONNECTION_STATUS_UNKNOWN;
+ }
+ }
+ }
+}
diff --git a/src/com/android/settings/bluetooth/SettingsBtStatus.java b/src/com/android/settings/bluetooth/SettingsBtStatus.java
new file mode 100644
index 0000000..d2cbef5
--- /dev/null
+++ b/src/com/android/settings/bluetooth/SettingsBtStatus.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import android.bluetooth.BluetoothDevice;
+
+import com.android.settings.R;
+
+/**
+ * SettingsBtStatus is a helper class that contains constants for various status
+ * codes.
+ */
+public class SettingsBtStatus {
+ private static final String TAG = "SettingsBtStatus";
+
+ // Connection status
+
+ public static final int CONNECTION_STATUS_UNKNOWN = 0;
+ public static final int CONNECTION_STATUS_ACTIVE = 1;
+ /** Use {@link #isConnected} to check for the connected state */
+ public static final int CONNECTION_STATUS_CONNECTED = 2;
+ public static final int CONNECTION_STATUS_CONNECTING = 3;
+ public static final int CONNECTION_STATUS_DISCONNECTED = 4;
+ public static final int CONNECTION_STATUS_DISCONNECTING = 5;
+
+ public static final int getConnectionStatusSummary(int connectionStatus) {
+ switch (connectionStatus) {
+ case CONNECTION_STATUS_ACTIVE:
+ return R.string.bluetooth_connected;
+ case CONNECTION_STATUS_CONNECTED:
+ return R.string.bluetooth_connected;
+ case CONNECTION_STATUS_CONNECTING:
+ return R.string.bluetooth_connecting;
+ case CONNECTION_STATUS_DISCONNECTED:
+ return R.string.bluetooth_disconnected;
+ case CONNECTION_STATUS_DISCONNECTING:
+ return R.string.bluetooth_disconnecting;
+ case CONNECTION_STATUS_UNKNOWN:
+ return R.string.bluetooth_unknown;
+ default:
+ return 0;
+ }
+ }
+
+ public static final boolean isConnectionStatusConnected(int connectionStatus) {
+ return connectionStatus == CONNECTION_STATUS_ACTIVE
+ || connectionStatus == CONNECTION_STATUS_CONNECTED;
+ }
+
+ public static final boolean isConnectionStatusBusy(int connectionStatus) {
+ return connectionStatus == CONNECTION_STATUS_CONNECTING
+ || connectionStatus == CONNECTION_STATUS_DISCONNECTING;
+ }
+
+ public static final int getPairingStatusSummary(int bondState) {
+ switch (bondState) {
+ case BluetoothDevice.BOND_BONDED:
+ return R.string.bluetooth_paired;
+ case BluetoothDevice.BOND_BONDING:
+ return R.string.bluetooth_pairing;
+ case BluetoothDevice.BOND_NOT_BONDED:
+ return R.string.bluetooth_not_connected;
+ default:
+ return 0;
+ }
+ }
+}
diff --git a/src/com/android/settings/deviceinfo/Memory.java b/src/com/android/settings/deviceinfo/Memory.java
new file mode 100644
index 0000000..75a84b7
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/Memory.java
@@ -0,0 +1,218 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.deviceinfo;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.os.Environment;
+import android.os.IMountService;
+import android.os.ServiceManager;
+import android.os.StatFs;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceScreen;
+import android.util.Log;
+
+import com.android.settings.R;
+
+import java.io.File;
+import java.text.DecimalFormat;
+
+public class Memory extends PreferenceActivity {
+
+ private static final String TAG = "Memory";
+
+ private static final String MEMORY_SD_SIZE = "memory_sd_size";
+
+ private static final String MEMORY_SD_AVAIL = "memory_sd_avail";
+
+ private static final String MEMORY_SD_UNMOUNT = "memory_sd_unmount";
+
+ private static final String MEMORY_SD_FORMAT = "memory_sd_format";
+ private Resources mRes;
+
+ private Preference mSdSize;
+ private Preference mSdAvail;
+ private Preference mSdUnmount;
+ private Preference mSdFormat;
+
+ // Access using getMountService()
+ private IMountService mMountService = null;
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ addPreferencesFromResource(R.xml.device_info_memory);
+
+ mRes = getResources();
+ mSdSize = findPreference(MEMORY_SD_SIZE);
+ mSdAvail = findPreference(MEMORY_SD_AVAIL);
+ mSdUnmount = findPreference(MEMORY_SD_UNMOUNT);
+ mSdFormat = findPreference(MEMORY_SD_FORMAT);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_REMOVED);
+ intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
+ intentFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
+ intentFilter.addAction(Intent.ACTION_MEDIA_SHARED);
+ intentFilter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL);
+ intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTABLE);
+ intentFilter.addAction(Intent.ACTION_MEDIA_NOFS);
+ intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);
+ intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
+ intentFilter.addDataScheme("file");
+ registerReceiver(mReceiver, intentFilter);
+
+ updateMemoryStatus();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ unregisterReceiver(mReceiver);
+ }
+
+ private synchronized IMountService getMountService() {
+ if (mMountService == null) {
+ IBinder service = ServiceManager.getService("mount");
+ if (service != null) {
+ mMountService = IMountService.Stub.asInterface(service);
+ } else {
+ Log.e(TAG, "Can't get mount service");
+ }
+ }
+ return mMountService;
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+ if (preference == mSdUnmount) {
+ unmount();
+ return true;
+ } else if (preference == mSdFormat) {
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setClass(this, com.android.settings.MediaFormat.class);
+ startActivity(intent);
+ return true;
+ }
+
+ return false;
+ }
+
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ updateMemoryStatus();
+ }
+ };
+
+ private void unmount() {
+ IMountService mountService = getMountService();
+ try {
+ if (mountService != null) {
+ mountService.unmountMedia(Environment.getExternalStorageDirectory().toString());
+ } else {
+ Log.e(TAG, "Mount service is null, can't unmount");
+ }
+ } catch (RemoteException ex) {
+ // Failed for some reason, try to update UI to actual state
+ updateMemoryStatus();
+ }
+ }
+
+ private void updateMemoryStatus() {
+ String status = Environment.getExternalStorageState();
+ String readOnly = "";
+ if (status.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) {
+ status = Environment.MEDIA_MOUNTED;
+ readOnly = mRes.getString(R.string.read_only);
+ }
+
+ mSdFormat.setEnabled(false);
+
+ if (status.equals(Environment.MEDIA_MOUNTED)) {
+ try {
+ File path = Environment.getExternalStorageDirectory();
+ StatFs stat = new StatFs(path.getPath());
+ long blockSize = stat.getBlockSize();
+ long totalBlocks = stat.getBlockCount();
+ long availableBlocks = stat.getAvailableBlocks();
+
+ mSdSize.setSummary(formatSize(totalBlocks * blockSize));
+ mSdAvail.setSummary(formatSize(availableBlocks * blockSize) + readOnly);
+ mSdUnmount.setEnabled(true);
+ } catch (IllegalArgumentException e) {
+ // this can occur if the SD card is removed, but we haven't received the
+ // ACTION_MEDIA_REMOVED Intent yet.
+ status = Environment.MEDIA_REMOVED;
+ }
+
+ } else {
+ mSdSize.setSummary(mRes.getString(R.string.sd_unavailable));
+ mSdAvail.setSummary(mRes.getString(R.string.sd_unavailable));
+ mSdUnmount.setEnabled(false);
+
+ if (status.equals(Environment.MEDIA_UNMOUNTED) ||
+ status.equals(Environment.MEDIA_NOFS) ||
+ status.equals(Environment.MEDIA_UNMOUNTABLE) ) {
+ mSdFormat.setEnabled(true);
+ }
+
+
+ }
+
+ File path = Environment.getDataDirectory();
+ StatFs stat = new StatFs(path.getPath());
+ long blockSize = stat.getBlockSize();
+ long availableBlocks = stat.getAvailableBlocks();
+ findPreference("memory_internal_avail").setSummary(formatSize(availableBlocks * blockSize));
+ }
+
+ private String formatSize(long size) {
+ String suffix = null;
+
+ // add KB or MB suffix if size is greater than 1K or 1M
+ if (size >= 1024) {
+ suffix = " KB";
+ size /= 1024;
+ if (size >= 1024) {
+ suffix = " MB";
+ size /= 1024;
+ }
+ }
+
+ DecimalFormat formatter = new DecimalFormat();
+ formatter.setGroupingSize(3);
+ String result = formatter.format(size);
+
+ if (suffix != null)
+ result = result + suffix;
+ return result;
+ }
+
+}
diff --git a/src/com/android/settings/deviceinfo/Status.java b/src/com/android/settings/deviceinfo/Status.java
new file mode 100644
index 0000000..4132ed5
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/Status.java
@@ -0,0 +1,392 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.deviceinfo;
+
+import android.bluetooth.BluetoothDevice;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.Resources;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.BatteryManager;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.os.SystemClock;
+import android.os.SystemProperties;
+import android.os.NetStat;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.telephony.PhoneStateListener;
+import android.telephony.ServiceState;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.PhoneStateIntentReceiver;
+import com.android.internal.telephony.TelephonyProperties;
+import com.android.settings.R;
+
+import java.lang.ref.WeakReference;
+
+/**
+ * Display the following information
+ * # Phone Number
+ * # Network
+ * # Roaming
+ * # IMEI
+ * # Network type
+ * # Signal Strength
+ * # Battery Strength : TODO
+ * # Uptime
+ * # Awake Time
+ * # XMPP/buzz/tickle status : TODO
+ *
+ */
+public class Status extends PreferenceActivity {
+
+ private static final String KEY_WIFI_MAC_ADDRESS = "wifi_mac_address";
+ private static final String KEY_BT_ADDRESS = "bt_address";
+ private static final String KEY_NETWORK_TRAFFIC_STATS = "network_traffic_stats";
+ private static final int EVENT_SIGNAL_STRENGTH_CHANGED = 200;
+ private static final int EVENT_SERVICE_STATE_CHANGED = 300;
+
+ private static final int EVENT_UPDATE_STATS = 500;
+
+ private TelephonyManager mTelephonyManager;
+ private Phone mPhone = null;
+ private PhoneStateIntentReceiver mPhoneStateReceiver;
+ private Resources mRes;
+ private Preference mSignalStrength;
+ private Preference mUptime;
+ private Preference mAwakeTime;
+
+ private static String sUnknown;
+
+ private Preference mBatteryStatus;
+ private Preference mBatteryLevel;
+
+ private Handler mHandler;
+
+ private static class MyHandler extends Handler {
+ private WeakReference<Status> mStatus;
+
+ public MyHandler(Status activity) {
+ mStatus = new WeakReference<Status>(activity);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ Status status = mStatus.get();
+ if (status == null) {
+ return;
+ }
+
+ switch (msg.what) {
+ case EVENT_SIGNAL_STRENGTH_CHANGED:
+ status.updateSignalStrength();
+ break;
+
+ case EVENT_SERVICE_STATE_CHANGED:
+ ServiceState serviceState = status.mPhoneStateReceiver.getServiceState();
+ status.updateServiceState(serviceState);
+ break;
+
+ case EVENT_UPDATE_STATS:
+ status.updateTimes();
+ status.setNetworkTrafficStats();
+ sendEmptyMessageDelayed(EVENT_UPDATE_STATS, 1000);
+ break;
+ }
+ }
+ }
+
+ private BroadcastReceiver mBatteryInfoReceiver = new BroadcastReceiver() {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
+
+ int level = intent.getIntExtra("level", 0);
+ int scale = intent.getIntExtra("scale", 100);
+
+ mBatteryLevel.setSummary(String.valueOf(level * 100 / scale) + "%");
+
+ int plugType = intent.getIntExtra("plugged", 0);
+ int status = intent.getIntExtra("status", BatteryManager.BATTERY_STATUS_UNKNOWN);
+ String statusString;
+ if (status == BatteryManager.BATTERY_STATUS_CHARGING) {
+ statusString = getString(R.string.battery_info_status_charging);
+ if (plugType > 0) {
+ statusString = statusString + " " + getString(
+ (plugType == BatteryManager.BATTERY_PLUGGED_AC)
+ ? R.string.battery_info_status_charging_ac
+ : R.string.battery_info_status_charging_usb);
+ }
+ } else if (status == BatteryManager.BATTERY_STATUS_DISCHARGING) {
+ statusString = getString(R.string.battery_info_status_discharging);
+ } else if (status == BatteryManager.BATTERY_STATUS_NOT_CHARGING) {
+ statusString = getString(R.string.battery_info_status_not_charging);
+ } else if (status == BatteryManager.BATTERY_STATUS_FULL) {
+ statusString = getString(R.string.battery_info_status_full);
+ } else {
+ statusString = getString(R.string.battery_info_status_unknown);
+ }
+ mBatteryStatus.setSummary(statusString);
+ }
+ }
+ };
+
+ private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
+ @Override
+ public void onDataConnectionStateChanged(int state) {
+ updateDataState();
+ updateNetworkType();
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ mHandler = new MyHandler(this);
+
+ mTelephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
+
+ addPreferencesFromResource(R.xml.device_info_status);
+ mBatteryLevel = findPreference("battery_level");
+ mBatteryStatus = findPreference("battery_status");
+
+ mRes = getResources();
+ if (sUnknown == null) {
+ sUnknown = mRes.getString(R.string.device_info_default);
+ }
+
+ mPhone = PhoneFactory.getDefaultPhone();
+ mSignalStrength = findPreference("signal_strength");
+ mUptime = findPreference("up_time");
+ mAwakeTime = findPreference("awake_time");
+
+ setSummaryText("imei", mPhone.getDeviceId());
+ setSummaryText("imei_sv",
+ ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
+ .getDeviceSoftwareVersion());
+ setSummaryText("number", mPhone.getLine1Number());
+
+ mPhoneStateReceiver = new PhoneStateIntentReceiver(this, mHandler);
+ mPhoneStateReceiver.notifySignalStrength(EVENT_SIGNAL_STRENGTH_CHANGED);
+ mPhoneStateReceiver.notifyServiceState(EVENT_SERVICE_STATE_CHANGED);
+
+ setWifiStatus();
+ setBtStatus();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ mPhoneStateReceiver.registerIntent();
+ registerReceiver(mBatteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+
+ updateSignalStrength();
+ updateServiceState(mPhone.getServiceState());
+ updateDataState();
+
+ mTelephonyManager.listen(mPhoneStateListener,
+ PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);
+
+ mHandler.sendEmptyMessage(EVENT_UPDATE_STATS);
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+
+ mPhoneStateReceiver.unregisterIntent();
+ mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
+ unregisterReceiver(mBatteryInfoReceiver);
+ mHandler.removeMessages(EVENT_UPDATE_STATS);
+ }
+
+ /**
+ * @param preference The key for the Preference item
+ * @param property The system property to fetch
+ * @param alt The default value, if the property doesn't exist
+ */
+ private void setSummary(String preference, String property, String alt) {
+ try {
+ findPreference(preference).setSummary(
+ SystemProperties.get(property, alt));
+ } catch (RuntimeException e) {
+
+ }
+ }
+
+ private void setSummaryText(String preference, String text) {
+ if (TextUtils.isEmpty(text)) {
+ text = sUnknown;
+ }
+
+ findPreference(preference).setSummary(text);
+ }
+
+ private void updateNetworkType() {
+ // Whether EDGE, UMTS, etc...
+ setSummary("network_type", TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE, sUnknown);
+ }
+
+ private void updateDataState() {
+ int state = mTelephonyManager.getDataState();
+ String display = mRes.getString(R.string.radioInfo_unknown);
+
+ switch (state) {
+ case TelephonyManager.DATA_CONNECTED:
+ display = mRes.getString(R.string.radioInfo_data_connected);
+ break;
+ case TelephonyManager.DATA_SUSPENDED:
+ display = mRes.getString(R.string.radioInfo_data_suspended);
+ break;
+ case TelephonyManager.DATA_CONNECTING:
+ display = mRes.getString(R.string.radioInfo_data_connecting);
+ break;
+ case TelephonyManager.DATA_DISCONNECTED:
+ display = mRes.getString(R.string.radioInfo_data_disconnected);
+ break;
+ }
+
+ setSummaryText("data_state", display);
+ }
+
+ private void updateServiceState(ServiceState serviceState) {
+ int state = serviceState.getState();
+ String display = mRes.getString(R.string.radioInfo_unknown);
+
+ switch (state) {
+ case ServiceState.STATE_IN_SERVICE:
+ display = mRes.getString(R.string.radioInfo_service_in);
+ break;
+ case ServiceState.STATE_OUT_OF_SERVICE:
+ case ServiceState.STATE_EMERGENCY_ONLY:
+ display = mRes.getString(R.string.radioInfo_service_out);
+ break;
+ case ServiceState.STATE_POWER_OFF:
+ display = mRes.getString(R.string.radioInfo_service_off);
+ break;
+ }
+
+ setSummaryText("service_state", display);
+
+ if (serviceState.getRoaming()) {
+ setSummaryText("roaming_state", mRes.getString(R.string.radioInfo_roaming_in));
+ } else {
+ setSummaryText("roaming_state", mRes.getString(R.string.radioInfo_roaming_not));
+ }
+ setSummaryText("operator_name", serviceState.getOperatorAlphaLong());
+ }
+
+ void updateSignalStrength() {
+ int state =
+ mPhoneStateReceiver.getServiceState().getState();
+ Resources r = getResources();
+
+ if ((ServiceState.STATE_OUT_OF_SERVICE == state) ||
+ (ServiceState.STATE_POWER_OFF == state)) {
+ mSignalStrength.setSummary("0");
+ }
+
+ int signalDbm = mPhoneStateReceiver.getSignalStrengthDbm();
+
+ if (-1 == signalDbm) signalDbm = 0;
+
+ int signalAsu = mPhoneStateReceiver.getSignalStrength();
+
+ if (-1 == signalAsu) signalAsu = 0;
+
+ mSignalStrength.setSummary(String.valueOf(signalDbm) + " "
+ + r.getString(R.string.radioInfo_display_dbm) + " "
+ + String.valueOf(signalAsu) + " "
+ + r.getString(R.string.radioInfo_display_asu));
+ }
+
+ private void setWifiStatus() {
+ WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
+ WifiInfo wifiInfo = wifiManager.getConnectionInfo();
+
+ Preference wifiMacAddressPref = findPreference(KEY_WIFI_MAC_ADDRESS);
+ String macAddress = wifiInfo == null ? null : wifiInfo.getMacAddress();
+ wifiMacAddressPref.setSummary(!TextUtils.isEmpty(macAddress) ? macAddress
+ : getString(R.string.status_unavailable));
+ }
+
+ private void setBtStatus() {
+ BluetoothDevice bluetooth = (BluetoothDevice) getSystemService(BLUETOOTH_SERVICE);
+ Preference btAddressPref = findPreference(KEY_BT_ADDRESS);
+
+ if (bluetooth == null) {
+ // device not BT capable
+ getPreferenceScreen().removePreference(btAddressPref);
+ } else {
+ String address = bluetooth.isEnabled() ? bluetooth.getAddress() : null;
+ btAddressPref.setSummary(!TextUtils.isEmpty(address) ? address
+ : getString(R.string.status_unavailable));
+ }
+ }
+
+ private void setNetworkTrafficStats() {
+ long txPkts = NetStat.getTotalTxPkts();
+ long txBytes = NetStat.getTotalTxBytes();
+ long rxPkts = NetStat.getTotalRxPkts();
+ long rxBytes = NetStat.getTotalRxBytes();
+
+ Preference netStatsPref = findPreference(KEY_NETWORK_TRAFFIC_STATS);
+ netStatsPref.setSummary(getString(R.string.status_network_traffic_summary,
+ txPkts, txBytes, rxPkts, rxBytes));
+ }
+
+ void updateTimes() {
+ long at = SystemClock.uptimeMillis() / 1000;
+ long ut = SystemClock.elapsedRealtime() / 1000;
+ long st = ut - at;
+
+ if (ut == 0) {
+ ut = 1;
+ }
+
+ mUptime.setSummary(convert(ut));
+ mAwakeTime.setSummary(convert(at) + " (" + (((1000 * at / ut) + 5) / 10) + "%)");
+ }
+
+ private String pad(int n) {
+ if (n >= 10) {
+ return String.valueOf(n);
+ } else {
+ return "0" + String.valueOf(n);
+ }
+ }
+
+ private String convert(long t) {
+ int s = (int)(t % 60);
+ int m = (int)((t / 60) % 60);
+ int h = (int)((t / 3600));
+
+ return h + ":" + pad(m) + ":" + pad(s);
+ }
+}
diff --git a/src/com/android/settings/quicklaunch/BookmarkPicker.java b/src/com/android/settings/quicklaunch/BookmarkPicker.java
new file mode 100644
index 0000000..7152abb
--- /dev/null
+++ b/src/com/android/settings/quicklaunch/BookmarkPicker.java
@@ -0,0 +1,331 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.quicklaunch;
+
+import com.android.settings.R;
+
+import android.app.ListActivity;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.Handler;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.SimpleAdapter;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * Activity to pick a bookmark that will be returned to the caller.
+ * <p>
+ * Currently, bookmarks are either:
+ * <li> Activities that are in the launcher
+ * <li> Activities that are within an app that is capable of being launched with
+ * the {@link Intent#ACTION_CREATE_SHORTCUT}.
+ */
+public class BookmarkPicker extends ListActivity implements SimpleAdapter.ViewBinder {
+
+ private static final String TAG = "BookmarkPicker";
+
+ /** Extra in the returned intent from this activity. */
+ public static final String EXTRA_TITLE = "com.android.settings.quicklaunch.TITLE";
+
+ /** Extra that should be provided, and will be returned. */
+ public static final String EXTRA_SHORTCUT = "com.android.settings.quicklaunch.SHORTCUT";
+
+ /**
+ * The request code for the screen to create a bookmark that is WITHIN an
+ * application. For example, Gmail can return a bookmark for the inbox
+ * folder.
+ */
+ private static final int REQUEST_CREATE_SHORTCUT = 1;
+
+ /** Intent used to get all the activities that are launch-able */
+ private static Intent sLaunchIntent;
+ /** Intent used to get all the activities that are {@link #REQUEST_CREATE_SHORTCUT}-able */
+ private static Intent sShortcutIntent;
+
+ /**
+ * List of ResolveInfo for activities that we can bookmark (either directly
+ * to the activity, or by launching the activity and it returning a bookmark
+ * WITHIN that application).
+ */
+ private List<ResolveInfo> mResolveList;
+
+ // List adapter stuff
+ private static final String KEY_TITLE = "TITLE";
+ private static final String KEY_RESOLVE_INFO = "RESOLVE_INFO";
+ private static final String sKeys[] = new String[] { KEY_TITLE, KEY_RESOLVE_INFO };
+ private static final int sResourceIds[] = new int[] { R.id.title, R.id.icon };
+ private SimpleAdapter mMyAdapter;
+
+ /** Display those activities that are launch-able */
+ private static final int DISPLAY_MODE_LAUNCH = 0;
+ /** Display those activities that are able to have bookmarks WITHIN the application */
+ private static final int DISPLAY_MODE_SHORTCUT = 1;
+ private int mDisplayMode = DISPLAY_MODE_LAUNCH;
+
+ private Handler mUiHandler = new Handler();
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ updateListAndAdapter();
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ menu.add(0, DISPLAY_MODE_LAUNCH, 0, R.string.quick_launch_display_mode_applications)
+ .setIcon(com.android.internal.R.drawable.ic_menu_archive);
+ menu.add(0, DISPLAY_MODE_SHORTCUT, 0, R.string.quick_launch_display_mode_shortcuts)
+ .setIcon(com.android.internal.R.drawable.ic_menu_goto);
+ return true;
+ }
+
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ menu.findItem(DISPLAY_MODE_LAUNCH).setVisible(mDisplayMode != DISPLAY_MODE_LAUNCH);
+ menu.findItem(DISPLAY_MODE_SHORTCUT).setVisible(mDisplayMode != DISPLAY_MODE_SHORTCUT);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+
+ switch (item.getItemId()) {
+
+ case DISPLAY_MODE_LAUNCH:
+ mDisplayMode = DISPLAY_MODE_LAUNCH;
+ break;
+
+ case DISPLAY_MODE_SHORTCUT:
+ mDisplayMode = DISPLAY_MODE_SHORTCUT;
+ break;
+
+ default:
+ return false;
+ }
+
+ updateListAndAdapter();
+ return true;
+ }
+
+ private void ensureIntents() {
+ if (sLaunchIntent == null) {
+ sLaunchIntent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER);
+ sShortcutIntent = new Intent(Intent.ACTION_CREATE_SHORTCUT);
+ }
+ }
+
+ /**
+ * This should be called from the UI thread.
+ */
+ private void updateListAndAdapter() {
+ // Get the activities in a separate thread
+ new Thread("data updater") {
+ @Override
+ public void run() {
+ synchronized (BookmarkPicker.this) {
+ /*
+ * Don't touch any of the lists that are being used by the
+ * adapter in this thread!
+ */
+ ArrayList<ResolveInfo> newResolveList = new ArrayList<ResolveInfo>();
+ ArrayList<Map<String, ?>> newAdapterList = new ArrayList<Map<String, ?>>();
+
+ fillResolveList(newResolveList);
+ Collections.sort(newResolveList,
+ new ResolveInfo.DisplayNameComparator(getPackageManager()));
+
+ fillAdapterList(newAdapterList, newResolveList);
+
+ updateAdapterToUseNewLists(newAdapterList, newResolveList);
+ }
+ }
+ }.start();
+ }
+
+ private void updateAdapterToUseNewLists(final ArrayList<Map<String, ?>> newAdapterList,
+ final ArrayList<ResolveInfo> newResolveList) {
+ // Post this back on the UI thread
+ mUiHandler.post(new Runnable() {
+ public void run() {
+ /*
+ * SimpleAdapter does not support changing the lists after it
+ * has been created. We just create a new instance.
+ */
+ mMyAdapter = createResolveAdapter(newAdapterList);
+ mResolveList = newResolveList;
+ setListAdapter(mMyAdapter);
+ }
+ });
+ }
+
+ /**
+ * Gets all activities matching our current display mode.
+ *
+ * @param list The list to fill.
+ */
+ private void fillResolveList(List<ResolveInfo> list) {
+ ensureIntents();
+ PackageManager pm = getPackageManager();
+ list.clear();
+
+ if (mDisplayMode == DISPLAY_MODE_LAUNCH) {
+ list.addAll(pm.queryIntentActivities(sLaunchIntent, 0));
+ } else if (mDisplayMode == DISPLAY_MODE_SHORTCUT) {
+ list.addAll(pm.queryIntentActivities(sShortcutIntent, 0));
+ }
+ }
+
+ private SimpleAdapter createResolveAdapter(List<Map<String, ?>> list) {
+ SimpleAdapter adapter = new SimpleAdapter(this, list,
+ R.layout.bookmark_picker_item, sKeys, sResourceIds);
+ adapter.setViewBinder(this);
+ return adapter;
+ }
+
+ private void fillAdapterList(List<Map<String, ?>> list,
+ List<ResolveInfo> resolveList) {
+ list.clear();
+ int resolveListSize = resolveList.size();
+ for (int i = 0; i < resolveListSize; i++) {
+ ResolveInfo info = resolveList.get(i);
+ /*
+ * Simple adapter craziness. For each item, we need to create a map
+ * from a key to its value (the value can be any object--the view
+ * binder will take care of filling the View with a representation
+ * of that object).
+ */
+ Map<String, Object> map = new TreeMap<String, Object>();
+ map.put(KEY_TITLE, getResolveInfoTitle(info));
+ map.put(KEY_RESOLVE_INFO, info);
+ list.add(map);
+ }
+ }
+
+ /** Get the title for a resolve info. */
+ private String getResolveInfoTitle(ResolveInfo info) {
+ CharSequence label = info.loadLabel(getPackageManager());
+ if (label == null) label = info.activityInfo.name;
+ return label != null ? label.toString() : null;
+ }
+
+ @Override
+ protected void onListItemClick(ListView l, View v, int position, long id) {
+ if (position >= mResolveList.size()) return;
+
+ ResolveInfo info = mResolveList.get(position);
+
+ switch (mDisplayMode) {
+
+ case DISPLAY_MODE_LAUNCH:
+ // We can go ahead and return the clicked info's intent
+ Intent intent = getIntentForResolveInfo(info, Intent.ACTION_MAIN);
+ intent.addCategory(Intent.CATEGORY_LAUNCHER);
+ finish(intent, getResolveInfoTitle(info));
+ break;
+
+ case DISPLAY_MODE_SHORTCUT:
+ // Start the shortcut activity so the user can pick the actual intent
+ // (example: Gmail's shortcut activity shows a list of mailboxes)
+ startShortcutActivity(info);
+ break;
+ }
+
+ }
+
+ private static Intent getIntentForResolveInfo(ResolveInfo info, String action) {
+ Intent intent = new Intent(action);
+ ActivityInfo ai = info.activityInfo;
+ intent.setClassName(ai.packageName, ai.name);
+ return intent;
+ }
+
+ /**
+ * Starts an activity to get a shortcut.
+ * <p>
+ * For example, Gmail has an activity that lists the available labels. It
+ * returns a shortcut intent for going directly to this label.
+ */
+ private void startShortcutActivity(ResolveInfo info) {
+ Intent intent = getIntentForResolveInfo(info, Intent.ACTION_CREATE_SHORTCUT);
+ startActivityForResult(intent, REQUEST_CREATE_SHORTCUT);
+
+ // Will get a callback to onActivityResult
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (resultCode != RESULT_OK) {
+ return;
+ }
+
+ switch (requestCode) {
+
+ case REQUEST_CREATE_SHORTCUT:
+ if (data != null) {
+ finish((Intent) data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT),
+ data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME));
+ }
+ break;
+
+ default:
+ super.onActivityResult(requestCode, resultCode, data);
+ break;
+ }
+ }
+
+ /**
+ * Finishes the activity and returns the given data.
+ */
+ private void finish(Intent intent, String title) {
+ // Give back what was given to us (it will have the shortcut, for example)
+ intent.putExtras(getIntent());
+ // Put our information
+ intent.putExtra(EXTRA_TITLE, title);
+ setResult(RESULT_OK, intent);
+ finish();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean setViewValue(View view, Object data, String textRepresentation) {
+ if (view.getId() == R.id.icon) {
+ Drawable icon = ((ResolveInfo) data).loadIcon(getPackageManager());
+ if (icon != null) {
+ ((ImageView) view).setImageDrawable(icon);
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+}
diff --git a/src/com/android/settings/quicklaunch/QuickLaunchSettings.java b/src/com/android/settings/quicklaunch/QuickLaunchSettings.java
new file mode 100644
index 0000000..4d44524
--- /dev/null
+++ b/src/com/android/settings/quicklaunch/QuickLaunchSettings.java
@@ -0,0 +1,347 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.quicklaunch;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.database.ContentObserver;
+import android.database.Cursor;
+import android.os.Bundle;
+import android.os.Handler;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceGroup;
+import android.preference.PreferenceScreen;
+import android.provider.Settings.Bookmarks;
+import android.util.Log;
+import android.util.SparseArray;
+import android.util.SparseBooleanArray;
+import android.view.KeyCharacterMap;
+import android.view.KeyEvent;
+import android.view.View;
+import android.widget.AdapterView;
+
+import com.android.settings.R;
+
+/**
+ * Settings activity for quick launch.
+ * <p>
+ * Shows a list of possible shortcuts, the current application each is bound to,
+ * and allows choosing a new bookmark for a shortcut.
+ */
+public class QuickLaunchSettings extends PreferenceActivity implements
+ AdapterView.OnItemLongClickListener, DialogInterface.OnClickListener {
+
+ private static final String TAG = "QuickLaunchSettings";
+
+ private static final String KEY_SHORTCUT_CATEGORY = "shortcut_category";
+
+ private static final int DIALOG_CLEAR_SHORTCUT = 0;
+
+ private static final int REQUEST_PICK_BOOKMARK = 1;
+
+ private static final int COLUMN_SHORTCUT = 0;
+ private static final int COLUMN_TITLE = 1;
+ private static final int COLUMN_INTENT = 2;
+ private static final String[] sProjection = new String[] {
+ Bookmarks.SHORTCUT, Bookmarks.TITLE, Bookmarks.INTENT
+ };
+ private static final String sShortcutSelection = Bookmarks.SHORTCUT + "=?";
+
+ private Handler mUiHandler = new Handler();
+
+ private static final String DEFAULT_BOOKMARK_FOLDER = "@quicklaunch";
+ /** Cursor for Bookmarks provider. */
+ private Cursor mBookmarksCursor;
+ /** Listens for changes to Bookmarks provider. */
+ private BookmarksObserver mBookmarksObserver;
+ /** Used to keep track of which shortcuts have bookmarks. */
+ private SparseBooleanArray mBookmarkedShortcuts;
+
+ /** Preference category to hold the shortcut preferences. */
+ private PreferenceGroup mShortcutGroup;
+ /** Mapping of a shortcut to its preference. */
+ private SparseArray<ShortcutPreference> mShortcutToPreference;
+
+ /** The bookmark title of the shortcut that is being cleared. */
+ private CharSequence mClearDialogBookmarkTitle;
+ private static final String CLEAR_DIALOG_BOOKMARK_TITLE = "CLEAR_DIALOG_BOOKMARK_TITLE";
+ /** The shortcut that is being cleared. */
+ private char mClearDialogShortcut;
+ private static final String CLEAR_DIALOG_SHORTCUT = "CLEAR_DIALOG_SHORTCUT";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ addPreferencesFromResource(R.xml.quick_launch_settings);
+
+ mShortcutGroup = (PreferenceGroup) findPreference(KEY_SHORTCUT_CATEGORY);
+ mShortcutToPreference = new SparseArray<ShortcutPreference>();
+ mBookmarksObserver = new BookmarksObserver(mUiHandler);
+ initShortcutPreferences();
+ mBookmarksCursor = managedQuery(Bookmarks.CONTENT_URI, sProjection, null, null);
+ getListView().setOnItemLongClickListener(this);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ getContentResolver().registerContentObserver(Bookmarks.CONTENT_URI, true,
+ mBookmarksObserver);
+ refreshShortcuts();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ getContentResolver().unregisterContentObserver(mBookmarksObserver);
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Bundle state) {
+ super.onRestoreInstanceState(state);
+
+ // Restore the clear dialog's info
+ mClearDialogBookmarkTitle = state.getString(CLEAR_DIALOG_BOOKMARK_TITLE);
+ mClearDialogShortcut = (char) state.getInt(CLEAR_DIALOG_SHORTCUT, 0);
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+
+ // Save the clear dialog's info
+ outState.putCharSequence(CLEAR_DIALOG_BOOKMARK_TITLE, mClearDialogBookmarkTitle);
+ outState.putInt(CLEAR_DIALOG_SHORTCUT, mClearDialogShortcut);
+ }
+
+ @Override
+ protected Dialog onCreateDialog(int id) {
+ switch (id) {
+
+ case DIALOG_CLEAR_SHORTCUT: {
+ // Create the dialog for clearing a shortcut
+ return new AlertDialog.Builder(this)
+ .setTitle(getString(R.string.quick_launch_clear_dialog_title))
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setMessage(getString(R.string.quick_launch_clear_dialog_message,
+ mClearDialogShortcut, mClearDialogBookmarkTitle))
+ .setPositiveButton(R.string.quick_launch_clear_ok_button, this)
+ .setNegativeButton(R.string.quick_launch_clear_cancel_button, this)
+ .create();
+ }
+ }
+
+ return super.onCreateDialog(id);
+ }
+
+ @Override
+ protected void onPrepareDialog(int id, Dialog dialog) {
+ switch (id) {
+
+ case DIALOG_CLEAR_SHORTCUT: {
+ AlertDialog alertDialog = (AlertDialog) dialog;
+ alertDialog.setMessage(getString(R.string.quick_launch_clear_dialog_message,
+ mClearDialogShortcut, mClearDialogBookmarkTitle));
+ }
+ }
+ }
+
+ private void showClearDialog(ShortcutPreference pref) {
+
+ if (!pref.hasBookmark()) return;
+
+ mClearDialogBookmarkTitle = pref.getTitle();
+ mClearDialogShortcut = pref.getShortcut();
+ showDialog(DIALOG_CLEAR_SHORTCUT);
+ }
+
+ public void onClick(DialogInterface dialog, int which) {
+ if (mClearDialogShortcut > 0 && which == AlertDialog.BUTTON1) {
+ // Clear the shortcut
+ clearShortcut(mClearDialogShortcut);
+ }
+ mClearDialogBookmarkTitle = null;
+ mClearDialogShortcut = 0;
+ }
+
+ private void clearShortcut(char shortcut) {
+ getContentResolver().delete(Bookmarks.CONTENT_URI, sShortcutSelection,
+ new String[] { String.valueOf((int) shortcut) });
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+ if (!(preference instanceof ShortcutPreference)) return false;
+
+ // Open the screen to pick a bookmark for this shortcut
+ ShortcutPreference pref = (ShortcutPreference) preference;
+ Intent intent = new Intent(this, BookmarkPicker.class);
+ intent.putExtra(BookmarkPicker.EXTRA_SHORTCUT, pref.getShortcut());
+ startActivityForResult(intent, REQUEST_PICK_BOOKMARK);
+
+ return true;
+ }
+
+ public boolean onItemLongClick(AdapterView parent, View view, int position, long id) {
+
+ // Open the clear shortcut dialog
+ Preference pref = (Preference) getPreferenceScreen().getRootAdapter().getItem(position);
+ if (!(pref instanceof ShortcutPreference)) return false;
+ showClearDialog((ShortcutPreference) pref);
+ return true;
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (resultCode != RESULT_OK) {
+ return;
+ }
+
+ if (requestCode == REQUEST_PICK_BOOKMARK) {
+
+ // Returned from the 'pick bookmark for this shortcut' screen
+ if (data == null) {
+ Log.w(TAG, "Result from bookmark picker does not have an intent.");
+ return;
+ }
+
+ String title = data.getStringExtra(BookmarkPicker.EXTRA_TITLE);
+ char shortcut = data.getCharExtra(BookmarkPicker.EXTRA_SHORTCUT, (char) 0);
+ updateShortcut(shortcut, data);
+
+ } else {
+ super.onActivityResult(requestCode, resultCode, data);
+ }
+ }
+
+ private void updateShortcut(char shortcut, Intent intent) {
+ // Update the bookmark for a shortcut
+ // Pass an empty title so it gets resolved each time this bookmark is
+ // displayed (since the locale could change after we insert into the provider).
+ Bookmarks.add(getContentResolver(), intent, "", DEFAULT_BOOKMARK_FOLDER, shortcut, 0);
+ }
+
+ private ShortcutPreference getOrCreatePreference(char shortcut) {
+ ShortcutPreference pref = mShortcutToPreference.get(shortcut);
+ if (pref != null) {
+ return pref;
+ } else {
+ Log.w(TAG, "Unknown shortcut '" + shortcut + "', creating preference anyway");
+ return createPreference(shortcut);
+ }
+ }
+
+ private ShortcutPreference createPreference(char shortcut) {
+ ShortcutPreference pref = new ShortcutPreference(QuickLaunchSettings.this, shortcut);
+ mShortcutGroup.addPreference(pref);
+ mShortcutToPreference.put(shortcut, pref);
+ return pref;
+ }
+
+ private void initShortcutPreferences() {
+
+ /** Whether the shortcut has been seen already. The array index is the shortcut. */
+ SparseBooleanArray shortcutSeen = new SparseBooleanArray();
+ KeyCharacterMap keyMap = KeyCharacterMap.load(KeyCharacterMap.BUILT_IN_KEYBOARD);
+
+ // Go through all the key codes and create a preference for the appropriate keys
+ for (int keyCode = KeyEvent.getMaxKeyCode() - 1; keyCode >= 0; keyCode--) {
+ // Get the label for the primary char on the key that produces this key code
+ char shortcut = (char) Character.toLowerCase(keyMap.getDisplayLabel(keyCode));
+ if (shortcut == 0 || shortcutSeen.get(shortcut, false)) continue;
+ // TODO: need a to tell if the current keyboard can produce this key code, for now
+ // only allow the letter or digits
+ if (!Character.isLetterOrDigit(shortcut)) continue;
+ shortcutSeen.put(shortcut, true);
+
+ createPreference(shortcut);
+ }
+ }
+
+ private synchronized void refreshShortcuts() {
+ Cursor c = mBookmarksCursor;
+ if (c == null) {
+ // Haven't finished querying yet
+ return;
+ }
+
+ if (!c.requery()) {
+ Log.e(TAG, "Could not requery cursor when refreshing shortcuts.");
+ return;
+ }
+
+ /**
+ * We use the previous bookmarked shortcuts array to filter out those
+ * shortcuts that had bookmarks before this method call, and don't after
+ * (so we can set the preferences to be without bookmarks).
+ */
+ SparseBooleanArray noLongerBookmarkedShortcuts = mBookmarkedShortcuts;
+ SparseBooleanArray newBookmarkedShortcuts = new SparseBooleanArray();
+ while (c.moveToNext()) {
+ char shortcut = Character.toLowerCase((char) c.getInt(COLUMN_SHORTCUT));
+ if (shortcut == 0) continue;
+
+ ShortcutPreference pref = getOrCreatePreference(shortcut);
+ pref.setTitle(Bookmarks.getTitle(this, c));
+ pref.setSummary(getString(R.string.quick_launch_shortcut,
+ String.valueOf(shortcut)));
+ pref.setHasBookmark(true);
+
+ newBookmarkedShortcuts.put(shortcut, true);
+ if (noLongerBookmarkedShortcuts != null) {
+ // After this loop, the shortcuts with value true in this array
+ // will no longer have bookmarks
+ noLongerBookmarkedShortcuts.put(shortcut, false);
+ }
+ }
+
+ if (noLongerBookmarkedShortcuts != null) {
+ for (int i = noLongerBookmarkedShortcuts.size() - 1; i >= 0; i--) {
+ if (noLongerBookmarkedShortcuts.valueAt(i)) {
+ // True, so there is no longer a bookmark for this shortcut
+ char shortcut = (char) noLongerBookmarkedShortcuts.keyAt(i);
+ ShortcutPreference pref = mShortcutToPreference.get(shortcut);
+ if (pref != null) {
+ pref.setHasBookmark(false);
+ }
+ }
+ }
+ }
+
+ mBookmarkedShortcuts = newBookmarkedShortcuts;
+
+ c.deactivate();
+ }
+
+ private class BookmarksObserver extends ContentObserver {
+
+ public BookmarksObserver(Handler handler) {
+ super(handler);
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ super.onChange(selfChange);
+
+ refreshShortcuts();
+ }
+ }
+}
diff --git a/src/com/android/settings/quicklaunch/ShortcutPreference.java b/src/com/android/settings/quicklaunch/ShortcutPreference.java
new file mode 100644
index 0000000..92efdeb
--- /dev/null
+++ b/src/com/android/settings/quicklaunch/ShortcutPreference.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.quicklaunch;
+
+import com.android.settings.R;
+
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.preference.Preference;
+import android.util.TypedValue;
+import android.view.View;
+import android.widget.TextView;
+
+/**
+ * Preference type for a shortcut in {@link QuickLaunchSettings}.
+ */
+public class ShortcutPreference extends Preference implements Comparable<Preference> {
+
+ private static Object sStaticVarsLock = new Object();
+
+ // These static fields are used across all instances of ShortcutPreference.
+ // There will be many ShortcutPreference instances (~36 for US).
+ private static String STRING_ASSIGN_APPLICATION;
+ private static String STRING_NO_SHORTCUT;
+
+ private static int sDimAlpha;
+ private static ColorStateList sRegularTitleColor;
+ private static ColorStateList sDimTitleColor;
+ private static ColorStateList sRegularSummaryColor;
+ private static ColorStateList sDimSummaryColor;
+
+ private char mShortcut;
+ private boolean mHasBookmark;
+
+ public ShortcutPreference(Context context, char shortcut) {
+ super(context);
+
+ synchronized (sStaticVarsLock) {
+ // Init statics. This should only happen for the first ShortcutPreference created,
+ // the rest will already have them initialized.
+ if (STRING_ASSIGN_APPLICATION == null) {
+ STRING_ASSIGN_APPLICATION = context.getString(R.string.quick_launch_assign_application);
+ STRING_NO_SHORTCUT = context.getString(R.string.quick_launch_no_shortcut);
+
+ TypedValue outValue = new TypedValue();
+ context.getTheme().resolveAttribute(android.R.attr.disabledAlpha, outValue, true);
+ sDimAlpha = (int) (outValue.getFloat() * 255);
+ }
+ }
+
+ mShortcut = shortcut;
+
+ setWidgetLayoutResource(R.layout.preference_widget_shortcut);
+ }
+
+ public char getShortcut() {
+ return mShortcut;
+ }
+
+ public void setShortcut(char shortcut) {
+ if (shortcut != mShortcut) {
+ mShortcut = shortcut;
+ notifyChanged();
+ }
+ }
+
+ public boolean hasBookmark() {
+ return mHasBookmark;
+ }
+
+ public void setHasBookmark(boolean hasBookmark) {
+ if (hasBookmark != mHasBookmark) {
+ mHasBookmark = hasBookmark;
+ notifyChanged();
+ }
+ }
+
+ @Override
+ public CharSequence getTitle() {
+ return mHasBookmark ? super.getTitle() : STRING_ASSIGN_APPLICATION;
+ }
+
+ @Override
+ public CharSequence getSummary() {
+ return mHasBookmark ? super.getSummary() : STRING_NO_SHORTCUT;
+ }
+
+ @Override
+ protected void onBindView(View view) {
+ super.onBindView(view);
+
+ TextView shortcutView = (TextView) view.findViewById(R.id.shortcut);
+ if (shortcutView != null) {
+ shortcutView.setText(String.valueOf(mShortcut));
+ }
+
+ TextView titleView = (TextView) view.findViewById(android.R.id.title);
+
+ synchronized (sStaticVarsLock) {
+ if (sRegularTitleColor == null) {
+ sRegularTitleColor = titleView.getTextColors();
+ sDimTitleColor = sRegularTitleColor.withAlpha(sDimAlpha);
+ }
+ }
+
+ ColorStateList color = mHasBookmark ? sRegularTitleColor : sDimTitleColor;
+ if (color != null) {
+ titleView.setTextColor(color);
+ }
+
+ TextView summaryView = (TextView) view.findViewById(android.R.id.summary);
+
+ synchronized (sStaticVarsLock) {
+ if (sRegularSummaryColor == null) {
+ sRegularSummaryColor = summaryView.getTextColors();
+ sDimSummaryColor = sRegularSummaryColor.withAlpha(sDimAlpha);
+ }
+ }
+
+ color = mHasBookmark ? sRegularSummaryColor : sDimSummaryColor;
+ if (color != null) {
+ summaryView.setTextColor(color);
+ }
+
+ }
+
+ public int compareTo(Preference another) {
+ if (!(another instanceof ShortcutPreference)) return super.compareTo(another);
+
+ // Letters before digits
+ char other = ((ShortcutPreference) another).mShortcut;
+ if (Character.isDigit(mShortcut) && Character.isLetter(other)) return 1;
+ else if (Character.isDigit(other) && Character.isLetter(mShortcut)) return -1;
+ else return mShortcut - other;
+ }
+
+}
diff --git a/src/com/android/settings/wifi/AccessPointDialog.java b/src/com/android/settings/wifi/AccessPointDialog.java
new file mode 100644
index 0000000..917ed96
--- /dev/null
+++ b/src/com/android/settings/wifi/AccessPointDialog.java
@@ -0,0 +1,600 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.wifi;
+
+import com.android.settings.R;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.text.format.Formatter;
+import android.text.method.PasswordTransformationMethod;
+import android.text.method.TransformationMethod;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.CheckBox;
+import android.widget.EditText;
+import android.widget.Spinner;
+import android.widget.TableLayout;
+import android.widget.TextView;
+
+public class AccessPointDialog extends AlertDialog implements DialogInterface.OnClickListener,
+ AdapterView.OnItemSelectedListener, View.OnClickListener {
+
+ private static final String TAG = "AccessPointDialog";
+ private static final String INSTANCE_KEY_ACCESS_POINT_STATE =
+ "com.android.settings.wifi.AccessPointDialog:accessPointState";
+ private static final String INSTANCE_KEY_MODE =
+ "com.android.settings.wifi.AccessPointDialog:mode";
+ private static final String INSTANCE_KEY_CUSTOM_TITLE =
+ "com.android.settings.wifi.AccessPointDialog:customTitle";
+ private static final String INSTANCE_KEY_AUTO_SECURITY_ALLOWED =
+ "com.android.settings.wifi.AccessPointDialog:autoSecurityAllowed";
+
+ private static final int POSITIVE_BUTTON = BUTTON1;
+ private static final int NEGATIVE_BUTTON = BUTTON2;
+ private static final int NEUTRAL_BUTTON = BUTTON3;
+
+ /** The dialog should show info connectivity functionality */
+ public static final int MODE_INFO = 0;
+ /** The dialog should configure the detailed AP properties */
+ public static final int MODE_CONFIGURE = 1;
+ /** The dialog should have the password field and connect/cancel */
+ public static final int MODE_RETRY_PASSWORD = 2;
+
+ // These should be matched with the XML. Both arrays in XML depend on this
+ // ordering!
+ private static final int SECURITY_AUTO = 0;
+ private static final int SECURITY_NONE = 1;
+ 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[] WEP_TYPE_VALUES = {
+ AccessPointState.WEP_PASSWORD_AUTO, AccessPointState.WEP_PASSWORD_ASCII,
+ AccessPointState.WEP_PASSWORD_HEX
+ };
+
+ // Button positions, default to impossible values
+ private int mConnectButtonPos = Integer.MAX_VALUE;
+ private int mForgetButtonPos = Integer.MAX_VALUE;
+ private int mSaveButtonPos = Integer.MAX_VALUE;
+
+ // Client configurable items. Generally, these should be saved in instance state
+ private int mMode = MODE_INFO;
+ private boolean mAutoSecurityAllowed = true;
+ private CharSequence mCustomTitle;
+ // This does not need to be saved in instance state.
+ private WifiLayer mWifiLayer;
+ private AccessPointState mState;
+
+ // General views
+ private View mView;
+ private TextView mPasswordText;
+ private EditText mPasswordEdit;
+ private CheckBox mShowPasswordCheckBox;
+
+ // Info-specific views
+ private ViewGroup mTable;
+
+ // Configure-specific views
+ private EditText mSsidEdit;
+ private Spinner mSecuritySpinner;
+ private Spinner mWepTypeSpinner;
+
+ public AccessPointDialog(Context context, WifiLayer wifiLayer) {
+ super(context);
+
+ mWifiLayer = wifiLayer;
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ onLayout();
+ onFill();
+
+ super.onCreate(savedInstanceState);
+ }
+
+ @Override
+ public void onRestoreInstanceState(Bundle savedInstanceState) {
+ // Set to a class loader that can find AccessPointState
+ savedInstanceState.setClassLoader(getClass().getClassLoader());
+
+ mState = savedInstanceState.getParcelable(INSTANCE_KEY_ACCESS_POINT_STATE);
+ mState.setContext(getContext());
+
+ mMode = savedInstanceState.getInt(INSTANCE_KEY_MODE, mMode);
+ mAutoSecurityAllowed = savedInstanceState.getBoolean(INSTANCE_KEY_AUTO_SECURITY_ALLOWED,
+ mAutoSecurityAllowed);
+ mCustomTitle = savedInstanceState.getCharSequence(INSTANCE_KEY_CUSTOM_TITLE);
+ if (mCustomTitle != null) {
+ setTitle(mCustomTitle);
+ }
+
+ // This is called last since it depends on the above values
+ super.onRestoreInstanceState(savedInstanceState);
+
+ if (mShowPasswordCheckBox != null) {
+ // Restore the show-password-state on the edit text
+ setShowPassword(mShowPasswordCheckBox.isChecked());
+ }
+ }
+
+ @Override
+ public Bundle onSaveInstanceState() {
+ Bundle bundle = super.onSaveInstanceState();
+ bundle.putParcelable(INSTANCE_KEY_ACCESS_POINT_STATE, mState);
+ bundle.putInt(INSTANCE_KEY_MODE, mMode);
+ bundle.putBoolean(INSTANCE_KEY_AUTO_SECURITY_ALLOWED, mAutoSecurityAllowed);
+ bundle.putCharSequence(INSTANCE_KEY_CUSTOM_TITLE, mCustomTitle);
+ return bundle;
+ }
+
+ /**
+ * Sets state to show in this dialog.
+ *
+ * @param state The state.
+ */
+ public void setState(AccessPointState state) {
+ mState = state;
+ }
+
+ /**
+ * Sets the dialog mode.
+ * @param mode One of {@link #MODE_CONFIGURE} or {@link #MODE_INFO}
+ */
+ public void setMode(int mode) {
+ mMode = mode;
+ }
+
+ public void setAutoSecurityAllowed(boolean autoSecurityAllowed) {
+ mAutoSecurityAllowed = autoSecurityAllowed;
+ }
+
+ @Override
+ public void setTitle(CharSequence title) {
+ super.setTitle(title);
+ mCustomTitle = title;
+ }
+
+ @Override
+ public void setTitle(int titleId) {
+ setTitle(getContext().getString(titleId));
+ }
+
+ /** Called after flags are set, the dialog's layout/etc should be set up here */
+ private void onLayout() {
+ final Context context = getContext();
+ final String ssid = mState.getHumanReadableSsid();
+
+ int positiveButtonResId = 0;
+ int negativeButtonResId = R.string.cancel;
+ int neutralButtonResId = 0;
+
+ if (mCustomTitle == null) {
+ // Generic title is the SSID
+ // We don't want to trigger this as a custom title, so call super's
+ super.setTitle(ssid);
+ }
+ setInverseBackgroundForced(true);
+
+ boolean defaultPasswordVisibility = true;
+
+ if (mMode == MODE_CONFIGURE) {
+ setLayout(R.layout.wifi_ap_configure);
+
+ positiveButtonResId = R.string.wifi_save_config;
+ mSaveButtonPos = POSITIVE_BUTTON;
+
+ } else if (mMode == MODE_INFO) {
+ setLayout(R.layout.wifi_ap_info);
+
+ if (mState.isConnectable()) {
+ if (mCustomTitle == null) {
+ // We don't want to trigger this as a custom title, so call super's
+ super.setTitle(context.getString(R.string.connect_to_blank, ssid));
+ }
+ positiveButtonResId = R.string.connect;
+ mConnectButtonPos = POSITIVE_BUTTON;
+ }
+
+ if (mState.isForgetable()) {
+ if (positiveButtonResId == 0) {
+ positiveButtonResId = R.string.forget_network;
+ mForgetButtonPos = POSITIVE_BUTTON;
+ } else {
+ neutralButtonResId = R.string.forget_network;
+ mForgetButtonPos = NEUTRAL_BUTTON;
+ }
+ }
+ } else if (mMode == MODE_RETRY_PASSWORD) {
+ setLayout(R.layout.wifi_ap_retry_password);
+
+ positiveButtonResId = R.string.connect;
+ mConnectButtonPos = POSITIVE_BUTTON;
+
+ setGenericPasswordVisible(true);
+ defaultPasswordVisibility = false;
+ }
+
+ if (defaultPasswordVisibility) {
+ if (!mState.configured && mState.seen && mState.hasSecurity()) {
+ setGenericPasswordVisible(true);
+ } else {
+ setGenericPasswordVisible(false);
+ }
+ }
+
+ setButtons(positiveButtonResId, negativeButtonResId, neutralButtonResId);
+ }
+
+ /** 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);
+
+ 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);
+
+ } else if (mMode == MODE_INFO) {
+ mTable = (ViewGroup) view.findViewById(R.id.table);
+ }
+
+ }
+
+ 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);
+ }
+
+ /** Called when the widgets are in-place waiting to be filled with data */
+ private void onFill() {
+
+ // Appears in the order added
+ if (mMode == MODE_INFO) {
+ if (mState.primary) {
+ addInfoRow(R.string.wifi_status, mState.getSummarizedStatus());
+ addInfoRow(R.string.wifi_link_speed, mState.linkSpeed + WifiInfo.LINK_SPEED_UNITS);
+ }
+
+ if (mState.seen) {
+ addInfoRow(R.string.signal, getSignalResId(mState.signal));
+ }
+
+ if (mState.security != null) {
+ addInfoRow(R.string.security, mState.getHumanReadableSecurity());
+ }
+
+ if (mState.primary && mState.ipAddress != 0) {
+ addInfoRow(R.string.ip_address, Formatter.formatIpAddress(mState.ipAddress));
+ }
+
+ } else if (mMode == MODE_CONFIGURE) {
+ String ssid = mState.getHumanReadableSsid();
+ if (!TextUtils.isEmpty(ssid)) {
+ mSsidEdit.setText(ssid);
+ }
+
+ mPasswordEdit.setHint(R.string.wifi_password_unchanged);
+ }
+
+ updatePasswordCaption(mState.security);
+ }
+
+ private void updatePasswordCaption(String security) {
+
+ if (mPasswordText != null && security != null
+ && security.equals(AccessPointState.WEP)) {
+ mPasswordText.setText(R.string.please_type_hex_key);
+ } else {
+ mPasswordText.setText(R.string.please_type_passphrase);
+ }
+ }
+
+ private void addInfoRow(int nameResId, String value) {
+ View rowView = getLayoutInflater().inflate(R.layout.wifi_ap_info_row, mTable, false);
+ ((TextView) rowView.findViewById(R.id.name)).setText(nameResId);
+ ((TextView) rowView.findViewById(R.id.value)).setText(value);
+ mTable.addView(rowView);
+ }
+
+ private void addInfoRow(int nameResId, int valueResId) {
+ addInfoRow(nameResId, getContext().getString(valueResId));
+ }
+
+ private void setButtons(int positiveResId, int negativeResId, int neutralResId) {
+ final Context context = getContext();
+
+ if (positiveResId > 0) {
+ setButton(context.getString(positiveResId), this);
+ }
+
+ if (negativeResId > 0) {
+ setButton2(context.getString(negativeResId), this);
+ }
+
+ if (neutralResId > 0) {
+ setButton3(context.getString(neutralResId), this);
+ }
+ }
+
+ private void setLayout(int layoutResId) {
+ setView(mView = getLayoutInflater().inflate(layoutResId, null));
+ onReferenceViews(mView);
+ }
+
+ public void onClick(DialogInterface dialog, int which) {
+ if (which == mForgetButtonPos) {
+ handleForget();
+ } else if (which == mConnectButtonPos) {
+ handleConnect();
+ } else if (which == mSaveButtonPos) {
+ handleSave();
+ }
+ }
+
+ private void handleForget() {
+ if (!replaceStateWithWifiLayerInstance()) return;
+ mWifiLayer.forgetNetwork(mState);
+ }
+
+ private void handleConnect() {
+ 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);
+ }
+
+ mWifiLayer.connectToNetwork(mState);
+ }
+
+ private void handleSave() {
+ replaceStateWithWifiLayerInstance();
+
+ String ssid = mSsidEdit.getText().toString();
+ String password = mPasswordEdit.getText().toString();
+
+ mState.setSsid(ssid);
+
+ int securityType = getSecurityTypeFromSpinner();
+
+ if (!TextUtils.isEmpty(password)) {
+ switch (securityType) {
+
+ case SECURITY_WPA_PERSONAL: {
+ mState.setSecurity(AccessPointState.WPA);
+ mState.setPassword(password);
+ break;
+ }
+
+ case SECURITY_WPA2_PERSONAL: {
+ mState.setSecurity(AccessPointState.WPA2);
+ mState.setPassword(password);
+ break;
+ }
+
+ case SECURITY_AUTO: {
+ mState.setPassword(password);
+ break;
+ }
+
+ case SECURITY_WEP: {
+ mState.setSecurity(AccessPointState.WEP);
+ mState.setPassword(password,
+ WEP_TYPE_VALUES[mWepTypeSpinner.getSelectedItemPosition()]);
+ break;
+ }
+
+ }
+ } else {
+ mState.setSecurity(AccessPointState.OPEN);
+ }
+
+ if (securityType == SECURITY_NONE) {
+ mState.setSecurity(AccessPointState.OPEN);
+ }
+
+ if (!mWifiLayer.saveNetwork(mState)) {
+ return;
+ }
+
+ // Connect right away if they've touched it
+ if (!mWifiLayer.connectToNetwork(mState)) {
+ return;
+ }
+
+ }
+
+ /**
+ * 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}.
+ *
+ * @return Whether WifiLayer was able to find an equal state in its set.
+ */
+ private boolean replaceStateWithWifiLayerInstance() {
+ AccessPointState state = mWifiLayer.getWifiLayerApInstance(mState);
+ if (state == null) {
+ return false;
+ }
+
+ mState = state;
+ return true;
+ }
+
+ private int getSecurityTypeFromSpinner() {
+ int position = mSecuritySpinner.getSelectedItemPosition();
+ // If there is no AUTO choice, the position needs 1 added to get
+ // to the proper spinner position -> security constants mapping
+ return mAutoSecurityAllowed ? position : position + 1;
+ }
+
+ private String getEnteredPassword() {
+ return mPasswordEdit != null ? mPasswordEdit.getText().toString() : null;
+ }
+
+ /**
+ * Call the one you want to hide first.
+ */
+ private void setWepVisible(boolean visible) {
+ setGenericPasswordVisible(visible);
+ int visibility = visible ? View.VISIBLE : View.GONE;
+ mWepTypeSpinner.setVisibility(visibility);
+ }
+
+ /**
+ * @see #setWepVisible(boolean)
+ */
+ private void setGenericPasswordVisible(boolean visible) {
+ int visibility = visible ? View.VISIBLE : View.GONE;
+ mPasswordText.setVisibility(visibility);
+ mPasswordEdit.setVisibility(visibility);
+ mShowPasswordCheckBox.setVisibility(visibility);
+ }
+
+ public void onItemSelected(AdapterView parent, View view, int position, long id) {
+ if (parent == mSecuritySpinner) {
+ handleSecurityChange(getSecurityTypeFromSpinner());
+ }
+ }
+
+ public void onNothingSelected(AdapterView parent) {
+ }
+
+ private void handleSecurityChange(int security) {
+
+ switch (security) {
+
+ case SECURITY_NONE: {
+ setWepVisible(false);
+ setGenericPasswordVisible(false);
+ break;
+ }
+
+ case SECURITY_WEP: {
+ setGenericPasswordVisible(false);
+ setWepVisible(true);
+ updatePasswordCaption(AccessPointState.WEP);
+ break;
+ }
+
+ case SECURITY_AUTO: {
+ setWepVisible(false);
+ setGenericPasswordVisible(mState.hasSecurity());
+ // Shows the generic 'wireless password'
+ updatePasswordCaption(AccessPointState.WPA);
+ break;
+ }
+
+ case SECURITY_WPA_PERSONAL:
+ case SECURITY_WPA2_PERSONAL: {
+ setWepVisible(false);
+ setGenericPasswordVisible(true);
+ // Both WPA and WPA2 show the same caption, so either is ok
+ updatePasswordCaption(AccessPointState.WPA);
+ break;
+ }
+ }
+ }
+
+ private static int getSignalResId(int signal) {
+ switch (WifiManager.calculateSignalLevel(signal, 4)) {
+ case 0: {
+ return R.string.wifi_signal_0;
+ }
+ case 1: {
+ return R.string.wifi_signal_1;
+ }
+ case 2: {
+ return R.string.wifi_signal_2;
+ }
+ case 3: {
+ return R.string.wifi_signal_3;
+ }
+ }
+
+ return 0;
+ }
+
+
+ public void onClick(View v) {
+ if (v == mShowPasswordCheckBox) {
+ setShowPassword(mShowPasswordCheckBox.isChecked());
+ }
+ }
+
+ private void setShowPassword(boolean showPassword) {
+ if (mPasswordEdit != null) {
+ // Toggle password
+ mPasswordEdit.setTransformationMethod(
+ showPassword ?
+ null :
+ PasswordTransformationMethod.getInstance());
+ }
+ }
+
+}
diff --git a/src/com/android/settings/wifi/AccessPointPreference.java b/src/com/android/settings/wifi/AccessPointPreference.java
new file mode 100644
index 0000000..10e0947
--- /dev/null
+++ b/src/com/android/settings/wifi/AccessPointPreference.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.wifi;
+
+import com.android.settings.R;
+
+import android.net.wifi.WifiManager;
+import android.preference.Preference;
+import android.view.View;
+import android.widget.ImageView;
+
+public class AccessPointPreference extends Preference implements
+ AccessPointState.AccessPointStateCallback {
+
+ // UI states
+ private static final int[] STATE_ENCRYPTED = { R.attr.state_encrypted };
+ private static final int[] STATE_EMPTY = { };
+
+ // Signal strength indicator
+ private static final int UI_SIGNAL_LEVELS = 4;
+
+ private WifiSettings mWifiSettings;
+
+ private AccessPointState mState;
+
+ public AccessPointPreference(WifiSettings wifiSettings, AccessPointState state) {
+ super(wifiSettings, null);
+
+ mWifiSettings = wifiSettings;
+ mState = state;
+
+ setWidgetLayoutResource(R.layout.preference_widget_wifi_signal);
+
+ state.setCallback(this);
+
+ refresh();
+ }
+
+ public void refresh() {
+ setTitle(mState.getHumanReadableSsid());
+ setSummary(mState.getSummarizedStatus());
+
+ notifyChanged();
+ }
+
+ public void refreshAccessPointState() {
+ refresh();
+
+ // The ordering of access points could have changed due to the state change, so
+ // re-evaluate ordering
+ notifyHierarchyChanged();
+ }
+
+ @Override
+ protected void onBindView(View view) {
+ super.onBindView(view);
+
+ ImageView signal = (ImageView) view.findViewById(R.id.signal);
+ if (mState.seen) {
+ signal.setImageResource(R.drawable.wifi_signal);
+ signal.setImageState(mState.hasSecurity() ? STATE_ENCRYPTED : STATE_EMPTY, true);
+ signal.setImageLevel(getUiSignalLevel());
+ } else {
+ signal.setImageDrawable(null);
+ }
+ }
+
+ private int getUiSignalLevel() {
+ return mState != null ? WifiManager.calculateSignalLevel(mState.signal, UI_SIGNAL_LEVELS)
+ : 0;
+ }
+
+ /**
+ * Returns the {@link AccessPointState} associated with this preference.
+ * @return The {@link AccessPointState}.
+ */
+ public AccessPointState getAccessPointState() {
+ return mState;
+ }
+
+ @Override
+ public int compareTo(Preference another) {
+ if (!(another instanceof AccessPointPreference)) {
+ // Let normal preferences go before us.
+ // NOTE: we should only be compared to Preference in our
+ // category.
+ return 1;
+ }
+
+ return mState.compareTo(((AccessPointPreference) another).mState);
+ }
+
+}
+
diff --git a/src/com/android/settings/wifi/AccessPointState.java b/src/com/android/settings/wifi/AccessPointState.java
new file mode 100644
index 0000000..c224954
--- /dev/null
+++ b/src/com/android/settings/wifi/AccessPointState.java
@@ -0,0 +1,879 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.wifi;
+
+import com.android.settings.R;
+
+import android.content.Context;
+import android.net.NetworkInfo;
+import android.net.wifi.ScanResult;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiConfiguration.AuthAlgorithm;
+import android.net.wifi.WifiConfiguration.GroupCipher;
+import android.net.wifi.WifiConfiguration.KeyMgmt;
+import android.net.wifi.WifiConfiguration.PairwiseCipher;
+import android.net.wifi.WifiConfiguration.Protocol;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.text.TextUtils;
+import android.util.Log;
+
+public final class AccessPointState implements Comparable<AccessPointState>, Parcelable {
+
+ private static final String TAG = "AccessPointState";
+
+ // Constants used for different security types
+ public static final String WPA2 = "WPA2";
+ public static final String WPA = "WPA";
+ public static final String WEP = "WEP";
+ public static final String OPEN = "Open";
+
+ /** 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 */
+ private static final String ENTERPRISE_CAPABILITY = "-EAP-";
+
+ // Localized strings for different security types
+ private static String LOCALIZED_WPA2;
+ private static String LOCALIZED_WPA;
+ private static String LOCALIZED_WEP;
+ private static String LOCALIZED_OPEN;
+ private static String LOCALIZED_UNKNOWN;
+ private static String LOCALIZED_VERBOSE_WPA2;
+ private static String LOCALIZED_VERBOSE_WPA;
+ private static String LOCALIZED_VERBOSE_WEP;
+ private static String LOCALIZED_VERBOSE_OPEN;
+
+
+ // Localized strings for various messages
+ private static String SUMMARY_NOT_IN_RANGE;
+ private static String SUMMARY_REMEMBERED;
+ private static String SUMMARY_CONNECTION_FAILED;
+
+ public static final String BSSID_ANY = "any";
+ public static final int NETWORK_ID_NOT_SET = -1;
+ /** This should be used with care! */
+ static final int NETWORK_ID_ANY = -2;
+
+ public static final int MATCH_NONE = 0;
+ public static final int MATCH_WEAK = 1;
+ public static final int MATCH_STRONG = 2;
+ public static final int MATCH_EXACT = 3;
+
+ // Don't set these directly, use the setters.
+ public int networkId;
+ public int priority;
+ public boolean hiddenSsid;
+ public int linkSpeed;
+ public int ipAddress;
+ public String bssid;
+ public String ssid;
+ public int signal;
+ public boolean primary;
+ public boolean seen;
+ public boolean configured;
+ public NetworkInfo.DetailedState status;
+ public String security;
+ public boolean disabled;
+
+ /**
+ * Use this for sorting based on signal strength. It is a heavily-damped
+ * time-averaged weighted signal.
+ */
+ private float signalForSorting = Float.MIN_VALUE;
+
+ private static final float DAMPING_FACTOR = 0.2f;
+
+ /**
+ * This will be a user entered password, and NOT taken from wpa_supplicant
+ * (since it would give us *)
+ */
+ private String mPassword;
+ private boolean mConfigHadPassword;
+
+ public static final int WEP_PASSWORD_AUTO = 0;
+ public static final int WEP_PASSWORD_ASCII = 1;
+ public static final int WEP_PASSWORD_HEX = 2;
+ private int mWepPasswordType;
+
+ private Context mContext;
+
+ /**
+ * If > 0, don't refresh (changes are being batched), use
+ * {@link #blockRefresh()} and {@link #unblockRefresh()} only.
+ */
+ private int mBlockRefresh;
+ /**
+ * This will be set by {@link #requestRefresh} and shouldn't be written to
+ * elsewhere.
+ */
+ private boolean mNeedsRefresh;
+
+ private AccessPointStateCallback mCallback;
+
+ private StringBuilder mSummaryBuilder = new StringBuilder();
+
+ interface AccessPointStateCallback {
+ void refreshAccessPointState();
+ }
+
+ public AccessPointState(Context context) {
+ this();
+
+ setContext(context);
+ }
+
+ private AccessPointState() {
+ bssid = BSSID_ANY;
+ ssid = "";
+ networkId = NETWORK_ID_NOT_SET;
+ hiddenSsid = false;
+ }
+
+ void setContext(Context context) {
+ mContext = context;
+ setStrings();
+ }
+
+ private void setStrings() {
+ final Context c = mContext;
+
+ if (SUMMARY_NOT_IN_RANGE == null && c != null) {
+ SUMMARY_NOT_IN_RANGE = c.getString(R.string.summary_not_in_range);
+ SUMMARY_REMEMBERED = c.getString(R.string.summary_remembered);
+ SUMMARY_CONNECTION_FAILED = c.getString(R.string.summary_connection_failed);
+
+ LOCALIZED_OPEN = c.getString(R.string.wifi_security_open);
+ LOCALIZED_WEP = c.getString(R.string.wifi_security_wep);
+ LOCALIZED_WPA = c.getString(R.string.wifi_security_wpa);
+ LOCALIZED_WPA2 = c.getString(R.string.wifi_security_wpa2);
+
+ LOCALIZED_VERBOSE_OPEN = c.getString(R.string.wifi_security_verbose_open);
+ LOCALIZED_VERBOSE_WEP = c.getString(R.string.wifi_security_verbose_wep);
+ LOCALIZED_VERBOSE_WPA = c.getString(R.string.wifi_security_verbose_wpa);
+ LOCALIZED_VERBOSE_WPA2 = c.getString(R.string.wifi_security_verbose_wpa2);
+
+ LOCALIZED_UNKNOWN = c.getString(R.string.wifi_security_unknown);
+ }
+ }
+
+ public void setNetworkId(int networkId) {
+ this.networkId = networkId;
+ }
+
+ public void setBssid(String bssid) {
+ if (bssid != null) {
+ // If the BSSID is a wildcard, do NOT let a specific BSSID replace it
+ if (!this.bssid.equals(BSSID_ANY)) {
+ this.bssid = bssid;
+ }
+ }
+ }
+
+ private String getWpaSupplicantBssid() {
+ return bssid.equals(BSSID_ANY) ? null : bssid;
+ }
+
+ public static String convertToQuotedString(String string) {
+ if (TextUtils.isEmpty(string)) {
+ return "";
+ }
+
+ final int lastPos = string.length() - 1;
+ if (lastPos < 0 || (string.charAt(0) == '"' && string.charAt(lastPos) == '"')) {
+ return string;
+ }
+
+ return "\"" + string + "\"";
+ }
+
+ public void setPrimary(boolean primary) {
+ if (this.primary != primary) {
+ this.primary = primary;
+ requestRefresh();
+ }
+ }
+
+ public void setSeen(boolean seen) {
+ if (this.seen != seen) {
+ this.seen = seen;
+ requestRefresh();
+ }
+ }
+
+ public void setDisabled(boolean disabled) {
+ if (this.disabled != disabled) {
+ this.disabled = disabled;
+ requestRefresh();
+ }
+ }
+
+ public void setSignal(int signal) {
+
+ if (signalForSorting == Float.MIN_VALUE) {
+ signalForSorting = signal;
+ } else {
+ signalForSorting = (DAMPING_FACTOR * signal) + ((1-DAMPING_FACTOR) * signalForSorting);
+ }
+
+ if (this.signal != signal) {
+ this.signal = signal;
+ requestRefresh();
+ }
+ }
+
+ public String getHumanReadableSsid() {
+ if (TextUtils.isEmpty(ssid)) {
+ return "";
+ }
+
+ final int lastPos = ssid.length() - 1;
+ if (ssid.charAt(0) == '"' && ssid.charAt(lastPos) == '"') {
+ return ssid.substring(1, lastPos);
+ }
+
+ return ssid;
+ }
+
+ public void setSsid(String ssid) {
+ if (ssid != null) {
+ this.ssid = convertToQuotedString(ssid);
+ requestRefresh();
+ }
+ }
+
+ public void setPriority(int priority) {
+ if (this.priority != priority) {
+ this.priority = priority;
+ requestRefresh();
+ }
+ }
+
+ public void setHiddenSsid(boolean hiddenSsid) {
+ if (this.hiddenSsid != hiddenSsid) {
+ this.hiddenSsid = hiddenSsid;
+ requestRefresh();
+ }
+ }
+
+ public void setLinkSpeed(int linkSpeed) {
+ if (this.linkSpeed != linkSpeed) {
+ this.linkSpeed = linkSpeed;
+ requestRefresh();
+ }
+ }
+
+ public void setIpAddress(int address) {
+ if (ipAddress != address) {
+ ipAddress = address;
+ requestRefresh();
+ }
+ }
+
+ public void setConfigured(boolean configured) {
+ if (this.configured != configured) {
+ this.configured = configured;
+ requestRefresh();
+ }
+ }
+
+ public void setStatus(NetworkInfo.DetailedState status) {
+ if (this.status != status) {
+ this.status = status;
+ requestRefresh();
+ }
+ }
+
+ public void setSecurity(String security) {
+ if (TextUtils.isEmpty(this.security) || !this.security.equals(security)) {
+ this.security = security;
+ requestRefresh();
+ }
+ }
+
+ public boolean hasSecurity() {
+ return security != null && !security.contains(OPEN);
+ }
+
+ public String getHumanReadableSecurity() {
+ if (security.equals(OPEN)) return LOCALIZED_OPEN;
+ else if (security.equals(WEP)) return LOCALIZED_WEP;
+ else if (security.equals(WPA)) return LOCALIZED_WPA;
+ else if (security.equals(WPA2)) return LOCALIZED_WPA2;
+
+ return LOCALIZED_UNKNOWN;
+ }
+
+ public void updateFromScanResult(ScanResult scanResult) {
+ blockRefresh();
+
+ // We don't keep specific AP BSSIDs and instead leave that as wildcard
+
+ setSeen(true);
+ setSsid(scanResult.SSID);
+ if (networkId == NETWORK_ID_NOT_SET) {
+ // Since ScanResults don't cross-reference network ID, we set it as a wildcard
+ setNetworkId(NETWORK_ID_ANY);
+ }
+ setSignal(scanResult.level);
+ setSecurity(getScanResultSecurity(scanResult));
+ unblockRefresh();
+ }
+
+ /**
+ * @return The security of a given {@link ScanResult}.
+ */
+ public static String getScanResultSecurity(ScanResult scanResult) {
+ final String cap = scanResult.capabilities;
+ final String[] securityModes = { WEP, WPA, WPA2 };
+ for (int i = securityModes.length - 1; i >= 0; i--) {
+ if (cap.contains(securityModes[i])) {
+ return securityModes[i];
+ }
+ }
+
+ return OPEN;
+ }
+
+ /**
+ * @return Whether the given ScanResult represents an adhoc network.
+ */
+ public static boolean isAdhoc(ScanResult scanResult) {
+ return scanResult.capabilities.contains(ADHOC_CAPABILITY);
+ }
+
+ /**
+ * @return Whether the given ScanResult has enterprise security.
+ */
+ public static boolean isEnterprise(ScanResult scanResult) {
+ return scanResult.capabilities.contains(ENTERPRISE_CAPABILITY);
+ }
+
+ public void updateFromWifiConfiguration(WifiConfiguration wifiConfig) {
+ if (wifiConfig != null) {
+ blockRefresh();
+ setBssid(wifiConfig.BSSID);
+ setNetworkId(wifiConfig.networkId);
+ setPriority(wifiConfig.priority);
+ setHiddenSsid(wifiConfig.hiddenSSID);
+ setSsid(wifiConfig.SSID);
+ setConfigured(true);
+ setDisabled(wifiConfig.status == WifiConfiguration.Status.DISABLED);
+ parseWifiConfigurationSecurity(wifiConfig);
+ unblockRefresh();
+ }
+ }
+
+ public void setPassword(String password) {
+ setPassword(password, WEP_PASSWORD_AUTO);
+ }
+
+ public void setPassword(String password, int wepPasswordType) {
+ mPassword = password;
+ mWepPasswordType = wepPasswordType;
+ }
+
+ public boolean hasPassword() {
+ return !TextUtils.isEmpty(mPassword) || mConfigHadPassword;
+ }
+
+ private static boolean hasPassword(WifiConfiguration wifiConfig) {
+ return !TextUtils.isEmpty(wifiConfig.preSharedKey)
+ || !TextUtils.isEmpty(wifiConfig.wepKeys[0])
+ || !TextUtils.isEmpty(wifiConfig.wepKeys[1])
+ || !TextUtils.isEmpty(wifiConfig.wepKeys[2])
+ || !TextUtils.isEmpty(wifiConfig.wepKeys[3]);
+ }
+
+ private void parseWifiConfigurationSecurity(WifiConfiguration wifiConfig) {
+ setSecurity(getWifiConfigurationSecurity(wifiConfig));
+ mConfigHadPassword = hasPassword(wifiConfig);
+ }
+
+ /**
+ * @return The security of a given {@link WifiConfiguration}.
+ */
+ public static String getWifiConfigurationSecurity(WifiConfiguration wifiConfig) {
+
+ if (wifiConfig.allowedKeyManagement.get(KeyMgmt.NONE)) {
+ // If we never set group ciphers, wpa_supplicant puts all of them.
+ // For open, we don't set group ciphers.
+ // For WEP, we specifically only set WEP40 and WEP104, so CCMP
+ // and TKIP should not be there.
+ if (!wifiConfig.allowedGroupCiphers.get(GroupCipher.CCMP)
+ && (wifiConfig.allowedGroupCiphers.get(GroupCipher.WEP40)
+ || wifiConfig.allowedGroupCiphers.get(GroupCipher.WEP104))) {
+ return WEP;
+ } else {
+ return OPEN;
+ }
+ } else if (wifiConfig.allowedProtocols.get(Protocol.RSN)) {
+ return WPA2;
+ } else if (wifiConfig.allowedProtocols.get(Protocol.WPA)) {
+ return WPA;
+ } else {
+ Log.w(TAG, "Unknown security type from WifiConfiguration, falling back on open.");
+ return OPEN;
+ }
+ }
+
+ public void updateFromWifiInfo(WifiInfo wifiInfo, NetworkInfo.DetailedState state) {
+ if (wifiInfo != null) {
+ blockRefresh();
+ setBssid(wifiInfo.getBSSID());
+ setLinkSpeed(wifiInfo.getLinkSpeed());
+ setNetworkId(wifiInfo.getNetworkId());
+ setIpAddress(wifiInfo.getIpAddress());
+ setSsid(wifiInfo.getSSID());
+ if (state != null) {
+ setStatus(state);
+ }
+ setHiddenSsid(wifiInfo.getHiddenSSID());
+ unblockRefresh();
+ }
+ }
+
+ /**
+ * @return Whether this AP can be connected to at the moment.
+ */
+ public boolean isConnectable() {
+ return !primary && seen;
+ }
+
+ /**
+ * @return Whether this AP can be forgotten at the moment.
+ */
+ public boolean isForgetable() {
+ return configured;
+ }
+
+ /**
+ * Updates the state as if it were never configured.
+ * <p>
+ * Note: This will not pass the forget call to the Wi-Fi API.
+ */
+ public void forget() {
+ blockRefresh();
+ setConfigured(false);
+ setNetworkId(NETWORK_ID_NOT_SET);
+ setPrimary(false);
+ setStatus(null);
+ setDisabled(false);
+ unblockRefresh();
+ }
+
+ public void updateWifiConfiguration(WifiConfiguration config) {
+ config.BSSID = getWpaSupplicantBssid();
+ config.priority = priority;
+ config.hiddenSSID = hiddenSsid;
+ config.SSID = convertToQuotedString(ssid);
+
+ setupSecurity(config);
+ }
+
+ private void setupSecurity(WifiConfiguration config) {
+ config.allowedAuthAlgorithms.clear();
+ config.allowedGroupCiphers.clear();
+ config.allowedKeyManagement.clear();
+ config.allowedPairwiseCiphers.clear();
+ config.allowedProtocols.clear();
+
+ if (TextUtils.isEmpty(security)) {
+ security = OPEN;
+ Log.w(TAG, "Empty security, assuming open");
+ }
+
+ if (security.equals(WEP)) {
+
+ // If password is empty, it should be left untouched
+ if (!TextUtils.isEmpty(mPassword)) {
+ if (mWepPasswordType == WEP_PASSWORD_AUTO) {
+ if (isHexWepKey(mPassword)) {
+ config.wepKeys[0] = mPassword;
+ } else {
+ config.wepKeys[0] = convertToQuotedString(mPassword);
+ }
+ } else {
+ config.wepKeys[0] = mWepPasswordType == WEP_PASSWORD_ASCII
+ ? convertToQuotedString(mPassword)
+ : mPassword;
+ }
+ }
+
+ config.wepTxKeyIndex = 0;
+
+ config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN);
+ config.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED);
+
+ config.allowedKeyManagement.set(KeyMgmt.NONE);
+
+ config.allowedGroupCiphers.set(GroupCipher.WEP40);
+ config.allowedGroupCiphers.set(GroupCipher.WEP104);
+
+ } else if (security.equals(WPA) || security.equals(WPA2)){
+ config.allowedGroupCiphers.set(GroupCipher.TKIP);
+ config.allowedGroupCiphers.set(GroupCipher.CCMP);
+
+ config.allowedKeyManagement.set(KeyMgmt.WPA_PSK);
+
+ config.allowedPairwiseCiphers.set(PairwiseCipher.CCMP);
+ config.allowedPairwiseCiphers.set(PairwiseCipher.TKIP);
+
+ config.allowedProtocols.set(security.equals(WPA2) ? Protocol.RSN : Protocol.WPA);
+
+ // If password is empty, it should be left untouched
+ if (!TextUtils.isEmpty(mPassword)) {
+ if (mPassword.length() == 64 && isHex(mPassword)) {
+ // Goes unquoted as hex
+ config.preSharedKey = mPassword;
+ } else {
+ // Goes quoted as ASCII
+ config.preSharedKey = convertToQuotedString(mPassword);
+ }
+ }
+
+ } else if (security.equals(OPEN)) {
+ config.allowedKeyManagement.set(KeyMgmt.NONE);
+ }
+ }
+
+ private static boolean isHexWepKey(String wepKey) {
+ final int len = wepKey.length();
+
+ // WEP-40, WEP-104, and some vendors using 256-bit WEP (WEP-232?)
+ if (len != 10 && len != 26 && len != 58) {
+ return false;
+ }
+
+ return isHex(wepKey);
+ }
+
+ private static boolean isHex(String key) {
+ for (int i = key.length() - 1; i >= 0; i--) {
+ final char c = key.charAt(i);
+ if (!(c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'a' && c <= 'f')) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ public void setCallback(AccessPointStateCallback callback) {
+ mCallback = callback;
+ }
+
+ void blockRefresh() {
+ mBlockRefresh++;
+ }
+
+ void unblockRefresh() {
+ if (--mBlockRefresh == 0 && mNeedsRefresh) {
+ requestRefresh();
+ }
+ }
+
+ private void requestRefresh() {
+ if (mBlockRefresh > 0) {
+ mNeedsRefresh = true;
+ return;
+ }
+
+ if (mCallback != null) {
+ mCallback.refreshAccessPointState();
+ }
+
+ mNeedsRefresh = false;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see #hashCode()
+ * @see #equals(Object)
+ */
+ public int matches(int otherNetworkId, String otherBssid, String otherSsid,
+ String otherSecurity) {
+
+ // Whenever this method is touched, please ensure #equals and #hashCode
+ // still work with the changes here!
+
+ if (otherSsid == null) {
+ if (WifiLayer.LOGV) {
+ Log.w(TAG, "BSSID: " + otherBssid + ", SSID: " + otherSsid);
+ }
+ return MATCH_NONE;
+ }
+
+ /*
+ * If we both have 'security' set, it must match (an open network still
+ * has 'security' set to OPEN)
+ */
+ if (security != null && otherSecurity != null) {
+ if (!security.equals(otherSecurity)) {
+ return MATCH_NONE;
+ }
+ }
+
+ // WifiConfiguration gives an empty bssid as a BSSID wildcard
+ if (TextUtils.isEmpty(otherBssid)) {
+ otherBssid = AccessPointState.BSSID_ANY;
+ }
+
+ final boolean networkIdMatches = networkId == otherNetworkId;
+ if (!networkIdMatches && networkId != NETWORK_ID_ANY && otherNetworkId != NETWORK_ID_ANY) {
+ // Network IDs don't match (e.g., 1 & 2 or unset & 1) and neither is a wildcard
+ return MATCH_NONE;
+ }
+
+ if (networkIdMatches && otherNetworkId != NETWORK_ID_NOT_SET
+ && otherNetworkId != NETWORK_ID_ANY) {
+ // Network ID matches (they're set to the same ID)
+ return MATCH_EXACT;
+ }
+
+ // So now, network IDs aren't set or at least one is a wildcard
+
+ final boolean bssidMatches = bssid.equals(otherBssid);
+ final boolean otherBssidIsWildcard = otherBssid.equals(BSSID_ANY);
+ if (bssidMatches && !otherBssidIsWildcard) {
+ // BSSID matches (and neither is a wildcard)
+ return MATCH_STRONG;
+ }
+
+ if (!bssidMatches && !bssid.equals(BSSID_ANY) && !otherBssidIsWildcard) {
+ // BSSIDs don't match (e.g., 00:24:21:21:42:12 & 42:12:44:21:22:52)
+ // and neither is a wildcard
+ return MATCH_NONE;
+ }
+
+ // So now, BSSIDs are both wildcards
+
+ final boolean ssidMatches = ssid.equals(otherSsid);
+ if (ssidMatches) {
+ // SSID matches
+ return MATCH_WEAK;
+ }
+
+ return MATCH_NONE;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see #matches(int, String, String)
+ * @see #equals(Object)
+ */
+ @Override
+ public int hashCode() {
+ // Two equal() objects must have same hashCode.
+ // With Wi-Fi, the broadest match is if two SSIDs are the same. The finer-grained matches
+ // imply this (for example, the same network IDs means the same WifiConfiguration which
+ // means the same SSID).
+ // See #matches for the exact matching algorithm we use.
+ return ssid != null ? ssid.hashCode() : 0;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see #matches(int, String, String)
+ * @see #hashCode()
+ */
+ @Override
+ public boolean equals(Object o) {
+ if (!o.getClass().equals(getClass())) {
+ return false;
+ }
+
+ final AccessPointState other = (AccessPointState) o;
+
+ // To see which conditions cause two AccessPointStates to be equal, see
+ // where #matches returns MATCH_WEAK or greater.
+
+ return matches(other.networkId, other.bssid, other.ssid, other.security) >= MATCH_WEAK;
+ }
+
+ public int matchesWifiConfiguration(WifiConfiguration wifiConfig) {
+ String security = getWifiConfigurationSecurity(wifiConfig);
+ return matches(wifiConfig.networkId, wifiConfig.BSSID, wifiConfig.SSID, security);
+ }
+
+ String getSummarizedStatus() {
+ StringBuilder sb = mSummaryBuilder;
+ sb.delete(0, sb.length());
+
+ if (primary && status != null) {
+ buildSummary(sb, WifiStatus.getPrintable(mContext, status), true);
+
+ } else if (!seen) {
+ buildSummary(sb, SUMMARY_NOT_IN_RANGE, true);
+
+ // Remembered comes second in this case
+ if (!primary && configured) {
+ buildSummary(sb, SUMMARY_REMEMBERED, true);
+ }
+
+ } else {
+ if (configured && disabled) {
+ // The connection failure overrides all in this case
+ return SUMMARY_CONNECTION_FAILED;
+ }
+
+ // Remembered comes first in this case
+ if (!primary && configured) {
+ buildSummary(sb, SUMMARY_REMEMBERED, true);
+ }
+
+ // If it is seen (and not the primary), show the security type
+ String verboseSecurity = getVerboseSecurity();
+ if (verboseSecurity != null) {
+ buildSummary(sb, verboseSecurity, true);
+ }
+ }
+
+ return sb.toString();
+ }
+
+ private String getVerboseSecurity() {
+ if (WEP.equals(security)) {
+ return LOCALIZED_VERBOSE_WEP;
+ } else if (WPA.equals(security)) {
+ return LOCALIZED_VERBOSE_WPA;
+ } else if (WPA2.equals(security)) {
+ return LOCALIZED_VERBOSE_WPA2;
+ } else if (OPEN.equals(security)) {
+ return LOCALIZED_VERBOSE_OPEN;
+ } else {
+ return null;
+ }
+ }
+
+ private void buildSummary(StringBuilder sb, String string, boolean autoLowerCaseFirstLetter) {
+ if (sb.length() == 0) {
+ sb.append(string);
+ } else {
+ sb.append(", ");
+ if (autoLowerCaseFirstLetter) {
+ // Convert first letter to lowercase
+ sb.append(Character.toLowerCase(string.charAt(0))).append(string, 1,
+ string.length());
+ } else {
+ sb.append(string);
+ }
+ }
+ }
+
+ public int compareTo(AccessPointState other) {
+ // This ranks the states for displaying in the AP list, not for
+ // connecting to (wpa_supplicant does that using the WifiConfiguration's
+ // priority field).
+
+ // Clarity > efficiency, of this logic:
+ int comparison;
+
+ // Primary
+ comparison = (other.primary ? 1 : 0) - (primary ? 1 : 0);
+ if (comparison != 0) return comparison;
+
+ // Currently seen (similar to, but not always the same as within range)
+ comparison = (other.seen ? 1 : 0) - (seen ? 1 : 0);
+ if (comparison != 0) return comparison;
+
+ // Configured
+ comparison = (other.configured ? 1 : 0) - (configured ? 1 : 0);
+ if (comparison != 0) return comparison;
+
+ if (!configured) {
+ // Neither are configured
+
+ // Open network
+ comparison = (hasSecurity() ? 1 : 0) - (other.hasSecurity() ? 1 : 0);
+ if (comparison != 0) return comparison;
+ }
+
+ // Signal strength
+ comparison = (int) (other.signalForSorting - signalForSorting);
+ if (comparison != 0) return comparison;
+
+ // Alphabetical
+ return ssid.compareToIgnoreCase(other.ssid);
+ }
+
+ public String toString() {
+ return ssid + " (" + bssid + ", " + networkId + ", " + super.toString() + ")";
+ }
+
+ /** Implement the Parcelable interface */
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(bssid);
+ dest.writeInt(configured ? 1 : 0);
+ dest.writeInt(ipAddress);
+ dest.writeInt(linkSpeed);
+ dest.writeInt(networkId);
+ dest.writeInt(primary ? 1 : 0);
+ dest.writeInt(priority);
+ dest.writeInt(hiddenSsid ? 1 : 0);
+ dest.writeString(security);
+ dest.writeInt(seen ? 1 : 0);
+ dest.writeInt(disabled ? 1 : 0);
+ dest.writeInt(signal);
+ dest.writeString(ssid);
+ dest.writeString(status != null ? status.toString() : null);
+ dest.writeString(mPassword);
+ dest.writeInt(mConfigHadPassword ? 1 : 0);
+ dest.writeInt(mWepPasswordType);
+ }
+
+ /** Implement the Parcelable interface */
+ public int describeContents() {
+ return 0;
+ }
+
+ /** Implement the Parcelable interface */
+ public static final Creator<AccessPointState> CREATOR =
+ new Creator<AccessPointState>() {
+ public AccessPointState createFromParcel(Parcel in) {
+ AccessPointState state = new AccessPointState();
+ state.bssid = in.readString();
+ state.configured = in.readInt() == 1;
+ state.ipAddress = in.readInt();
+ state.linkSpeed = in.readInt();
+ state.networkId = in.readInt();
+ state.primary = in.readInt() == 1;
+ state.priority = in.readInt();
+ state.hiddenSsid = in.readInt() == 1;
+ state.security = in.readString();
+ state.seen = in.readInt() == 1;
+ state.disabled = in.readInt() == 1;
+ state.signal = in.readInt();
+ state.ssid = in.readString();
+ String statusStr = in.readString();
+ if (statusStr != null) {
+ state.status = NetworkInfo.DetailedState.valueOf(statusStr);
+ }
+ state.mPassword = in.readString();
+ state.mConfigHadPassword = in.readInt() == 1;
+ state.mWepPasswordType = in.readInt();
+ return state;
+ }
+
+ public AccessPointState[] newArray(int size) {
+ return new AccessPointState[size];
+ }
+ };
+
+
+}
diff --git a/src/com/android/settings/wifi/AdvancedSettings.java b/src/com/android/settings/wifi/AdvancedSettings.java
new file mode 100644
index 0000000..323d5c7
--- /dev/null
+++ b/src/com/android/settings/wifi/AdvancedSettings.java
@@ -0,0 +1,274 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.wifi;
+
+import com.android.settings.R;
+
+import android.content.ContentResolver;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.Bundle;
+import android.preference.CheckBoxPreference;
+import android.preference.EditTextPreference;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.provider.Settings;
+import android.provider.Settings.System;
+import android.text.TextUtils;
+import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.widget.Toast;
+
+public class AdvancedSettings extends PreferenceActivity
+ implements Preference.OnPreferenceChangeListener {
+
+ private static final String KEY_MAC_ADDRESS = "mac_address";
+ private static final String KEY_USE_STATIC_IP = "use_static_ip";
+ private static final String KEY_NUM_CHANNELS = "num_channels";
+ private static final String KEY_SLEEP_POLICY = "sleep_policy";
+
+ private String[] mSettingNames = {
+ System.WIFI_STATIC_IP, System.WIFI_STATIC_GATEWAY, System.WIFI_STATIC_NETMASK,
+ System.WIFI_STATIC_DNS1, System.WIFI_STATIC_DNS2
+ };
+
+ private String[] mPreferenceKeys = {
+ "ip_address", "gateway", "netmask", "dns1", "dns2"
+ };
+
+ private CheckBoxPreference mUseStaticIpCheckBox;
+
+ private static final int MENU_ITEM_SAVE = Menu.FIRST;
+ private static final int MENU_ITEM_CANCEL = Menu.FIRST + 1;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ addPreferencesFromResource(R.xml.wifi_advanced_settings);
+
+ mUseStaticIpCheckBox = (CheckBoxPreference) findPreference(KEY_USE_STATIC_IP);
+
+ for (int i = 0; i < mPreferenceKeys.length; i++) {
+ Preference preference = findPreference(mPreferenceKeys[i]);
+ preference.setOnPreferenceChangeListener(this);
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ updateUi();
+ initNumChannelsPreference();
+ initSleepPolicyPreference();
+ refreshMacAddress();
+ }
+
+ private void initNumChannelsPreference() {
+ ListPreference pref = (ListPreference) findPreference(KEY_NUM_CHANNELS);
+ pref.setOnPreferenceChangeListener(this);
+
+ WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
+ /*
+ * Generate the list of valid channel counts to show in the ListPreference.
+ * The values are numerical, so the only text to be localized is the
+ * "channel_word" resource.
+ */
+ int[] validChannelCounts = wifiManager.getValidChannelCounts();
+ if (validChannelCounts == null) {
+ Toast.makeText(this, R.string.wifi_setting_num_channels_error,
+ Toast.LENGTH_SHORT).show();
+ pref.setEnabled(false);
+ return;
+ }
+ String[] entries = new String[validChannelCounts.length];
+ String[] entryValues = new String[validChannelCounts.length];
+
+ for (int i = 0; i < validChannelCounts.length; i++) {
+ entryValues[i] = String.valueOf(validChannelCounts[i]);
+ entries[i] = getString(R.string.wifi_setting_num_channels_channel_phrase,
+ validChannelCounts[i]);
+ }
+ pref.setEntries(entries);
+ pref.setEntryValues(entryValues);
+ pref.setEnabled(true);
+ int numChannels = wifiManager.getNumAllowedChannels();
+ if (numChannels >= 0) {
+ pref.setValue(String.valueOf(numChannels));
+ }
+ }
+
+ private void initSleepPolicyPreference() {
+ ListPreference pref = (ListPreference) findPreference(KEY_SLEEP_POLICY);
+ pref.setOnPreferenceChangeListener(this);
+ int value = Settings.System.getInt(getContentResolver(),
+ Settings.System.WIFI_SLEEP_POLICY,Settings. System.WIFI_SLEEP_POLICY_DEFAULT);
+ pref.setValue(String.valueOf(value));
+ }
+
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+
+ if (keyCode == KeyEvent.KEYCODE_BACK) {
+ updateSettingsProvider();
+ }
+
+ return super.onKeyDown(keyCode, event);
+ }
+
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ String key = preference.getKey();
+ if (key == null) return true;
+
+ if (key.equals(KEY_NUM_CHANNELS)) {
+ try {
+ int numChannels = Integer.parseInt((String) newValue);
+ WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
+ if (!wifiManager.setNumAllowedChannels(numChannels)) {
+ Toast.makeText(this, R.string.wifi_setting_num_channels_error,
+ Toast.LENGTH_SHORT).show();
+ }
+ } catch (NumberFormatException e) {
+ Toast.makeText(this, R.string.wifi_setting_num_channels_error,
+ Toast.LENGTH_SHORT).show();
+ return false;
+ }
+
+ } else if (key.equals(KEY_SLEEP_POLICY)) {
+ try {
+ Settings.System.putInt(getContentResolver(),
+ Settings.System.WIFI_SLEEP_POLICY, Integer.parseInt(((String) newValue)));
+ } catch (NumberFormatException e) {
+ Toast.makeText(this, R.string.wifi_setting_sleep_policy_error,
+ Toast.LENGTH_SHORT).show();
+ return false;
+ }
+
+ } else {
+ String value = (String) newValue;
+
+ if (!isIpAddress(value)) {
+ Toast.makeText(this, R.string.wifi_ip_settings_invalid_ip, Toast.LENGTH_LONG).show();
+ return false;
+ }
+
+ preference.setSummary(value);
+ }
+
+ return true;
+ }
+
+ private boolean isIpAddress(String value) {
+
+ int start = 0;
+ int end = value.indexOf('.');
+ int numBlocks = 0;
+
+ while (start < value.length()) {
+
+ if (end == -1) {
+ end = value.length();
+ }
+
+ try {
+ int block = Integer.parseInt(value.substring(start, end));
+ if ((block > 255) || (block < 0)) {
+ return false;
+ }
+ } catch (NumberFormatException e) {
+ return false;
+ }
+
+ numBlocks++;
+
+ start = end + 1;
+ end = value.indexOf('.', start);
+ }
+
+ return numBlocks == 4;
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+
+ menu.add(0, MENU_ITEM_SAVE, 0, R.string.wifi_ip_settings_menu_save)
+ .setIcon(android.R.drawable.ic_menu_save);
+
+ menu.add(0, MENU_ITEM_CANCEL, 0, R.string.wifi_ip_settings_menu_cancel)
+ .setIcon(android.R.drawable.ic_menu_close_clear_cancel);
+
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+
+ switch (item.getItemId()) {
+
+ case MENU_ITEM_SAVE:
+ updateSettingsProvider();
+ finish();
+ return true;
+
+ case MENU_ITEM_CANCEL:
+ finish();
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ private void updateUi() {
+ ContentResolver contentResolver = getContentResolver();
+
+ mUseStaticIpCheckBox.setChecked(System.getInt(contentResolver,
+ System.WIFI_USE_STATIC_IP, 0) != 0);
+
+ for (int i = 0; i < mSettingNames.length; i++) {
+ EditTextPreference preference = (EditTextPreference) findPreference(mPreferenceKeys[i]);
+ String settingValue = System.getString(contentResolver, mSettingNames[i]);
+ preference.setText(settingValue);
+ preference.setSummary(settingValue);
+ }
+ }
+
+ private void updateSettingsProvider() {
+ ContentResolver contentResolver = getContentResolver();
+
+ System.putInt(contentResolver, System.WIFI_USE_STATIC_IP,
+ mUseStaticIpCheckBox.isChecked() ? 1 : 0);
+
+ for (int i = 0; i < mSettingNames.length; i++) {
+ EditTextPreference preference = (EditTextPreference) findPreference(mPreferenceKeys[i]);
+ System.putString(contentResolver, mSettingNames[i], preference.getText());
+ }
+ }
+
+ private void refreshMacAddress() {
+ WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
+ WifiInfo wifiInfo = wifiManager.getConnectionInfo();
+
+ Preference wifiMacAddressPref = findPreference(KEY_MAC_ADDRESS);
+ String macAddress = wifiInfo == null ? null : wifiInfo.getMacAddress();
+ wifiMacAddressPref.setSummary(!TextUtils.isEmpty(macAddress) ? macAddress
+ : getString(R.string.status_unavailable));
+ }
+
+}
diff --git a/src/com/android/settings/wifi/WifiEnabler.java b/src/com/android/settings/wifi/WifiEnabler.java
new file mode 100644
index 0000000..88cfe06
--- /dev/null
+++ b/src/com/android/settings/wifi/WifiEnabler.java
@@ -0,0 +1,188 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.wifi;
+
+import static android.net.wifi.WifiManager.WIFI_STATE_DISABLED;
+import static android.net.wifi.WifiManager.WIFI_STATE_DISABLING;
+import static android.net.wifi.WifiManager.WIFI_STATE_ENABLED;
+import static android.net.wifi.WifiManager.WIFI_STATE_ENABLING;
+import static android.net.wifi.WifiManager.WIFI_STATE_UNKNOWN;
+
+import com.android.settings.R;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.NetworkInfo;
+import android.net.wifi.WifiManager;
+import android.preference.Preference;
+import android.preference.CheckBoxPreference;
+import android.text.TextUtils;
+import android.util.Config;
+import android.util.Log;
+
+public class WifiEnabler implements Preference.OnPreferenceChangeListener {
+
+ private static final boolean LOCAL_LOGD = Config.LOGD || WifiLayer.LOGV;
+ private static final String TAG = "SettingsWifiEnabler";
+
+ private final Context mContext;
+ private final WifiManager mWifiManager;
+ private final CheckBoxPreference mWifiCheckBoxPref;
+ private final CharSequence mOriginalSummary;
+
+ private final IntentFilter mWifiStateFilter;
+ private final BroadcastReceiver mWifiStateReceiver = new BroadcastReceiver() {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
+ handleWifiStateChanged(
+ intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WIFI_STATE_UNKNOWN),
+ intent.getIntExtra(WifiManager.EXTRA_PREVIOUS_WIFI_STATE,
+ WIFI_STATE_UNKNOWN));
+ } else if (intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
+ handleNetworkStateChanged(
+ (NetworkInfo) intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO));
+ }
+ }
+ };
+
+ public WifiEnabler(Context context, WifiManager wifiManager,
+ CheckBoxPreference wifiCheckBoxPreference) {
+ mContext = context;
+ mWifiCheckBoxPref = wifiCheckBoxPreference;
+ mWifiManager = wifiManager;
+
+ mOriginalSummary = wifiCheckBoxPreference.getSummary();
+ wifiCheckBoxPreference.setPersistent(false);
+
+ mWifiStateFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
+ mWifiStateFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+ }
+
+ public void resume() {
+ int state = mWifiManager.getWifiState();
+ // This is the widget enabled state, not the preference toggled state
+ mWifiCheckBoxPref.setEnabled(state == WIFI_STATE_ENABLED || state == WIFI_STATE_DISABLED
+ || state == WIFI_STATE_UNKNOWN);
+
+ mContext.registerReceiver(mWifiStateReceiver, mWifiStateFilter);
+ mWifiCheckBoxPref.setOnPreferenceChangeListener(this);
+ }
+
+ public void pause() {
+ mContext.unregisterReceiver(mWifiStateReceiver);
+ mWifiCheckBoxPref.setOnPreferenceChangeListener(null);
+ }
+
+ public boolean onPreferenceChange(Preference preference, Object value) {
+ // Turn on/off Wi-Fi
+ setWifiEnabled((Boolean) value);
+
+ // Don't update UI to opposite state until we're sure
+ return false;
+ }
+
+ private void setWifiEnabled(final boolean enable) {
+ // Disable button
+ mWifiCheckBoxPref.setEnabled(false);
+
+ if (!mWifiManager.setWifiEnabled(enable)) {
+ mWifiCheckBoxPref.setSummary(enable ? R.string.error_starting : R.string.error_stopping);
+ }
+ }
+
+ private void handleWifiStateChanged(int wifiState, int previousWifiState) {
+
+ if (LOCAL_LOGD) {
+ Log.d(TAG, "Received wifi state changed from "
+ + getHumanReadableWifiState(previousWifiState) + " to "
+ + getHumanReadableWifiState(wifiState));
+ }
+
+ if (wifiState == WIFI_STATE_DISABLED || wifiState == WIFI_STATE_ENABLED) {
+ mWifiCheckBoxPref.setChecked(wifiState == WIFI_STATE_ENABLED);
+ mWifiCheckBoxPref
+ .setSummary(wifiState == WIFI_STATE_DISABLED ? mOriginalSummary : null);
+
+ mWifiCheckBoxPref.setEnabled(isEnabledByDependency());
+
+ } else if (wifiState == WIFI_STATE_DISABLING || wifiState == WIFI_STATE_ENABLING) {
+ mWifiCheckBoxPref.setSummary(wifiState == WIFI_STATE_ENABLING ? R.string.wifi_starting
+ : R.string.wifi_stopping);
+
+ } else if (wifiState == WIFI_STATE_UNKNOWN) {
+ int message = R.string.wifi_error;
+ if (previousWifiState == WIFI_STATE_ENABLING) message = R.string.error_starting;
+ else if (previousWifiState == WIFI_STATE_DISABLING) message = R.string.error_stopping;
+
+ mWifiCheckBoxPref.setChecked(false);
+ mWifiCheckBoxPref.setSummary(message);
+ mWifiCheckBoxPref.setEnabled(true);
+ }
+ }
+
+ private void handleNetworkStateChanged(NetworkInfo networkInfo) {
+
+ if (LOCAL_LOGD) {
+ Log.d(TAG, "Received network state changed to " + networkInfo);
+ }
+
+ if (mWifiManager.isWifiEnabled()) {
+ String summary = WifiStatus.getStatus(mContext,
+ mWifiManager.getConnectionInfo().getSSID(), networkInfo.getDetailedState());
+ mWifiCheckBoxPref.setSummary(summary);
+ }
+ }
+
+ private boolean isEnabledByDependency() {
+ Preference dep = getDependencyPreference();
+ if (dep == null) {
+ return true;
+ }
+
+ return !dep.shouldDisableDependents();
+ }
+
+ private Preference getDependencyPreference() {
+ String depKey = mWifiCheckBoxPref.getDependency();
+ if (TextUtils.isEmpty(depKey)) {
+ return null;
+ }
+
+ return mWifiCheckBoxPref.getPreferenceManager().findPreference(depKey);
+ }
+
+ private static String getHumanReadableWifiState(int wifiState) {
+ switch (wifiState) {
+ case WIFI_STATE_DISABLED:
+ return "Disabled";
+ case WIFI_STATE_DISABLING:
+ return "Disabling";
+ case WIFI_STATE_ENABLED:
+ return "Enabled";
+ case WIFI_STATE_ENABLING:
+ return "Enabling";
+ case WIFI_STATE_UNKNOWN:
+ return "Unknown";
+ default:
+ return "Some other state!";
+ }
+ }
+}
diff --git a/src/com/android/settings/wifi/WifiLayer.java b/src/com/android/settings/wifi/WifiLayer.java
new file mode 100644
index 0000000..b0857d2
--- /dev/null
+++ b/src/com/android/settings/wifi/WifiLayer.java
@@ -0,0 +1,1302 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.wifi;
+
+import static android.net.wifi.WifiManager.WIFI_STATE_DISABLED;
+import static android.net.wifi.WifiManager.WIFI_STATE_ENABLED;
+
+import com.android.settings.R;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.NetworkInfo;
+import android.net.NetworkInfo.DetailedState;
+import android.net.NetworkInfo.State;
+import android.net.wifi.ScanResult;
+import android.net.wifi.SupplicantState;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.Handler;
+import android.os.Message;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.Config;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * Helper class for abstracting Wi-Fi.
+ * <p>
+ * Client must call {@link #onCreate()}, {@link #onCreatedCallback()},
+ * {@link #onPause()}, {@link #onResume()}.
+ */
+public class WifiLayer {
+
+ private static final String TAG = "SettingsWifiLayer";
+ static final boolean LOGV = false || Config.LOGV;
+
+ //============================
+ // Other member variables
+ //============================
+
+ private Context mContext;
+ private Callback mCallback;
+
+ static final int MESSAGE_ATTEMPT_SCAN = 1;
+ private Handler mHandler = new MyHandler();
+
+ //============================
+ // Wifi member variables
+ //============================
+
+ private WifiManager mWifiManager;
+ private IntentFilter mIntentFilter;
+ private List<AccessPointState> mApScanList = new ArrayList<AccessPointState>();
+ private List<AccessPointState> mApOtherList = new ArrayList<AccessPointState>();
+ private AccessPointState mCurrentPrimaryAp;
+
+ /** The last access point that we were authenticating with. */
+ private AccessPointState mLastAuthenticatingAp;
+
+ /** The delay between scans when we're continually scanning. */
+ private static final int CONTINUOUS_SCAN_DELAY_MS = 6000;
+ /** On failure, the maximum retries for scanning. */
+ private static final int SCAN_MAX_RETRY = 5;
+ /** On failure, the delay between each scan retry. */
+ private static final int SCAN_RETRY_DELAY_MS = 1000;
+ /** On failure, the number of retries so far. */
+ private int mScanRetryCount = 0;
+ /**
+ * Whether we're currently obtaining an address. Continuous scanning will be
+ * disabled in this state.
+ */
+ private boolean mIsObtainingAddress;
+
+ /**
+ * See {@link android.provider.Settings.Secure#WIFI_NUM_OPEN_NETWORKS_KEPT}.
+ */
+ private int WIFI_NUM_OPEN_NETWORKS_KEPT;
+ /**
+ * Once the highest priority exceeds this value, all networks will be
+ * wrapped around starting at 0. This is so another client of the Wi-Fi
+ * API can have access points that aren't managed by us. (If the other
+ * client wants lower-priority access points than ours, it can use negative
+ * priority.)
+ */
+ private static final int HIGHEST_PRIORITY_MAX_VALUE = 99999;
+ /**
+ * Never access directly, only the related methods should.
+ */
+ private int mNextHighestPriority;
+
+ /**
+ * This is used to track when the user wants to connect to a specific AP. We
+ * disable all other APs, set this to true, and let wpa_supplicant connect.
+ * Once we get a network state change, we re-enable the rest of them.
+ */
+ private boolean mReenableApsOnNetworkStateChange = false;
+
+ /**
+ * The current supplicant state, as broadcasted.
+ */
+ private SupplicantState mCurrentSupplicantState;
+
+ //============================
+ // Inner classes
+ //============================
+
+ interface Callback {
+ void onError(int messageResId);
+
+ /**
+ * Called when an AP is added or removed.
+ *
+ * @param ap The AP.
+ * @param added {@code true} if added, {@code false} if removed.
+ */
+ void onAccessPointSetChanged(AccessPointState ap, boolean added);
+
+ /**
+ * Called when the scanning status changes.
+ *
+ * @param started {@code true} if the scanning just started,
+ * {@code false} if it just ended.
+ */
+ void onScanningStatusChanged(boolean started);
+
+ /**
+ * Called when the access points should be enabled or disabled. This is
+ * called from both wpa_supplicant being connected/disconnected and Wi-Fi
+ * being enabled/disabled.
+ *
+ * @param enabled {@code true} if they should be enabled, {@code false}
+ * if they should be disabled.
+ */
+ void onAccessPointsStateChanged(boolean enabled);
+
+ /**
+ * Called when there is trouble authenticating and the retry-password
+ * dialog should be shown.
+ *
+ * @param ap The access point.
+ */
+ void onRetryPassword(AccessPointState ap);
+ }
+
+ private BroadcastReceiver mReceiver = new BroadcastReceiver() {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
+ handleNetworkStateChanged(
+ (NetworkInfo) intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO),
+ intent.getStringExtra(WifiManager.EXTRA_BSSID));
+ } else if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
+ handleScanResultsAvailable();
+ } else if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) {
+ handleSupplicantConnectionChanged(
+ intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false));
+ } else if (action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) {
+ handleSupplicantStateChanged(
+ (SupplicantState) intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE),
+ intent.hasExtra(WifiManager.EXTRA_SUPPLICANT_ERROR),
+ intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, 0));
+ } else if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
+ handleWifiStateChanged(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
+ WifiManager.WIFI_STATE_UNKNOWN));
+ } else if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) {
+ handleSignalChanged(intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, 0));
+ } else if (action.equals(WifiManager.NETWORK_IDS_CHANGED_ACTION)) {
+ handleNetworkIdsChanged();
+ }
+ }
+ };
+
+ /**
+ * If using this class, make sure to call the callbacks of this class, such
+ * as {@link #onCreate()}, {@link #onCreatedCallback()},
+ * {@link #onPause()}, {@link #onResume()}.
+ *
+ * @param context The context.
+ * @param callback The interface that will be invoked when events from this
+ * class are generated.
+ */
+ public WifiLayer(Context context, Callback callback) {
+ mContext = context;
+ mCallback = callback;
+ }
+
+ //============================
+ // Lifecycle
+ //============================
+
+ /**
+ * The client MUST call this.
+ * <p>
+ * This shouldn't have any dependency on the callback.
+ */
+ public void onCreate() {
+ mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
+
+ mIntentFilter = new IntentFilter();
+ mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+ mIntentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
+ mIntentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
+ mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
+ mIntentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
+ mIntentFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
+ mIntentFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
+
+ WIFI_NUM_OPEN_NETWORKS_KEPT = Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.WIFI_NUM_OPEN_NETWORKS_KEPT, 10);
+ }
+
+ /**
+ * The client MUST call this.
+ * <p>
+ * Callback is ready, this can do whatever it wants with it.
+ */
+ public void onCreatedCallback() {
+ if (isWifiEnabled()) {
+ refreshAll(false);
+ }
+ }
+
+ /**
+ * The client MUST call this.
+ *
+ * @see android.app.Activity#onResume
+ */
+ public void onResume() {
+ mContext.registerReceiver(mReceiver, mIntentFilter);
+
+ if (isWifiEnabled()) {
+ // Kick start the continual scan
+ queueContinuousScan();
+ }
+ }
+
+ /**
+ * The client MUST call this.
+ *
+ * @see android.app.Activity#onPause
+ */
+ public void onPause() {
+ mContext.unregisterReceiver(mReceiver);
+
+ attemptReenableAllAps();
+
+ removeFutureScans();
+ }
+
+ //============================
+ // "Public" API
+ //============================
+
+ /**
+ * Returns an AccessPointState instance (that we track locally in WifiLayer)
+ * for the given state. First, we check if we track the given instance. If
+ * not, we find an equal AccessPointState instance that we track.
+ *
+ * @param state An AccessPointState instance that does not necessarily have
+ * to be one that this WifiLayer class tracks. For example, it
+ * could be the result of unparceling.
+ * @return An AccessPointState instance that this WifiLayer class tracks.
+ */
+ public AccessPointState getWifiLayerApInstance(AccessPointState state) {
+ synchronized (this) {
+
+ if (hasApInstanceLocked(state)) {
+ return state;
+ }
+
+ return findApLocked(state.networkId, state.bssid, state.ssid, state.security);
+ }
+ }
+
+ /**
+ * Connects to the network, and creates the Wi-Fi API config if necessary.
+ *
+ * @param state The state of the network to connect to. This MUST be an
+ * instance that was given to you by this class. If you
+ * constructed the instance yourself (for example, after
+ * unparceling it), you should use
+ * {@link #getWifiLayerApInstance(AccessPointState)}.
+ * @return Whether the operation was successful.
+ */
+ public boolean connectToNetwork(AccessPointState state) {
+ if (LOGV) {
+ Log.v(TAG, "Connecting to " + state);
+ }
+
+ // Need WifiConfiguration for the AP
+ WifiConfiguration config = findConfiguredNetwork(state);
+
+ if (LOGV) {
+ Log.v(TAG, " Found configured network " + config);
+ }
+
+ if (config == null) {
+ /*
+ * Connecting for the first time, need to create it. We will enable
+ * and save it below (when we set priority).
+ */
+ config = addConfiguration(state, 0);
+
+ if (config == null) {
+ Log.e(TAG, "Config is still null, even after attempting to add it.");
+ error(R.string.error_connecting);
+ return false;
+ }
+
+ /*
+ * We could reload the configured networks, but instead just
+ * shortcut and add this state to our list in memory.
+ */
+ ensureTrackingState(state);
+ } else {
+ // Make sure the configuration has the latest from the state
+ state.updateWifiConfiguration(config);
+ }
+
+ // Enable this network before we save to storage
+ if (!managerEnableNetwork(state, false)) {
+ Log.e(TAG, "Could not enable network ID " + state.networkId);
+ error(R.string.error_connecting);
+ return false;
+ }
+
+ /*
+ * Give it highest priority, this could cause a network ID change, so do
+ * it after any modifications to the network we're connecting to
+ */
+ setHighestPriorityStateAndSave(state, config);
+
+ /*
+ * We force supplicant to connect to this network by disabling the
+ * others. We do this AFTER we save above so this disabled flag isn't
+ * persisted.
+ */
+ mReenableApsOnNetworkStateChange = true;
+ if (!managerEnableNetwork(state, true)) {
+ Log.e(TAG, "Could not enable network ID " + state.networkId);
+ error(R.string.error_connecting);
+ return false;
+ }
+
+ if (LOGV) {
+ Log.v(TAG, " Enabled network " + state.networkId);
+ }
+
+ if (mCurrentSupplicantState == SupplicantState.DISCONNECTED ||
+ mCurrentSupplicantState == SupplicantState.SCANNING) {
+ mWifiManager.reconnect();
+ }
+
+ // Check for too many configured open networks
+ if (!state.hasSecurity()) {
+ checkForExcessOpenNetworks();
+ }
+
+ return true;
+ }
+
+ /**
+ * Saves a network, and creates the Wi-Fi API config if necessary.
+ *
+ * @param state The state of the network to save. If you constructed the
+ * instance yourself (for example, after unparceling it), you
+ * should use {@link #getWifiLayerApInstance(AccessPointState)}.
+ * @return Whether the operation was successful.
+ */
+ public boolean saveNetwork(AccessPointState state) {
+ WifiConfiguration config = findConfiguredNetwork(state);
+
+ if (config == null) {
+ // if the user is adding a new network, assume that it is hidden
+ state.setHiddenSsid(true);
+
+ config = addConfiguration(state, ADD_CONFIGURATION_ENABLE);
+
+ if (config == null) {
+ Log.e(TAG, "Could not save configuration, call to addConfiguration failed.");
+ error(R.string.error_saving);
+ return false;
+ }
+
+ } else {
+ state.updateWifiConfiguration(config);
+ if (mWifiManager.updateNetwork(config) == -1) {
+ Log.e(TAG, "Could not update configuration, call to WifiManager failed.");
+ error(R.string.error_saving);
+ return false;
+ }
+ }
+
+ // Successfully added network, go ahead and persist
+ if (!managerSaveConfiguration()) {
+ Log.e(TAG, "Could not save configuration, call to WifiManager failed.");
+ error(R.string.error_saving);
+ return false;
+ }
+
+ /*
+ * We could reload the configured networks, but instead just shortcut
+ * and add this state to our list in memory
+ */
+ ensureTrackingState(state);
+
+ return true;
+ }
+
+ /**
+ * Forgets a network.
+ *
+ * @param state The state of the network to forget. If you constructed the
+ * instance yourself (for example, after unparceling it), you
+ * should use {@link #getWifiLayerApInstance(AccessPointState)}.
+ * @return Whether the operation was succesful.
+ */
+ public boolean forgetNetwork(AccessPointState state) {
+ if (!state.configured) {
+ Log.w(TAG, "Inconsistent state: Forgetting a network that is not configured.");
+ return true;
+ }
+
+ int oldNetworkId = state.networkId;
+ state.forget();
+
+ if (!state.seen) {
+ // If it is not seen, it should be removed from the UI
+ removeApFromUi(state);
+ }
+
+ synchronized (this) {
+ mApOtherList.remove(state);
+ // It should not be removed from the scan list, since if it was
+ // there that means it's still seen
+ }
+
+ if (!mWifiManager.removeNetwork(oldNetworkId)) {
+ Log.e(TAG, "Removing network " + state.ssid + " (network ID " + oldNetworkId +
+ ") failed.");
+ return false;
+ }
+
+ if (!managerSaveConfiguration()) {
+ error(R.string.error_saving);
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * This ensures this class is tracking the given state. This means it is in
+ * our list of access points, either in the scanned list or in the
+ * remembered list.
+ *
+ * @param state The state that will be checked for tracking, and if not
+ * tracking will be added to the remembered list in memory.
+ */
+ private void ensureTrackingState(AccessPointState state) {
+ synchronized (this) {
+ if (hasApInstanceLocked(state)) {
+ return;
+ }
+
+ mApOtherList.add(state);
+ }
+ }
+
+ /**
+ * Attempts to scan networks. This has a retry mechanism.
+ */
+ public void attemptScan() {
+
+ // Remove any future scans since we're scanning right now
+ removeFutureScans();
+
+ if (!mWifiManager.isWifiEnabled()) return;
+
+ if (!mWifiManager.startScan()) {
+ postAttemptScan();
+ } else {
+ mScanRetryCount = 0;
+ }
+ }
+
+ private void queueContinuousScan() {
+ mHandler.removeMessages(MESSAGE_ATTEMPT_SCAN);
+
+ if (!mIsObtainingAddress) {
+ // Don't do continuous scan while in obtaining IP state
+ mHandler.sendEmptyMessageDelayed(MESSAGE_ATTEMPT_SCAN, CONTINUOUS_SCAN_DELAY_MS);
+ }
+ }
+
+ private void removeFutureScans() {
+ mHandler.removeMessages(MESSAGE_ATTEMPT_SCAN);
+ }
+
+ public boolean isWifiEnabled() {
+ return mWifiManager.isWifiEnabled();
+ }
+
+ public void error(int messageResId) {
+ Log.e(TAG, mContext.getResources().getString(messageResId));
+
+ if (mCallback != null) {
+ mCallback.onError(messageResId);
+ }
+ }
+
+ //============================
+ // Wifi logic
+ //============================
+
+ private void refreshAll(boolean attemptScan) {
+ loadConfiguredAccessPoints();
+ refreshStatus();
+
+ if (attemptScan) {
+ attemptScan();
+ }
+ }
+
+ private void postAttemptScan() {
+ onScanningStarted();
+
+ if (++mScanRetryCount < SCAN_MAX_RETRY) {
+ // Just in case, remove previous ones first
+ removeFutureScans();
+ mHandler.sendEmptyMessageDelayed(MESSAGE_ATTEMPT_SCAN, SCAN_RETRY_DELAY_MS);
+ } else {
+ // Show an error once we run out of attempts
+ error(R.string.error_scanning);
+ onScanningEnded();
+ }
+ }
+
+ private void onScanningStarted() {
+ if (mCallback != null) {
+ mCallback.onScanningStatusChanged(true);
+ }
+ }
+
+ private void onScanningEnded() {
+ queueContinuousScan();
+
+ if (mCallback != null) {
+ mCallback.onScanningStatusChanged(false);
+ }
+ }
+
+ private void clearApLists() {
+ List<AccessPointState> accessPoints = new ArrayList<AccessPointState>();
+
+ synchronized(this) {
+ // Clear the logic's list of access points
+ accessPoints.addAll(mApScanList);
+ accessPoints.addAll(mApOtherList);
+ mApScanList.clear();
+ mApOtherList.clear();
+ }
+
+ for (int i = accessPoints.size() - 1; i >= 0; i--) {
+ removeApFromUi(accessPoints.get(i));
+ }
+ }
+
+ private boolean managerSaveConfiguration() {
+ boolean retValue = mWifiManager.saveConfiguration();
+
+ /*
+ * We need to assume the network IDs have changed, so handle this. Note:
+ * we also have a receiver on the broadcast intent in case another wifi
+ * framework client caused the change. In this case, we will handle the
+ * possible network ID change twice (but it's not too costly).
+ */
+ handleNetworkIdsChanged();
+
+ return retValue;
+ }
+
+ private boolean managerEnableNetwork(AccessPointState state, boolean disableOthers) {
+ if (!mWifiManager.enableNetwork(state.networkId, disableOthers)) {
+ return false;
+ }
+
+ // Enabling was successful, make sure the state is not disabled
+ state.setDisabled(false);
+
+ return true;
+ }
+
+ private static final int ADD_CONFIGURATION_ENABLE = 1;
+ private static final int ADD_CONFIGURATION_SAVE = 2;
+ private WifiConfiguration addConfiguration(AccessPointState state, int flags) {
+ // Create and add
+ WifiConfiguration config = new WifiConfiguration();
+
+ state.updateWifiConfiguration(config);
+
+ final int networkId = mWifiManager.addNetwork(config);
+ if (networkId == -1) {
+ return null;
+ }
+
+ state.setNetworkId(networkId);
+ state.setConfigured(true);
+
+ // If we should, then enable it, since it comes disabled by default
+ if ((flags & ADD_CONFIGURATION_ENABLE) != 0
+ && !managerEnableNetwork(state, false)) {
+ return null;
+ }
+
+ // If we should, then save it
+ if ((flags & ADD_CONFIGURATION_SAVE) != 0 && !managerSaveConfiguration()) {
+ return null;
+ }
+
+ if (mCallback != null) {
+ mCallback.onAccessPointSetChanged(state, true);
+ }
+
+ return config;
+ }
+
+ private WifiConfiguration findConfiguredNetwork(AccessPointState state) {
+ final List<WifiConfiguration> wifiConfigs = getConfiguredNetworks();
+
+ for (int i = wifiConfigs.size() - 1; i >= 0; i--) {
+ final WifiConfiguration wifiConfig = wifiConfigs.get(i);
+ if (state.matchesWifiConfiguration(wifiConfig) >= AccessPointState.MATCH_WEAK) {
+ return wifiConfig;
+ }
+ }
+
+ return null;
+ }
+
+ private List<WifiConfiguration> getConfiguredNetworks() {
+ final List<WifiConfiguration> wifiConfigs = mWifiManager.getConfiguredNetworks();
+ return wifiConfigs;
+ }
+
+ /**
+ * Must call while holding the lock for the list, which is usually the
+ * WifiLayer instance.
+ */
+ private static AccessPointState findApLocked(List<AccessPointState> list, int networkId,
+ String bssid, String ssid, String security) {
+ AccessPointState ap;
+ for (int i = list.size() - 1; i >= 0; i--) {
+ ap = list.get(i);
+ if (ap.matches(networkId, bssid, ssid, security) >= AccessPointState.MATCH_WEAK) {
+ return ap;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Must call while holding the lock for the lists, which is usually this
+ * WifiLayer instance.
+ */
+ private AccessPointState findApLocked(int networkId, String bssid, String ssid,
+ String security) {
+ AccessPointState ap = findApLocked(mApScanList, networkId, bssid, ssid, security);
+ if (ap == null) {
+ ap = findApLocked(mApOtherList, networkId, bssid, ssid, security);
+ }
+ return ap;
+ }
+
+ /**
+ * Returns whether we have the exact instance of the access point state
+ * given. This is useful in cases where an AccessPointState has been
+ * parceled by the client and the client is attempting to use it to
+ * connect/forget/save.
+ * <p>
+ * Must call while holding the lock for the lists, which is usually this
+ * WifiLayer instance.
+ */
+ private boolean hasApInstanceLocked(AccessPointState state) {
+
+ for (int i = mApScanList.size() - 1; i >= 0; i--) {
+ if (mApScanList.get(i) == state) {
+ return true;
+ }
+ }
+
+ for (int i = mApOtherList.size() - 1; i >= 0; i--) {
+ if (mApOtherList.get(i) == state) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private void loadConfiguredAccessPoints() {
+ final List<WifiConfiguration> configs = getConfiguredNetworks();
+
+ for (int i = configs.size() - 1; i >= 0; i--) {
+ final WifiConfiguration config = configs.get(i);
+
+ AccessPointState ap;
+ synchronized(this) {
+ ap = findApLocked(config.networkId, config.BSSID, config.SSID,
+ AccessPointState.getWifiConfigurationSecurity(config));
+
+ if (ap != null) {
+ // We already know about this one
+ continue;
+ }
+
+ ap = new AccessPointState(mContext);
+ ap.updateFromWifiConfiguration(config);
+ if (LOGV) Log.v(TAG, "Created " + ap + " in loadConfiguredAccessPoints");
+ mApOtherList.add(ap);
+ }
+
+ // Make sure our next highest priority is greater than this
+ checkNextHighestPriority(ap.priority);
+
+ if (mCallback != null) {
+ mCallback.onAccessPointSetChanged(ap, true);
+ }
+ }
+ }
+
+ private AccessPointState getCurrentAp() {
+ final WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
+
+ String ssid = wifiInfo.getSSID();
+ if (ssid != null) {
+ /*
+ * We pass null for security since we have a network ID (i.e., it's
+ * not a wildcard), and rely on it matching.
+ */
+ return findApLocked(wifiInfo.getNetworkId(), wifiInfo.getBSSID(), ssid, null);
+ } else {
+ return null;
+ }
+ }
+
+ private void setPrimaryAp(AccessPointState ap) {
+ synchronized (this) {
+ // Unset other
+ if (mCurrentPrimaryAp != null) {
+ mCurrentPrimaryAp.setPrimary(false);
+ }
+
+ mCurrentPrimaryAp = ap;
+ }
+
+ if (ap != null) {
+ ap.setPrimary(true);
+ }
+ }
+
+ private void attemptReenableAllAps() {
+ if (mReenableApsOnNetworkStateChange) {
+ mReenableApsOnNetworkStateChange = false;
+ enableAllAps();
+ }
+ }
+
+ private void enableAllAps() {
+ synchronized(this) {
+ if (LOGV) {
+ Log.v(TAG, " Enabling all APs");
+ }
+
+ enableApsLocked(mApOtherList);
+ enableApsLocked(mApScanList);
+ }
+ }
+
+ private void enableApsLocked(List<AccessPointState> apList) {
+ for (int i = apList.size() - 1; i >= 0; i--) {
+ AccessPointState state = apList.get(i);
+ int networkId = state.networkId;
+ if (networkId != AccessPointState.NETWORK_ID_NOT_SET &&
+ networkId != AccessPointState.NETWORK_ID_ANY) {
+ managerEnableNetwork(state, false);
+ }
+ }
+ }
+
+ private void removeApFromUi(AccessPointState ap) {
+ if (mCallback != null) {
+ mCallback.onAccessPointSetChanged(ap, false);
+ }
+ }
+
+ /**
+ * Sets the access point state to the highest priority.
+ * <p>
+ * If you have a list of configured networks from WifiManager, you probably
+ * shouldn't call this until you're done traversing the list.
+ *
+ * @param state The state to set as the highest priority.
+ * @param reusableConfiguration An optional WifiConfiguration that will be
+ * given to the WifiManager as updated data for the network ID.
+ * This will be filled with the new priority.
+ * @return Whether the operation was successful.
+ */
+ private boolean setHighestPriorityStateAndSave(AccessPointState state,
+ WifiConfiguration reusableConfiguration) {
+
+ if (!isConsideredForHighestPriority(state)) {
+ Log.e(TAG,
+ "Could not set highest priority on state because state is not being considered.");
+ return false;
+ }
+
+ if (reusableConfiguration == null) {
+ reusableConfiguration = new WifiConfiguration();
+ }
+
+ int oldPriority = reusableConfiguration.priority;
+ reusableConfiguration.priority = getNextHighestPriority();
+ reusableConfiguration.networkId = state.networkId;
+
+ if (mWifiManager.updateNetwork(reusableConfiguration) == -1) {
+ // Rollback priority
+ reusableConfiguration.priority = oldPriority;
+ Log.e(TAG,
+ "Could not set highest priority on state because updating the supplicant network failed.");
+ return false;
+ }
+
+ if (!managerSaveConfiguration()) {
+ reusableConfiguration.priority = oldPriority;
+ Log.e(TAG,
+ "Could not set highest priority on state because saving config failed.");
+ return false;
+ }
+
+ state.priority = reusableConfiguration.priority;
+
+ if (LOGV) {
+ Log.v(TAG, " Set highest priority to "
+ + state.priority + " from " + oldPriority);
+ }
+
+ return true;
+ }
+
+ /**
+ * Makes sure the next highest priority is larger than the given priority.
+ */
+ private void checkNextHighestPriority(int priority) {
+ if (priority > HIGHEST_PRIORITY_MAX_VALUE || priority < 0) {
+ // This is a priority that we aren't managing
+ return;
+ }
+
+ if (mNextHighestPriority <= priority) {
+ mNextHighestPriority = priority + 1;
+ }
+ }
+
+ /**
+ * Checks if there are too many open networks, and removes the excess ones.
+ */
+ private void checkForExcessOpenNetworks() {
+ synchronized(this) {
+ ArrayList<AccessPointState> allAps = getApsSortedByPriorityLocked();
+
+ // Walk from highest to lowest priority
+ int openConfiguredCount = 0;
+ for (int i = allAps.size() - 1; i >= 0; i--) {
+ AccessPointState state = allAps.get(i);
+ if (state.configured && !state.hasSecurity()) {
+ openConfiguredCount++;
+ if (openConfiguredCount > WIFI_NUM_OPEN_NETWORKS_KEPT) {
+ // Remove this network
+ forgetNetwork(state);
+ }
+ }
+ }
+ }
+ }
+
+ private boolean isConsideredForHighestPriority(AccessPointState state) {
+ return state.configured && state.networkId != AccessPointState.NETWORK_ID_ANY &&
+ state.networkId != AccessPointState.NETWORK_ID_NOT_SET;
+ }
+
+ /**
+ * Gets the next highest priority. If this value is larger than the max,
+ * shift all the priorities so the lowest starts at 0.
+ * <p>
+ * Only
+ * {@link #setHighestPriorityStateAndSave(AccessPointState, WifiConfiguration)}
+ * should call this.
+ *
+ * @return The next highest priority to use.
+ */
+ private int getNextHighestPriority() {
+ if (mNextHighestPriority > HIGHEST_PRIORITY_MAX_VALUE) {
+ shiftPriorities();
+ }
+
+ return mNextHighestPriority++;
+ }
+
+ /**
+ * Shift all the priorities so the lowest starts at 0.
+ *
+ * @return Whether the operation was successful.
+ */
+ private boolean shiftPriorities() {
+ synchronized(this) {
+
+ ArrayList<AccessPointState> allAps = getApsSortedByPriorityLocked();
+
+ // Re-usable WifiConfiguration for setting priority
+ WifiConfiguration updatePriorityConfig = new WifiConfiguration();
+
+ // Set new priorities
+ mNextHighestPriority = 0;
+ int size = allAps.size();
+ for (int i = 0; i < size; i++) {
+ AccessPointState state = allAps.get(i);
+
+ if (!isConsideredForHighestPriority(state)) {
+ continue;
+ }
+
+ if (!setHighestPriorityStateAndSave(state, updatePriorityConfig)) {
+ Log.e(TAG,
+ "Could not shift priorities because setting the new priority failed.");
+ return false;
+ }
+ }
+
+ return true;
+ }
+ }
+
+ private ArrayList<AccessPointState> getApsSortedByPriorityLocked() {
+ // Get all of the access points we have
+ ArrayList<AccessPointState> allAps = new ArrayList<AccessPointState>(mApScanList.size()
+ + mApOtherList.size());
+ allAps.addAll(mApScanList);
+ allAps.addAll(mApOtherList);
+
+ // Sort them based on priority
+ Collections.sort(allAps, new Comparator<AccessPointState>() {
+ public int compare(AccessPointState object1, AccessPointState object2) {
+ return object1.priority - object2.priority;
+ }
+ });
+
+ return allAps;
+ }
+
+ //============================
+ // Status related
+ //============================
+
+ private void refreshStatus() {
+ refreshStatus(null, null);
+ }
+
+ private void refreshStatus(AccessPointState ap, NetworkInfo.DetailedState detailedState) {
+ final WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
+ if (detailedState == null) {
+ detailedState = WifiInfo.getDetailedStateOf(wifiInfo.getSupplicantState());
+ }
+
+ if (ap == null && WifiStatus.isLiveConnection(detailedState)) {
+ /*
+ * We pass null for security since we have a network ID (i.e., it's
+ * not a wildcard), and rely on it matching.
+ */
+ ap = findApLocked(wifiInfo.getNetworkId(), wifiInfo.getBSSID(), wifiInfo
+ .getSSID(), null);
+ }
+
+ if (ap != null) {
+ ap.blockRefresh();
+
+ // Let the AP get the latest info from the WifiInfo
+ ap.updateFromWifiInfo(wifiInfo, detailedState);
+
+ // The detailed state from the Intent has more states than the WifiInfo's detailed
+ // state can have (for example, DHCP completion). Set the status using
+ // the Intent's detailed state.
+ ap.setStatus(detailedState);
+ ap.unblockRefresh();
+ }
+ }
+
+ //============================
+ // Wifi callbacks
+ //============================
+
+ private void handleNetworkStateChanged(NetworkInfo info, String bssid) {
+ final AccessPointState ap = getCurrentAp();
+ NetworkInfo.DetailedState detailedState = info.getDetailedState();
+
+ if (LOGV) {
+ Log.v(TAG, "State change received " + info.toString() + ", or "
+ + detailedState + " on " + bssid + " matched to " + ap);
+ }
+
+ handleDisablingScanWhileObtainingAddress(detailedState);
+
+ // This will update the AP with its new info
+ refreshStatus(ap, detailedState);
+
+ boolean isDisconnected = info.getState().equals(State.DISCONNECTED);
+ if (ap != null && info.isConnectedOrConnecting()) {
+ setPrimaryAp(ap);
+
+ if (LOGV) {
+ Log.v(TAG, " Updated " + ap + " to be primary");
+ }
+
+ } else if (isDisconnected) {
+
+ /*
+ * When we drop off a network (for example, the router is powered
+ * down when we were connected), we received a DISCONNECT event
+ * without a BSSID. We should not have a primary AP anymore.
+ */
+ setPrimaryAp(null);
+
+ if (LOGV) {
+ Log.v(TAG, " Cleared primary");
+ }
+
+ } else if (detailedState.equals(DetailedState.FAILED)) {
+
+ /*
+ * Doh, failed for whatever reason. Unset the primary AP, but set
+ * failed status on the AP that failed.
+ */
+ setPrimaryAp(null);
+ ap.setStatus(DetailedState.FAILED);
+
+ // Bring up error dialog
+ error(R.string.wifi_generic_connection_error);
+
+ } else if (LOGV) {
+ Log.v(TAG, " Did not update any AP to primary, could have updated "
+ + ap + " but we aren't connected or connecting");
+ }
+
+ if ((ap != null) && (info.isConnected()
+ || (detailedState == DetailedState.OBTAINING_IPADDR))) {
+ /*
+ * Sometimes the scan results do not contain the AP even though it's
+ * clearly connected. This may be because we do passive background
+ * scanning that isn't as 'strong' as active scanning, so even
+ * though a network is nearby, it won't be seen by the passive
+ * scanning. If we are connected (or obtaining IP) then we know it
+ * is seen.
+ */
+ ap.setSeen(true);
+ }
+
+ attemptReenableAllAps();
+ }
+
+ private void handleDisablingScanWhileObtainingAddress(DetailedState detailedState) {
+
+ if (detailedState == DetailedState.OBTAINING_IPADDR) {
+ mIsObtainingAddress = true;
+
+ // We will not scan while obtaining an IP address
+ removeFutureScans();
+
+ } else {
+ mIsObtainingAddress = false;
+
+ // Start continuous scan
+ queueContinuousScan();
+ }
+ }
+
+ private void handleScanResultsAvailable() {
+ synchronized(this) {
+ // In the end, we'll moved the ones no longer seen into the mApOtherList
+ List<AccessPointState> oldScanList = mApScanList;
+ List<AccessPointState> newScanList =
+ new ArrayList<AccessPointState>(oldScanList.size());
+
+ List<ScanResult> list = mWifiManager.getScanResults();
+ if (list != null) {
+ for (int i = list.size() - 1; i >= 0; i--) {
+ final ScanResult scanResult = list.get(i);
+
+ if (LOGV) {
+// Log.v(TAG, " " + scanResult);
+ }
+
+ if (scanResult == null) {
+ continue;
+ }
+
+ /*
+ * Ignore adhoc, enterprise-secured, or hidden networks.
+ * Hidden networks show up with empty SSID.
+ */
+ if (AccessPointState.isAdhoc(scanResult)
+ || AccessPointState.isEnterprise(scanResult)
+ || TextUtils.isEmpty(scanResult.SSID)) {
+ continue;
+ }
+
+ final String ssid = AccessPointState.convertToQuotedString(scanResult.SSID);
+ String security = AccessPointState.getScanResultSecurity(scanResult);
+
+ // See if this AP is part of a group of APs (e.g., any large
+ // wifi network has many APs, we'll only show one) that we've
+ // seen in this scan
+ AccessPointState ap = findApLocked(newScanList, AccessPointState.NETWORK_ID_ANY,
+ AccessPointState.BSSID_ANY, ssid, security);
+
+ // Yup, we've seen this network.
+ if (ap != null) {
+ // Use the better signal
+ if (WifiManager.compareSignalLevel(scanResult.level, ap.signal) > 0) {
+ ap.setSignal(scanResult.level);
+ }
+
+ if (LOGV) {
+// Log.v(TAG, " Already seen, continuing..");
+ }
+
+ continue;
+ }
+
+ // Find the AP in either our old scan list, or our non-seen
+ // configured networks list
+ ap = findApLocked(AccessPointState.NETWORK_ID_ANY, AccessPointState.BSSID_ANY,
+ ssid, security);
+
+ if (ap != null) {
+ // Remove the AP from both (no harm if one doesn't contain it)
+ oldScanList.remove(ap);
+ mApOtherList.remove(ap);
+ } else {
+ ap = new AccessPointState(mContext);
+// if (LOGV) Log.v(TAG, "Created " + ap);
+ }
+
+ // Give it the latest state
+ ap.updateFromScanResult(scanResult);
+
+ if (mCallback != null) {
+ mCallback.onAccessPointSetChanged(ap, true);
+ }
+
+ newScanList.add(ap);
+ }
+ }
+
+ // oldScanList contains the ones no longer seen
+ List<AccessPointState> otherList = mApOtherList;
+ for (int i = oldScanList.size() - 1; i >= 0; i--) {
+ final AccessPointState ap = oldScanList.get(i);
+
+ if (ap.configured) {
+
+ // Keep it around, since it is configured
+ ap.setSeen(false);
+ otherList.add(ap);
+
+ } else {
+
+ // Remove it since it is not configured and not seen
+ removeApFromUi(ap);
+ }
+ }
+
+ mApScanList = newScanList;
+ }
+
+ onScanningEnded();
+ }
+
+ private void handleSupplicantConnectionChanged(boolean connected) {
+ if (mCallback != null) {
+ mCallback.onAccessPointsStateChanged(connected);
+ }
+
+ if (connected) {
+ refreshAll(true);
+ }
+ }
+
+ private void handleWifiStateChanged(int wifiState) {
+
+ if (wifiState == WIFI_STATE_ENABLED) {
+ loadConfiguredAccessPoints();
+ attemptScan();
+
+ } else if (wifiState == WIFI_STATE_DISABLED) {
+ removeFutureScans();
+ if (LOGV) Log.v(TAG, "Clearing AP lists because wifi is disabled");
+ clearApLists();
+ }
+
+ if (mCallback != null) {
+ mCallback.onAccessPointsStateChanged(wifiState == WIFI_STATE_ENABLED);
+ }
+ }
+
+ private void handleSignalChanged(int rssi) {
+
+ if (mCurrentPrimaryAp != null) {
+ mCurrentPrimaryAp.setSignal(rssi);
+ }
+ }
+
+ private void handleSupplicantStateChanged(SupplicantState state, boolean hasError, int error) {
+ mCurrentSupplicantState = state;
+
+ if (SupplicantState.FOUR_WAY_HANDSHAKE.equals(state)) {
+ mLastAuthenticatingAp = getCurrentAp();
+ }
+
+ if (hasError) {
+ handleSupplicantStateError(error);
+ }
+ }
+
+ private void handleSupplicantStateError(int supplicantError) {
+ if (supplicantError == WifiManager.ERROR_AUTHENTICATING) {
+ if (mCallback != null) {
+ if (mLastAuthenticatingAp != null) {
+ mCallback.onRetryPassword(mLastAuthenticatingAp);
+ }
+ }
+ }
+ }
+
+ private void handleNetworkIdsChanged() {
+ synchronized (this) {
+ final List<WifiConfiguration> configs = getConfiguredNetworks();
+
+ for (int i = configs.size() - 1; i >= 0; i--) {
+ final WifiConfiguration config = configs.get(i);
+
+ AccessPointState ap;
+ // Since network IDs have changed, we can't use it to find our previous AP state
+ ap = findApLocked(AccessPointState.NETWORK_ID_ANY, config.BSSID, config.SSID,
+ AccessPointState.getWifiConfigurationSecurity(config));
+
+ if (ap == null) {
+ continue;
+ }
+
+ ap.setNetworkId(config.networkId);
+ }
+ }
+ }
+
+ private class MyHandler extends Handler {
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MESSAGE_ATTEMPT_SCAN:
+ attemptScan();
+ break;
+ }
+ }
+ }
+
+}
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
new file mode 100644
index 0000000..d2683c0
--- /dev/null
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -0,0 +1,438 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.wifi;
+
+import com.android.settings.ProgressCategory;
+import com.android.settings.R;
+
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.net.wifi.WifiManager;
+import android.os.Bundle;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceScreen;
+import android.preference.CheckBoxPreference;
+import android.provider.Settings;
+import android.util.Log;
+import android.view.ContextMenu;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ContextMenu.ContextMenuInfo;
+import android.widget.AdapterView;
+import android.widget.Toast;
+import android.widget.AdapterView.AdapterContextMenuInfo;
+
+import java.util.Set;
+import java.util.WeakHashMap;
+
+/**
+ * Settings screen for WiFi. This will be launched from the main system settings.
+ */
+public class WifiSettings extends PreferenceActivity implements WifiLayer.Callback,
+ DialogInterface.OnDismissListener {
+
+ private static final String TAG = "WifiSettings";
+
+ //============================
+ // Preference/activity member variables
+ //============================
+
+ private static final String INSTANCE_KEY_DIALOG_BUNDLE =
+ "com.android.settings.wifi.WifiSettings:dialogBundle";
+ /*
+ * We don't use Activity's dialog management because AlertDialog isn't fully
+ * able to change many of its features after it's been created, and the
+ * dialog management only creates once.
+ */
+ private Dialog mDialog;
+
+ private static final String KEY_ADD_OTHER_NETWORK = "add_other_network";
+
+ private static final int CONTEXT_MENU_ID_CONNECT = Menu.FIRST;
+ private static final int CONTEXT_MENU_ID_FORGET = Menu.FIRST + 1;
+ private static final int CONTEXT_MENU_ID_CHANGE_PASSWORD = Menu.FIRST + 2;
+
+ private static final int MENU_ID_SCAN = Menu.FIRST;
+ private static final int MENU_ID_ADVANCED = Menu.FIRST + 1;
+
+ private static final String KEY_WIFI_ENABLED = "wifi_enabled";
+ private static final String KEY_OPEN_NETWORK_NOTIFICATIONS_ENABLED =
+ "open_network_notifications_enabled";
+ private static final String KEY_ACCESS_POINTS = "access_points";
+
+ private ProgressCategory mApCategory;
+ private CheckBoxPreference mWifiEnabled;
+ private WifiEnabler mWifiEnabler;
+ private CheckBoxPreference mOpenNetworkNotificationsEnabled;
+ private Preference mAddOtherNetwork;
+
+ private WeakHashMap<AccessPointState, AccessPointPreference> mAps;
+
+ //============================
+ // Wifi member variables
+ //============================
+
+ private WifiLayer mWifiLayer;
+
+ //============================
+ // Activity lifecycle
+ //============================
+
+ public WifiSettings() {
+ mAps = new WeakHashMap<AccessPointState, AccessPointPreference>();
+ mWifiLayer = new WifiLayer(this, this);
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ onCreatePreferences();
+ mWifiLayer.onCreate();
+
+ onCreatedWifi();
+ mWifiLayer.onCreatedCallback();
+ }
+
+ /**
+ * Shouldn't have any dependency on the wifi layer.
+ */
+ private void onCreatePreferences() {
+ addPreferencesFromResource(R.xml.wifi_settings);
+
+ final PreferenceScreen preferenceScreen = getPreferenceScreen();
+
+ mApCategory = (ProgressCategory) preferenceScreen.findPreference(KEY_ACCESS_POINTS);
+ // We don't want the ordering to be the order preferences are added,
+ // instead we want*:
+ // 1) preferred, visible APs
+ // 2) visible APs
+ // 3) preferred, APs out of range
+ // * this ordering logic is in AccessPointPreference's compareTo
+ mApCategory.setOrderingAsAdded(false);
+
+ mWifiEnabled = (CheckBoxPreference) preferenceScreen.findPreference(KEY_WIFI_ENABLED);
+ mWifiEnabler = new WifiEnabler(this, (WifiManager) getSystemService(WIFI_SERVICE),
+ mWifiEnabled);
+
+ mOpenNetworkNotificationsEnabled = (CheckBoxPreference) preferenceScreen
+ .findPreference(KEY_OPEN_NETWORK_NOTIFICATIONS_ENABLED);
+ mOpenNetworkNotificationsEnabled.setChecked(Settings.Secure.getInt(getContentResolver(),
+ Settings.Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, 0) == 1);
+
+ mAddOtherNetwork = preferenceScreen.findPreference(KEY_ADD_OTHER_NETWORK);
+
+ registerForContextMenu(getListView());
+ }
+
+ private void onCreatedWifi() {
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ mWifiLayer.onResume();
+ mWifiEnabler.resume();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ mWifiLayer.onPause();
+ mWifiEnabler.pause();
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+
+ if (mDialog != null) {
+ mDialog.dismiss();
+ }
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ super.onCreateOptionsMenu(menu);
+
+ menu.add(0, MENU_ID_SCAN, 0, R.string.scan_wifi)
+ .setIcon(R.drawable.ic_menu_scan_network);
+
+ menu.add(0, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced)
+ .setIcon(android.R.drawable.ic_menu_manage);
+
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ super.onOptionsItemSelected(item);
+
+ switch (item.getItemId()) {
+
+ case MENU_ID_SCAN:
+ mWifiLayer.attemptScan();
+ return true;
+
+ case MENU_ID_ADVANCED:
+ Intent intent = new Intent(this, AdvancedSettings.class);
+ startActivity(intent);
+ return true;
+
+ default:
+ return false;
+ }
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+
+ if (mDialog != null) {
+ Bundle dialogBundle = mDialog.onSaveInstanceState();
+ outState.putBundle(INSTANCE_KEY_DIALOG_BUNDLE, dialogBundle);
+ }
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Bundle state) {
+ super.onRestoreInstanceState(state);
+
+ Bundle dialogBundle = state.getBundle(INSTANCE_KEY_DIALOG_BUNDLE);
+ if (dialogBundle != null) {
+ mDialog = new AccessPointDialog(this, mWifiLayer);
+ mDialog.onRestoreInstanceState(dialogBundle);
+ showDialog(mDialog);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void onDismiss(DialogInterface dialog) {
+ if (dialog == mDialog) {
+ mDialog = null;
+ }
+ }
+
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
+ super.onCreateContextMenu(menu, v, menuInfo);
+
+ AccessPointState state = getStateFromMenuInfo(menuInfo);
+ if (state == null) {
+ return;
+ }
+
+ menu.setHeaderTitle(state.getHumanReadableSsid());
+
+ if (state.isConnectable()) {
+ menu.add(0, CONTEXT_MENU_ID_CONNECT, 0, R.string.wifi_context_menu_connect);
+ }
+
+ if (state.isForgetable()) {
+ menu.add(0, CONTEXT_MENU_ID_FORGET, 1, R.string.wifi_context_menu_forget);
+
+ if (state.hasPassword()) {
+ menu.add(0, CONTEXT_MENU_ID_CHANGE_PASSWORD, 2,
+ R.string.wifi_context_menu_change_password);
+ }
+ }
+ }
+
+ @Override
+ public boolean onContextItemSelected(MenuItem item) {
+
+ AccessPointState state = getStateFromMenuInfo(item.getMenuInfo());
+ if (state == null) {
+ return false;
+ }
+
+ switch (item.getItemId()) {
+
+ case CONTEXT_MENU_ID_CONNECT:
+ connectToNetwork(state);
+ return true;
+
+ case CONTEXT_MENU_ID_FORGET:
+ mWifiLayer.forgetNetwork(state);
+ return true;
+
+ case CONTEXT_MENU_ID_CHANGE_PASSWORD:
+ showAccessPointDialog(state, AccessPointDialog.MODE_CONFIGURE);
+ return true;
+
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * Decides what needs to happen to connect to a particular access point. If
+ * it is secured and doesn't already have a password, it will bring up a
+ * password box. Otherwise it will just connect.
+ */
+ private void connectToNetwork(AccessPointState state) {
+ if (state.hasSecurity() && !state.hasPassword()) {
+ showAccessPointDialog(state, AccessPointDialog.MODE_INFO);
+ } else {
+ mWifiLayer.connectToNetwork(state);
+ }
+ }
+
+ private AccessPointState getStateFromMenuInfo(ContextMenuInfo menuInfo) {
+ if ((menuInfo == null) || !(menuInfo instanceof AdapterContextMenuInfo)) {
+ return null;
+ }
+
+ AdapterContextMenuInfo adapterMenuInfo = (AdapterContextMenuInfo) menuInfo;
+ Preference pref = (Preference) getPreferenceScreen().getRootAdapter().getItem(
+ adapterMenuInfo.position);
+ if (pref == null || !(pref instanceof AccessPointPreference)) {
+ return null;
+ }
+
+ return ((AccessPointPreference) pref).getAccessPointState();
+ }
+
+ //============================
+ // Preference callbacks
+ //============================
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+ super.onPreferenceTreeClick(preferenceScreen, preference);
+
+ if (preference == mAddOtherNetwork) {
+ showAddOtherNetworkDialog();
+ } else if (preference == mOpenNetworkNotificationsEnabled) {
+ Settings.Secure.putInt(getContentResolver(),
+ Settings.Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
+ mOpenNetworkNotificationsEnabled.isChecked() ? 1 : 0);
+ } else if (preference instanceof AccessPointPreference) {
+ AccessPointState state = ((AccessPointPreference) preference).getAccessPointState();
+ showAccessPointDialog(state, AccessPointDialog.MODE_INFO);
+ }
+
+ return false;
+ }
+
+ //============================
+ // Wifi-related
+ //============================
+
+ public WifiLayer getWifiLayer() {
+ return mWifiLayer;
+ }
+
+ private void showAddOtherNetworkDialog() {
+ AccessPointDialog dialog = new AccessPointDialog(this, mWifiLayer);
+ dialog.setState(new AccessPointState(this));
+ dialog.setMode(AccessPointDialog.MODE_CONFIGURE);
+ dialog.setTitle(R.string.wifi_add_other_network);
+ dialog.setAutoSecurityAllowed(false);
+ showDialog(dialog);
+ }
+
+ public void showAccessPointDialog(AccessPointState state, int mode) {
+ AccessPointDialog dialog = new AccessPointDialog(this, mWifiLayer);
+ dialog.setMode(mode);
+ dialog.setState(state);
+ showDialog(dialog);
+ }
+
+ private void showDialog(Dialog dialog) {
+ // Have only one dialog open at a time
+ if (mDialog != null) {
+ mDialog.dismiss();
+ }
+
+ mDialog = dialog;
+ dialog.setOnDismissListener(this);
+ if (dialog != null) {
+ dialog.show();
+ }
+ }
+
+ //============================
+ // Wifi callbacks
+ //============================
+
+ public void onError(int messageResId) {
+ Toast.makeText(this, messageResId, Toast.LENGTH_LONG).show();
+ }
+
+ public void onScanningStatusChanged(boolean started) {
+ mApCategory.setProgress(started);
+ }
+
+ public void onAccessPointSetChanged(AccessPointState ap, boolean added) {
+
+ AccessPointPreference pref = mAps.get(ap);
+
+ if (WifiLayer.LOGV) {
+ Log.v(TAG, "onAccessPointSetChanged with " + ap + " and "
+ + (added ? "added" : "removed") + ", found pref " + pref);
+ }
+
+ if (added) {
+
+ if (pref == null) {
+ pref = new AccessPointPreference(this, ap);
+ mAps.put(ap, pref);
+ } else {
+ pref.setEnabled(true);
+ }
+
+ mApCategory.addPreference(pref);
+
+ } else {
+
+ mAps.remove(ap);
+
+ if (pref != null) {
+ mApCategory.removePreference(pref);
+ }
+
+ }
+ }
+
+ public void onAccessPointsStateChanged(boolean enabled) {
+ if (enabled) {
+ mApCategory.setEnabled(true);
+ } else {
+ mApCategory.removeAll();
+ mAps.clear();
+ }
+
+ mAddOtherNetwork.setEnabled(enabled);
+ }
+
+ public void onRetryPassword(AccessPointState ap) {
+
+ if ((mDialog != null) && mDialog.isShowing()) {
+ // If we're already showing a dialog, ignore this request
+ return;
+ }
+
+ showAccessPointDialog(ap, AccessPointDialog.MODE_RETRY_PASSWORD);
+ }
+
+}
diff --git a/src/com/android/settings/wifi/WifiStatus.java b/src/com/android/settings/wifi/WifiStatus.java
new file mode 100644
index 0000000..d4b6431
--- /dev/null
+++ b/src/com/android/settings/wifi/WifiStatus.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.wifi;
+
+import com.android.settings.R;
+
+import android.content.Context;
+import android.net.NetworkInfo;
+import android.net.wifi.WifiInfo;
+import android.text.TextUtils;
+
+public class WifiStatus {
+
+ // e.g., "Connecting"
+ public static String sScanning;
+ public static String sConnecting;
+ public static String sAuthenticating;
+ public static String sObtainingIp;
+ public static String sConnected;
+ public static String sDisconnecting;
+ public static String sDisconnected;
+ public static String sFailed;
+
+ // e.g., "Connecting to %1$s"
+ public static String sScanningFragment;
+ public static String sConnectingFragment;
+ public static String sAuthenticatingFragment;
+ public static String sObtainingIpFragment;
+ public static String sConnectedFragment;
+ public static String sDisconnectingFragment;
+ public static String sDisconnectedFragment;
+ public static String sFailedFragment;
+
+ private static void fillStrings(Context context) {
+ sScanning = context.getString(R.string.status_scanning);
+ sConnecting = context.getString(R.string.status_connecting);
+ sAuthenticating = context.getString(R.string.status_authenticating);
+ sObtainingIp = context.getString(R.string.status_obtaining_ip);
+ sConnected = context.getString(R.string.status_connected);
+ sDisconnecting = context.getString(R.string.status_disconnecting);
+ sDisconnected = context.getString(R.string.status_disconnected);
+ sFailed = context.getString(R.string.status_failed);
+
+ sScanningFragment = context.getString(R.string.fragment_status_scanning);
+ sConnectingFragment = context.getString(R.string.fragment_status_connecting);
+ sAuthenticatingFragment = context.getString(R.string.fragment_status_authenticating);
+ sObtainingIpFragment = context.getString(R.string.fragment_status_obtaining_ip);
+ sConnectedFragment = context.getString(R.string.fragment_status_connected);
+ sDisconnectingFragment = context.getString(R.string.fragment_status_disconnecting);
+ sDisconnectedFragment = context.getString(R.string.fragment_status_disconnected);
+ sFailedFragment = context.getString(R.string.fragment_status_failed);
+ }
+
+ public static String getStatus(Context context, String ssid,
+ NetworkInfo.DetailedState detailedState) {
+
+ if (!TextUtils.isEmpty(ssid) && isLiveConnection(detailedState)) {
+ return getPrintableFragment(context, detailedState, ssid);
+ } else {
+ return getPrintable(context, detailedState);
+ }
+ }
+
+ public static boolean isLiveConnection(NetworkInfo.DetailedState detailedState) {
+ return detailedState != NetworkInfo.DetailedState.DISCONNECTED
+ && detailedState != NetworkInfo.DetailedState.FAILED
+ && detailedState != NetworkInfo.DetailedState.IDLE
+ && detailedState != NetworkInfo.DetailedState.SCANNING;
+ }
+
+ public static String getPrintable(Context context,
+ NetworkInfo.DetailedState detailedState) {
+
+ if (sScanning == null) {
+ fillStrings(context);
+ }
+
+ switch (detailedState) {
+ case AUTHENTICATING:
+ return sAuthenticating;
+ case CONNECTED:
+ return sConnected;
+ case CONNECTING:
+ return sConnecting;
+ case DISCONNECTED:
+ return sDisconnected;
+ case DISCONNECTING:
+ return sDisconnecting;
+ case FAILED:
+ return sFailed;
+ case OBTAINING_IPADDR:
+ return sObtainingIp;
+ case SCANNING:
+ return sScanning;
+ default:
+ return null;
+ }
+ }
+
+ public static String getPrintableFragment(Context context,
+ NetworkInfo.DetailedState detailedState, String apName) {
+
+ if (sScanningFragment == null) {
+ fillStrings(context);
+ }
+
+ String fragment = null;
+ switch (detailedState) {
+ case AUTHENTICATING:
+ fragment = sAuthenticatingFragment;
+ break;
+ case CONNECTED:
+ fragment = sConnectedFragment;
+ break;
+ case CONNECTING:
+ fragment = sConnectingFragment;
+ break;
+ case DISCONNECTED:
+ fragment = sDisconnectedFragment;
+ break;
+ case DISCONNECTING:
+ fragment = sDisconnectingFragment;
+ break;
+ case FAILED:
+ fragment = sFailedFragment;
+ break;
+ case OBTAINING_IPADDR:
+ fragment = sObtainingIpFragment;
+ break;
+ case SCANNING:
+ fragment = sScanningFragment;
+ break;
+ }
+
+ return String.format(fragment, apName);
+ }
+
+}
diff --git a/tests/Android.mk b/tests/Android.mk
new file mode 100644
index 0000000..f54aeee
--- /dev/null
+++ b/tests/Android.mk
@@ -0,0 +1,17 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# We only want this apk build for tests.
+LOCAL_MODULE_TAGS := tests
+LOCAL_CERTIFICATE := platform
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+# Include all test java files.
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := SettingsTests
+
+LOCAL_INSTRUMENTATION_FOR := Settings
+
+include $(BUILD_PACKAGE)
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
new file mode 100644
index 0000000..cf2e03c
--- /dev/null
+++ b/tests/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.settings.tests">
+
+ <application>
+ <uses-library android:name="android.test.runner" />
+ </application>
+
+ <instrumentation android:name="SettingsLaunchPerformance"
+ android:targetPackage="com.android.settings"
+ android:label="Settings Launch Performance">
+ </instrumentation>
+
+</manifest>
diff --git a/tests/src/com/android/settings/SettingsLaunchPerformance.java b/tests/src/com/android/settings/SettingsLaunchPerformance.java
new file mode 100644
index 0000000..05154e2
--- /dev/null
+++ b/tests/src/com/android/settings/SettingsLaunchPerformance.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.tests;
+
+import android.app.Activity;
+import android.test.LaunchPerformanceBase;
+import android.os.Bundle;
+
+import java.util.Map;
+
+/**
+ * Instrumentation class for Settings launch performance testing.
+ */
+public class SettingsLaunchPerformance extends LaunchPerformanceBase {
+
+ public static final String LOG_TAG = "SettingsLaunchPerformance";
+
+ public SettingsLaunchPerformance() {
+ super();
+ }
+
+ @Override
+ public void onCreate(Bundle arguments) {
+ super.onCreate(arguments);
+
+ mIntent.setClassName(getTargetContext(), "com.android.settings.Settings");
+ start();
+ }
+
+ /**
+ * Calls LaunchApp and finish.
+ */
+ @Override
+ public void onStart() {
+ super.onStart();
+ LaunchApp();
+ finish(Activity.RESULT_OK, mResults);
+ }
+}