OSDN Git Service

auto import from //branches/cupcake/...@126645
authorThe Android Open Source Project <initial-contribution@android.com>
Fri, 16 Jan 2009 00:12:10 +0000 (16:12 -0800)
committerThe Android Open Source Project <initial-contribution@android.com>
Fri, 16 Jan 2009 00:12:10 +0000 (16:12 -0800)
326 files changed:
api/3.xml
api/current.xml
cmds/runtime/Android.mk
core/java/android/app/ActivityThread.java
core/java/android/app/AlertDialog.java
core/java/android/app/ApplicationThreadNative.java
core/java/android/app/Dialog.java
core/java/android/app/IApplicationThread.java
core/java/android/app/SearchDialog.java
core/java/android/content/AbstractSyncableContentProvider.java [new file with mode: 0644]
core/java/android/content/AbstractTableMerger.java
core/java/android/content/SyncableContentProvider.java
core/java/android/inputmethodservice/IInputMethodWrapper.java
core/java/android/inputmethodservice/InputMethodService.java
core/java/android/inputmethodservice/KeyboardView.java
core/java/android/os/Debug.java
core/java/android/provider/Calendar.java
core/java/android/provider/Gmail.java
core/java/android/provider/MediaStore.java
core/java/android/provider/Settings.java
core/java/android/server/BluetoothA2dpService.java
core/java/android/speech/srec/WaveHeader.java [new file with mode: 0644]
core/java/android/text/format/DateFormat.java
core/java/android/util/DayOfMonthCursor.java
core/java/android/util/Log.java
core/java/android/view/IWindowManager.aidl
core/java/android/view/RawInputEvent.java
core/java/android/view/View.java
core/java/android/view/ViewRoot.java
core/java/android/view/WindowManager.java
core/java/android/view/animation/Animation.java
core/java/android/view/inputmethod/DefaultInputMethod.java
core/java/android/view/inputmethod/InputMethod.java
core/java/android/view/inputmethod/InputMethodManager.java
core/java/android/webkit/MimeTypeMap.java
core/java/android/webkit/WebView.java
core/java/android/webkit/gears/ApacheHttpRequestAndroid.java [new file with mode: 0644]
core/java/android/widget/AbsListView.java
core/java/android/widget/AutoCompleteTextView.java
core/java/android/widget/CursorAdapter.java
core/java/android/widget/Filter.java
core/java/android/widget/Gallery.java
core/java/android/widget/PopupWindow.java
core/java/android/widget/ScrollView.java
core/java/android/widget/TextView.java
core/java/com/android/internal/app/AlertController.java
core/java/com/android/internal/os/HandlerCaller.java
core/java/com/android/internal/view/IInputMethod.aidl
core/java/com/android/internal/view/IInputMethodManager.aidl
core/java/com/google/android/gdata/client/AndroidGDataClient.java
core/jni/Android.mk
core/jni/android_database_SQLiteStatement.cpp
core/jni/android_location_GpsLocationProvider.cpp
core/jni/android_os_Hardware.cpp
core/jni/android_os_Power.cpp
core/jni/android_os_UEventObserver.cpp
core/jni/android_server_BluetoothA2dpService.cpp
core/jni/server/Android.mk
core/jni/server/com_android_server_HardwareService.cpp
core/res/res/anim/input_method_enter.xml
core/res/res/anim/input_method_exit.xml
core/res/res/drawable/btn_code_lock_default_trackball_selected.png [deleted file]
core/res/res/drawable/btn_default_longpress.9.png [deleted file]
core/res/res/drawable/btn_default_small_longpress.9.png [deleted file]
core/res/res/drawable/btn_dialog_disable_focused.png [deleted file]
core/res/res/drawable/btn_dropdown_disabled.9.png [deleted file]
core/res/res/drawable/btn_dropdown_down.9.png [deleted file]
core/res/res/drawable/btn_flicker_minus.png [deleted file]
core/res/res/drawable/btn_flicker_plus.png [deleted file]
core/res/res/drawable/btn_keyboard_key_longpress.9.png [deleted file]
core/res/res/drawable/btn_keyboard_key_longpress_off.9.png [deleted file]
core/res/res/drawable/btn_keyboard_key_longpress_on.9.png [deleted file]
core/res/res/drawable/btn_radio_off_disable.png [deleted file]
core/res/res/drawable/btn_radio_off_disable_focused.png [deleted file]
core/res/res/drawable/btn_radio_off_longpress.png [deleted file]
core/res/res/drawable/btn_radio_on_disable.png [deleted file]
core/res/res/drawable/btn_radio_on_disable_focused.png [deleted file]
core/res/res/drawable/btn_radio_on_longpress.png [deleted file]
core/res/res/drawable/btn_star_big_off_longpress.png [deleted file]
core/res/res/drawable/btn_star_big_on_longpress.png [deleted file]
core/res/res/drawable/btn_white_longpress.9.png [deleted file]
core/res/res/drawable/contextual_menu_bottom_bright.9.png [deleted file]
core/res/res/drawable/contextual_menu_top_dark.9.png [deleted file]
core/res/res/drawable/editbox_dropdown_arrowdown.png [deleted file]
core/res/res/drawable/editbox_dropdown_arrowup.png [deleted file]
core/res/res/drawable/grey_list_separator.9.png [deleted file]
core/res/res/drawable/highlight_disabled_pressed.9.png [deleted file]
core/res/res/drawable/highlight_pressed_dimmed.9.png [deleted file]
core/res/res/drawable/ic_check_mark_dark.png [deleted file]
core/res/res/drawable/ic_check_mark_light.png [deleted file]
core/res/res/drawable/indicator_show_current_selected_dark.png [deleted file]
core/res/res/drawable/lock_asset.png [deleted file]
core/res/res/drawable/panel_picture_frame_bg_disabled.9.png [deleted file]
core/res/res/drawable/pickerbox_divider.png [deleted file]
core/res/res/drawable/popup_divider_horizontal_dark.9.png [deleted file]
core/res/res/drawable/progress_frame.9.png [deleted file]
core/res/res/drawable/progress_inner.9.png [deleted file]
core/res/res/drawable/progress_particle_small.png [deleted file]
core/res/res/drawable/screen_title_background.9.png [deleted file]
core/res/res/drawable/scroll_thumb_horz.9.png [deleted file]
core/res/res/drawable/scroll_thumb_vert.9.png [deleted file]
core/res/res/drawable/scrollbar.9.png [deleted file]
core/res/res/drawable/spinnerbox_background_focus_yellow.9.png [deleted file]
core/res/res/drawable/spinnerbox_background_normal.9.png [deleted file]
core/res/res/drawable/spinnerbox_background_pressed_yellow.9.png [deleted file]
core/res/res/drawable/starting_frame.9.png [deleted file]
core/res/res/drawable/stat_notify_browser.png [deleted file]
core/res/res/drawable/stat_notify_xmpp.png [deleted file]
core/res/res/drawable/status_bar_item_clear_background.9.png [deleted file]
core/res/res/drawable/status_bar_shadow_bar.9.png [deleted file]
core/res/res/drawable/sub_menu_bottom_bright.9.png [deleted file]
core/res/res/drawable/sub_menu_top_dark.9.png [deleted file]
core/res/res/drawable/submenu_arrow_back.png [deleted file]
core/res/res/drawable/submenu_arrow_focus.png [deleted file]
core/res/res/drawable/sym_battery_white.png [deleted file]
core/res/res/drawable/sym_default_number.png [deleted file]
core/res/res/drawable/tab_bottom_shadow.9.png [deleted file]
core/res/res/drawable/tab_selected_highlight.9.png [deleted file]
core/res/res/drawable/tab_unselected_longpress.9.png [deleted file]
core/res/res/drawable/tab_unselected_pressed.9.png [deleted file]
core/res/res/drawable/tab_unselected_selected.9.png [deleted file]
core/res/res/drawable/textfield_expanded_bottom_selected.9.png [deleted file]
core/res/res/drawable/textfield_expanded_bottom_unselected.9.png [deleted file]
core/res/res/drawable/textfield_expanded_center_selected.9.png [deleted file]
core/res/res/drawable/textfield_expanded_center_unselected.9.png [deleted file]
core/res/res/drawable/textfield_expanded_top_selected.9.png [deleted file]
core/res/res/drawable/textfield_expanded_top_unselected.9.png [deleted file]
core/res/res/drawable/zoom_in.png [deleted file]
core/res/res/drawable/zoom_in_pressed.png [deleted file]
core/res/res/drawable/zoom_indicator.9.png [deleted file]
core/res/res/drawable/zoom_indicator_selected.png [deleted file]
core/res/res/drawable/zoom_out.png [deleted file]
core/res/res/drawable/zoom_out_pressed.png [deleted file]
core/res/res/drawable/zoom_track.png [deleted file]
core/res/res/layout/search_bar.xml
core/res/res/raw-ar/loaderror.html [new file with mode: 0644]
core/res/res/raw-ar/nodomain.html [new file with mode: 0644]
core/res/res/raw-cs/loaderror.html [new file with mode: 0644]
core/res/res/raw-cs/nodomain.html [new file with mode: 0644]
core/res/res/raw-da/loaderror.html [new file with mode: 0644]
core/res/res/raw-da/nodomain.html [new file with mode: 0644]
core/res/res/raw-en-rGB/loaderror.html [new file with mode: 0644]
core/res/res/raw-en-rGB/nodomain.html [new file with mode: 0644]
core/res/res/raw-es/loaderror.html [new file with mode: 0644]
core/res/res/raw-es/nodomain.html [new file with mode: 0644]
core/res/res/raw-fi/loaderror.html [new file with mode: 0644]
core/res/res/raw-fi/nodomain.html [new file with mode: 0644]
core/res/res/raw-fr/loaderror.html [new file with mode: 0644]
core/res/res/raw-fr/nodomain.html [new file with mode: 0644]
core/res/res/raw-hu/loaderror.html [new file with mode: 0644]
core/res/res/raw-hu/nodomain.html [new file with mode: 0644]
core/res/res/raw-it/loaderror.html [new file with mode: 0644]
core/res/res/raw-it/nodomain.html [new file with mode: 0644]
core/res/res/raw-iw/loaderror.html [new file with mode: 0644]
core/res/res/raw-iw/nodomain.html [new file with mode: 0644]
core/res/res/raw-ja/loaderror.html [new file with mode: 0644]
core/res/res/raw-ja/nodomain.html [new file with mode: 0644]
core/res/res/raw-ko/loaderror.html [new file with mode: 0644]
core/res/res/raw-ko/nodomain.html [new file with mode: 0644]
core/res/res/raw-nl/loaderror.html [new file with mode: 0644]
core/res/res/raw-nl/nodomain.html [new file with mode: 0644]
core/res/res/raw-pl/loaderror.html [new file with mode: 0644]
core/res/res/raw-pl/nodomain.html [new file with mode: 0644]
core/res/res/raw-pt-rBR/loaderror.html [new file with mode: 0644]
core/res/res/raw-pt-rBR/nodomain.html [new file with mode: 0644]
core/res/res/raw-ru/loaderror.html [new file with mode: 0644]
core/res/res/raw-ru/nodomain.html [new file with mode: 0644]
core/res/res/raw-th/loaderror.html [new file with mode: 0644]
core/res/res/raw-th/nodomain.html [new file with mode: 0644]
core/res/res/raw-tr/loaderror.html [new file with mode: 0644]
core/res/res/raw-tr/nodomain.html [new file with mode: 0644]
core/res/res/raw-zh-rCN/loaderror.html [new file with mode: 0644]
core/res/res/raw-zh-rCN/nodomain.html [new file with mode: 0644]
core/res/res/raw-zh-rTW/loaderror.html [new file with mode: 0644]
core/res/res/raw-zh-rTW/nodomain.html [new file with mode: 0644]
core/res/res/values-cs/arrays.xml [new file with mode: 0644]
core/res/res/values-cs/strings.xml [new file with mode: 0644]
core/res/res/values-de/strings.xml
core/res/res/values-es/arrays.xml [new file with mode: 0644]
core/res/res/values-es/strings.xml [new file with mode: 0644]
core/res/res/values-fr/strings.xml
core/res/res/values-it/strings.xml
core/res/res/values-ja/strings.xml
core/res/res/values-mcc204-cs/strings.xml [new file with mode: 0644]
core/res/res/values-mcc204-de/strings.xml
core/res/res/values-mcc204-es/strings.xml [new file with mode: 0644]
core/res/res/values-mcc204-fr/strings.xml
core/res/res/values-mcc204-it/strings.xml
core/res/res/values-mcc204-ja/strings.xml
core/res/res/values-mcc204-nl/strings.xml [new file with mode: 0644]
core/res/res/values-mcc204-pl/strings.xml [new file with mode: 0644]
core/res/res/values-mcc204-ru/strings.xml [new file with mode: 0644]
core/res/res/values-mcc204-zh-rCN/strings.xml
core/res/res/values-mcc204-zh-rTW/strings.xml [new file with mode: 0644]
core/res/res/values-mcc230-cs/strings.xml [new file with mode: 0644]
core/res/res/values-mcc230-de/strings.xml
core/res/res/values-mcc230-es/strings.xml [new file with mode: 0644]
core/res/res/values-mcc230-fr/strings.xml
core/res/res/values-mcc230-it/strings.xml
core/res/res/values-mcc230-ja/strings.xml
core/res/res/values-mcc230-nl/strings.xml [new file with mode: 0644]
core/res/res/values-mcc230-pl/strings.xml [new file with mode: 0644]
core/res/res/values-mcc230-ru/strings.xml [new file with mode: 0644]
core/res/res/values-mcc230-zh-rCN/strings.xml
core/res/res/values-mcc230-zh-rTW/strings.xml [new file with mode: 0644]
core/res/res/values-mcc232-cs/strings.xml [new file with mode: 0644]
core/res/res/values-mcc232-de/strings.xml
core/res/res/values-mcc232-es/strings.xml [new file with mode: 0644]
core/res/res/values-mcc232-fr/strings.xml
core/res/res/values-mcc232-it/strings.xml
core/res/res/values-mcc232-ja/strings.xml
core/res/res/values-mcc232-nl/strings.xml [new file with mode: 0644]
core/res/res/values-mcc232-pl/strings.xml [new file with mode: 0644]
core/res/res/values-mcc232-ru/strings.xml [new file with mode: 0644]
core/res/res/values-mcc232-zh-rCN/strings.xml
core/res/res/values-mcc232-zh-rTW/strings.xml [new file with mode: 0644]
core/res/res/values-mcc234-cs/strings.xml [new file with mode: 0644]
core/res/res/values-mcc234-de/strings.xml
core/res/res/values-mcc234-es/strings.xml [new file with mode: 0644]
core/res/res/values-mcc234-fr/strings.xml
core/res/res/values-mcc234-it/strings.xml
core/res/res/values-mcc234-ja/strings.xml
core/res/res/values-mcc234-nl/strings.xml [new file with mode: 0644]
core/res/res/values-mcc234-pl/strings.xml [new file with mode: 0644]
core/res/res/values-mcc234-ru/strings.xml [new file with mode: 0644]
core/res/res/values-mcc234-zh-rCN/strings.xml
core/res/res/values-mcc234-zh-rTW/strings.xml [new file with mode: 0644]
core/res/res/values-mcc260-cs/strings.xml [new file with mode: 0644]
core/res/res/values-mcc260-de/strings.xml [new file with mode: 0644]
core/res/res/values-mcc260-es/strings.xml [new file with mode: 0644]
core/res/res/values-mcc260-fr/strings.xml
core/res/res/values-mcc260-it/strings.xml
core/res/res/values-mcc260-ja/strings.xml [new file with mode: 0644]
core/res/res/values-mcc260-nl/strings.xml [new file with mode: 0644]
core/res/res/values-mcc260-pl/strings.xml [new file with mode: 0644]
core/res/res/values-mcc260-ru/strings.xml [new file with mode: 0644]
core/res/res/values-mcc260-zh-rCN/strings.xml
core/res/res/values-mcc260-zh-rTW/strings.xml [new file with mode: 0644]
core/res/res/values-mcc262-cs/strings.xml [new file with mode: 0644]
core/res/res/values-mcc262-de/strings.xml
core/res/res/values-mcc262-es/strings.xml [new file with mode: 0644]
core/res/res/values-mcc262-fr/strings.xml
core/res/res/values-mcc262-it/strings.xml
core/res/res/values-mcc262-ja/strings.xml
core/res/res/values-mcc262-nl/strings.xml [new file with mode: 0644]
core/res/res/values-mcc262-pl/strings.xml [new file with mode: 0644]
core/res/res/values-mcc262-ru/strings.xml [new file with mode: 0644]
core/res/res/values-mcc262-zh-rCN/strings.xml
core/res/res/values-mcc262-zh-rTW/strings.xml [new file with mode: 0644]
core/res/res/values-nl/arrays.xml [new file with mode: 0644]
core/res/res/values-nl/strings.xml [new file with mode: 0644]
core/res/res/values-pl/arrays.xml [new file with mode: 0644]
core/res/res/values-pl/strings.xml [new file with mode: 0644]
core/res/res/values-ru/arrays.xml [new file with mode: 0644]
core/res/res/values-ru/strings.xml [new file with mode: 0644]
core/res/res/values-zh-rCN/strings.xml
core/res/res/values-zh-rTW/arrays.xml [new file with mode: 0644]
core/res/res/values-zh-rTW/strings.xml [new file with mode: 0644]
core/res/res/values/attrs.xml
core/res/res/values/public.xml
core/res/res/values/styles.xml
data/localization/export-to-xlb [new file with mode: 0755]
data/localization/import-from-xtb
data/localization/tc-files [new file with mode: 0644]
data/localization/xlb-merge [new file with mode: 0755]
docs/html/guide/developing/debug-tasks.jd
docs/html/guide/developing/device.jd [new file with mode: 0644]
docs/html/guide/guide_toc.cs
docs/html/guide/topics/resources/available-resources.jd
docs/html/guide/topics/views/menus.jd [new file with mode: 0644]
include/media/PVMediaRecorder.h
include/private/opengles/gl_context.h
include/ui/EventHub.h
include/ui/Overlay.h
include/ui/Surface.h
include/ui/SurfaceComposerClient.h
libs/audioflinger/A2dpAudioInterface.cpp
libs/audioflinger/A2dpAudioInterface.h
libs/audioflinger/Android.mk
libs/audioflinger/AudioDumpInterface.h
libs/audioflinger/AudioFlinger.cpp
libs/audioflinger/AudioFlinger.h
libs/audioflinger/AudioHardwareGeneric.h
libs/audioflinger/AudioHardwareStub.h
libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp
libs/surfaceflinger/LayerBuffer.cpp
libs/surfaceflinger/LayerBuffer.h
libs/surfaceflinger/tests/Android.mk [new file with mode: 0644]
libs/surfaceflinger/tests/overlays/Android.mk [new file with mode: 0644]
libs/surfaceflinger/tests/overlays/overlays.cpp [new file with mode: 0644]
libs/ui/Android.mk
libs/ui/EventHub.cpp
libs/ui/ISurface.cpp
libs/ui/Overlay.cpp
media/sdutils/Android.mk
media/sdutils/sdutil.cpp
opengl/libGLES_CM/Android.mk
opengl/libGLES_CM/gl_wrapper.cpp
opengl/libagl/Android.mk
packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
packages/SubscribedFeedsProvider/src/com/android/providers/subscribedfeeds/SubscribedFeedsProvider.java
services/java/com/android/server/InputMethodManagerService.java
services/java/com/android/server/KeyInputQueue.java
services/java/com/android/server/WifiService.java
services/java/com/android/server/WifiWatchdogService.java
services/java/com/android/server/WindowManagerService.java
services/java/com/android/server/am/ActivityManagerService.java
services/java/com/android/server/status/StatusBarService.java
telephony/java/com/android/internal/telephony/gsm/GSMPhone.java
telephony/java/com/android/internal/telephony/gsm/stk/CommandParamsFactory.java
telephony/java/com/android/internal/telephony/gsm/stk/RilMessageDecoder.java
telephony/java/com/android/internal/telephony/gsm/stk/StkService.java [moved from telephony/java/com/android/internal/telephony/gsm/stk/Service.java with 94% similarity]
tests/CoreTests/android/location/LocationManagerProximityTest.java
tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java
tests/FrameworkTest/tests/src/android/content/AbstractTableMergerTest.java [new file with mode: 0644]
tests/FrameworkTest/tests/src/android/widget/AutoCompleteTextViewPopup.java [new file with mode: 0644]
tests/FrameworkTest/tests/src/com/android/frameworktest/listview/ListSetSelectionTest.java [new file with mode: 0644]
tools/aapt/AaptAssets.cpp
tools/aapt/AaptAssets.h
tools/aapt/Bundle.h
tools/aapt/Command.cpp
tools/aapt/Images.cpp
tools/aapt/Main.cpp
tools/aapt/Resource.cpp
tools/aapt/ResourceTable.cpp
tools/aapt/ResourceTable.h

index e13cfde..9d9ce98 100644 (file)
--- a/api/3.xml
+++ b/api/3.xml
  deprecated="not deprecated"
  visibility="public"
 >
-<parameter name="predicates" type="com.android.internal.util.Predicate...">
+<parameter name="predicates" type="com.android.internal.util.Predicate&lt;android.test.suitebuilder.TestMethod&gt;...">
 </parameter>
 </method>
 <method name="build"
 >
 <parameter name="loader" type="java.lang.ClassLoader">
 </parameter>
-<parameter name="interfaces" type="java.lang.Class...">
+<parameter name="interfaces" type="java.lang.Class&lt;?&gt;...">
 </parameter>
 <exception name="IllegalArgumentException" type="java.lang.IllegalArgumentException">
 </exception>
index 13ca370..f6fa67d 100644 (file)
  visibility="public"
 >
 </field>
+<field name="fillEnabled"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843349"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="fillViewport"
  type="int"
  transient="false"
  visibility="public"
 >
 </field>
+<field name="isScrollContainer"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843348"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="isSticky"
  type="int"
  transient="false"
  deprecated="not deprecated"
  visibility="public"
 >
+<parameter name="flags" type="int">
+</parameter>
 </method>
 <method name="getCurrentInputBinding"
  return="android.view.inputmethod.InputBinding"
 <parameter name="event" type="android.view.KeyEvent">
 </parameter>
 </method>
+<method name="onShowRequested"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="flags" type="int">
+</parameter>
+</method>
 <method name="onStartInput"
  return="void"
  abstract="false"
  deprecated="not deprecated"
  visibility="public"
 >
+<parameter name="flags" type="int">
+</parameter>
 </method>
 <method name="startInput"
  return="void"
  synchronized="false"
  static="true"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 <parameter name="port" type="int">
  deprecated="not deprecated"
  visibility="public"
 >
-<parameter name="predicates" type="com.android.internal.util.Predicate...">
+<parameter name="predicates" type="com.android.internal.util.Predicate&lt;android.test.suitebuilder.TestMethod&gt;...">
 </parameter>
 </method>
 <method name="build"
  visibility="protected"
 >
 </method>
+<method name="onCheckIsTextEditor"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="onCreateContextMenu"
  return="void"
  abstract="false"
  visibility="public"
 >
 </method>
+<method name="mayUseInputMethod"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="flags" type="int">
+</parameter>
+</method>
 <method name="setTitle"
  return="void"
  abstract="false"
  visibility="public"
 >
 </field>
-<field name="FLAG_RESTORED_STATE"
- type="int"
- transient="false"
- volatile="false"
- value="524288"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
 <field name="FLAG_SCALED"
  type="int"
  transient="false"
  visibility="public"
 >
 </field>
+<field name="SOFT_INPUT_IS_FORWARD_NAVIGATION"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="256"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="SOFT_INPUT_MASK_ADJUST"
  type="int"
  transient="false"
  visibility="public"
 >
 </field>
-<field name="SOFT_INPUT_STATE_FIRST_VISIBLE"
+<field name="SOFT_INPUT_STATE_ALWAYS_VISIBLE"
  type="int"
  transient="false"
  volatile="false"
- value="3"
+ value="4"
  static="true"
  final="true"
  deprecated="not deprecated"
  type="int"
  transient="false"
  volatile="false"
- value="4"
+ value="3"
  static="true"
  final="true"
  deprecated="not deprecated"
 <parameter name="parentHeight" type="int">
 </parameter>
 </method>
+<method name="isFillEnabled"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="isInitialized"
  return="boolean"
  abstract="false"
 <parameter name="fillBefore" type="boolean">
 </parameter>
 </method>
+<method name="setFillEnabled"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="fillEnabled" type="boolean">
+</parameter>
+</method>
 <method name="setInterpolator"
  return="void"
  abstract="false"
  deprecated="not deprecated"
  visibility="public"
 >
+<parameter name="flags" type="int">
+</parameter>
 </method>
 <method name="startInput"
  return="void"
  visibility="public"
 >
 </field>
+<field name="SHOW_EXPLICIT"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="1"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 </interface>
 <interface name="InputMethod.SessionCallback"
  abstract="true"
 >
 <parameter name="token" type="android.os.IBinder">
 </parameter>
+<parameter name="flags" type="int">
+</parameter>
 </method>
 <method name="hideSoftInputFromWindow"
  return="void"
 >
 <parameter name="windowToken" type="android.os.IBinder">
 </parameter>
+<parameter name="flags" type="int">
+</parameter>
 </method>
 <method name="isAcceptingText"
  return="boolean"
 <parameter name="view" type="android.view.View">
 </parameter>
 </method>
-<method name="onWindowFocus"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="focusedView" type="android.view.View">
-</parameter>
-<parameter name="softInputMode" type="int">
-</parameter>
-<parameter name="first" type="boolean">
-</parameter>
-<parameter name="windowFlags" type="int">
-</parameter>
-</method>
 <method name="restartInput"
  return="void"
  abstract="false"
 >
 <parameter name="view" type="android.view.View">
 </parameter>
+<parameter name="flags" type="int">
+</parameter>
 </method>
 <method name="updateCursor"
  return="void"
 <parameter name="iconPackage" type="java.lang.String">
 </parameter>
 </method>
+<field name="HIDE_IMPLICIT_ONLY"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="1"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SHOW_IMPLICIT"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="1"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 </class>
 <interface name="InputMethodSession"
  abstract="true"
 <parameter name="defStyle" type="int">
 </parameter>
 </constructor>
+<method name="clearListSelection"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="convertSelectionToString"
  return="java.lang.CharSequence"
  abstract="false"
  visibility="public"
 >
 </method>
+<method name="getListSelection"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="getOnItemClickListener"
  return="android.widget.AdapterView.OnItemClickListener"
  abstract="false"
 <parameter name="hint" type="java.lang.CharSequence">
 </parameter>
 </method>
+<method name="setListSelection"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="position" type="int">
+</parameter>
+</method>
 <method name="setOnItemClickListener"
  return="void"
  abstract="false"
 >
 <parameter name="loader" type="java.lang.ClassLoader">
 </parameter>
-<parameter name="interfaces" type="java.lang.Class...">
+<parameter name="interfaces" type="java.lang.Class&lt;?&gt;...">
 </parameter>
 <exception name="IllegalArgumentException" type="java.lang.IllegalArgumentException">
 </exception>
index 00fa8a2..521eb2b 100644 (file)
@@ -14,7 +14,7 @@ LOCAL_SHARED_LIBRARIES := \
        libcutils \
        libui \
        libsystem_server \
-       libhardware
+       libhardware_legacy
 
 LOCAL_C_INCLUDES := \
        $(JNI_H_INCLUDE)
index 3d448a6..a98e295 100644 (file)
@@ -1072,6 +1072,7 @@ public final class ActivityThread {
         List<Intent> pendingIntents;
 
         boolean startsNotResumed;
+        boolean isForward;
 
         ActivityRecord() {
             parent = null;
@@ -1225,8 +1226,8 @@ public final class ActivityThread {
                 token);
         }
 
-        public final void scheduleResumeActivity(IBinder token) {
-            queueOrSendMessage(H.RESUME_ACTIVITY, token);
+        public final void scheduleResumeActivity(IBinder token, boolean isForward) {
+            queueOrSendMessage(H.RESUME_ACTIVITY, token, isForward ? 1 : 0);
         }
 
         public final void scheduleSendResult(IBinder token, List<ResultInfo> results) {
@@ -1240,7 +1241,7 @@ public final class ActivityThread {
         // activity itself back to the activity manager. (matters more with ipc)
         public final void scheduleLaunchActivity(Intent intent, IBinder token,
                 ActivityInfo info, Bundle state, List<ResultInfo> pendingResults,
-                List<Intent> pendingNewIntents, boolean notResumed) {
+                List<Intent> pendingNewIntents, boolean notResumed, boolean isForward) {
             ActivityRecord r = new ActivityRecord();
 
             r.token = token;
@@ -1252,6 +1253,7 @@ public final class ActivityThread {
             r.pendingIntents = pendingNewIntents;
 
             r.startsNotResumed = notResumed;
+            r.isForward = isForward;
 
             queueOrSendMessage(H.LAUNCH_ACTIVITY, r);
         }
@@ -1604,7 +1606,8 @@ public final class ActivityThread {
                     handleWindowVisibility((IBinder)msg.obj, false);
                     break;
                 case RESUME_ACTIVITY:
-                    handleResumeActivity((IBinder)msg.obj, true);
+                    handleResumeActivity((IBinder)msg.obj, true,
+                            msg.arg1 != 0);
                     break;
                 case SEND_RESULT:
                     handleSendResult((ResultData)msg.obj);
@@ -2167,7 +2170,7 @@ public final class ActivityThread {
         Activity a = performLaunchActivity(r);
 
         if (a != null) {
-            handleResumeActivity(r.token, false);
+            handleResumeActivity(r.token, false, r.isForward);
 
             if (!r.activity.mFinished && r.startsNotResumed) {
                 // The activity manager actually wants this one to start out
@@ -2522,7 +2525,7 @@ public final class ActivityThread {
         return r;
     }
 
-    final void handleResumeActivity(IBinder token, boolean clearHide) {
+    final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward) {
         // If we are getting ready to gc after going to the background, well
         // we are back active so skip it.
         unscheduleGcIdler();
@@ -2537,6 +2540,9 @@ public final class ActivityThread {
                 a.mStartedActivity + ", hideForNow: " + r.hideForNow
                 + ", finished: " + a.mFinished);
 
+            final int forwardBit = isForward ?
+                    WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION : 0;
+            
             // If the window hasn't yet been added to the window manager,
             // and this guy didn't finish itself or start another activity,
             // then go ahead and add the window.
@@ -2548,6 +2554,7 @@ public final class ActivityThread {
                 WindowManager.LayoutParams l = r.window.getAttributes();
                 a.mDecor = decor;
                 l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
+                l.softInputMode |= forwardBit;
                 wm.addView(decor, l);
 
             // If the window has already been added, but during resume
@@ -2567,6 +2574,18 @@ public final class ActivityThread {
                     performConfigurationChanged(r.activity, r.newConfig);
                     r.newConfig = null;
                 }
+                Log.v(TAG, "Resuming " + r + " with isForward=" + isForward);
+                WindowManager.LayoutParams l = r.window.getAttributes();
+                if ((l.softInputMode
+                        & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION)
+                        != forwardBit) {
+                    l.softInputMode = (l.softInputMode
+                            & (~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION))
+                            | forwardBit;
+                    ViewManager wm = a.getWindowManager();
+                    View decor = r.window.getDecorView();
+                    wm.updateViewLayout(decor, l);
+                }
                 r.activity.mDecor.setVisibility(View.VISIBLE);
                 mNumVisibleActivities++;
             }
index a6981a5..f2b89c3 100644 (file)
@@ -24,6 +24,7 @@ import android.os.Bundle;
 import android.os.Message;
 import android.view.KeyEvent;
 import android.view.View;
+import android.view.WindowManager;
 import android.widget.AdapterView;
 import android.widget.Button;
 import android.widget.ListAdapter;
@@ -41,6 +42,15 @@ import com.android.internal.app.AlertController;
  * FrameLayout fl = (FrameLayout) findViewById(R.id.body);
  * fl.add(myView, new LayoutParams(FILL_PARENT, WRAP_CONTENT));
  * </pre>
+ * 
+ * <p>The AlertDialog class takes care of automatically setting
+ * {@link WindowManager.LayoutParams#FLAG_ALT_FOCUSABLE_IM
+ * WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM} for you based on whether
+ * any views in the dialog return true from {@link View#onCheckIsTextEditor()
+ * View.onCheckIsTextEditor()}.  Generally you want this set for a Dialog
+ * without text editors, so that it will be placed on top of the current
+ * input method UI.  You can modify this behavior by forcing the flag to your
+ * desired mode after calling {@link #onCreate}.
  */
 public class AlertDialog extends Dialog implements DialogInterface {
     private AlertController mAlert;
index 6a70329..54237ae 100644 (file)
@@ -97,7 +97,8 @@ public abstract class ApplicationThreadNative extends Binder
         {
             data.enforceInterface(IApplicationThread.descriptor);
             IBinder b = data.readStrongBinder();
-            scheduleResumeActivity(b);
+            boolean isForward = data.readInt() != 0;
+            scheduleResumeActivity(b, isForward);
             return true;
         }
         
@@ -120,7 +121,8 @@ public abstract class ApplicationThreadNative extends Binder
             List<ResultInfo> ri = data.createTypedArrayList(ResultInfo.CREATOR);
             List<Intent> pi = data.createTypedArrayList(Intent.CREATOR);
             boolean notResumed = data.readInt() != 0;
-            scheduleLaunchActivity(intent, b, info, state, ri, pi, notResumed);
+            boolean isForward = data.readInt() != 0;
+            scheduleLaunchActivity(intent, b, info, state, ri, pi, notResumed, isForward);
             return true;
         }
         
@@ -376,11 +378,12 @@ class ApplicationThreadProxy implements IApplicationThread {
         data.recycle();
     }
 
-    public final void scheduleResumeActivity(IBinder token)
+    public final void scheduleResumeActivity(IBinder token, boolean isForward)
             throws RemoteException {
         Parcel data = Parcel.obtain();
         data.writeInterfaceToken(IApplicationThread.descriptor);
         data.writeStrongBinder(token);
+        data.writeInt(isForward ? 1 : 0);
         mRemote.transact(SCHEDULE_RESUME_ACTIVITY_TRANSACTION, data, null,
                 IBinder.FLAG_ONEWAY);
         data.recycle();
@@ -399,7 +402,7 @@ class ApplicationThreadProxy implements IApplicationThread {
 
     public final void scheduleLaunchActivity(Intent intent, IBinder token,
             ActivityInfo info, Bundle state, List<ResultInfo> pendingResults,
-               List<Intent> pendingNewIntents, boolean notResumed)
+               List<Intent> pendingNewIntents, boolean notResumed, boolean isForward)
                throws RemoteException {
         Parcel data = Parcel.obtain();
         data.writeInterfaceToken(IApplicationThread.descriptor);
@@ -410,6 +413,7 @@ class ApplicationThreadProxy implements IApplicationThread {
         data.writeTypedList(pendingResults);
         data.writeTypedList(pendingNewIntents);
         data.writeInt(notResumed ? 1 : 0);
+        data.writeInt(isForward ? 1 : 0);
         mRemote.transact(SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION, data, null,
                 IBinder.FLAG_ONEWAY);
         data.recycle();
index f1d2e65..951b48d 100644 (file)
@@ -48,13 +48,23 @@ import java.lang.ref.WeakReference;
 /**
  * Base class for Dialogs.
  * 
- * Note: Activities provide a facility to manage the creation, saving and
+ * <p>Note: Activities provide a facility to manage the creation, saving and
  * restoring of dialogs. See {@link Activity#onCreateDialog(int)},
  * {@link Activity#onPrepareDialog(int, Dialog)},
  * {@link Activity#showDialog(int)}, and {@link Activity#dismissDialog(int)}. If
  * these methods are used, {@link #getOwnerActivity()} will return the Activity
  * that managed this dialog.
  * 
+ * <p>Often you will want to have a Dialog display on top of the current
+ * input method, because there is no reason for it to accept text.  You can
+ * do this by setting the {@link WindowManager.LayoutParams#FLAG_ALT_FOCUSABLE_IM
+ * WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM} window flag (assuming
+ * your Dialog takes input focus, as it the default) with the following code:
+ * 
+ * <pre>
+ *     getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
+ *             WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
+ * </pre>
  */
 public class Dialog implements DialogInterface, Window.Callback,
         KeyEvent.Callback, OnCreateContextMenuListener {
@@ -209,7 +219,16 @@ public class Dialog implements DialogInterface, Window.Callback,
 
         onStart();
         mDecor = mWindow.getDecorView();
-        mWindowManager.addView(mDecor, mWindow.getAttributes());
+        WindowManager.LayoutParams l = mWindow.getAttributes();
+        if ((l.softInputMode
+                & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) == 0) {
+            WindowManager.LayoutParams nl = new WindowManager.LayoutParams();
+            nl.copyFrom(l);
+            nl.softInputMode |=
+                    WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
+            l = nl;
+        }
+        mWindowManager.addView(mDecor, l);
         mShowing = true;
     }
     
index ecd993a..a351581 100644 (file)
@@ -45,11 +45,11 @@ public interface IApplicationThread extends IInterface {
     void scheduleStopActivity(IBinder token, boolean showWindow,
             int configChanges) throws RemoteException;
     void scheduleWindowVisibility(IBinder token, boolean showWindow) throws RemoteException;
-    void scheduleResumeActivity(IBinder token) throws RemoteException;
+    void scheduleResumeActivity(IBinder token, boolean isForward) throws RemoteException;
     void scheduleSendResult(IBinder token, List<ResultInfo> results) throws RemoteException;
     void scheduleLaunchActivity(Intent intent, IBinder token,
             ActivityInfo info, Bundle state, List<ResultInfo> pendingResults,
-               List<Intent> pendingNewIntents, boolean notResumed)
+               List<Intent> pendingNewIntents, boolean notResumed, boolean isForward)
                throws RemoteException;
     void scheduleRelaunchActivity(IBinder token, List<ResultInfo> pendingResults,
             List<Intent> pendingNewIntents, int configChanges,
index f1c604c..495156e 100644 (file)
@@ -38,6 +38,7 @@ import android.text.Editable;
 import android.text.InputType;
 import android.text.TextUtils;
 import android.text.TextWatcher;
+import android.util.AttributeSet;
 import android.util.Log;
 import android.view.Gravity;
 import android.view.KeyEvent;
@@ -538,7 +539,7 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
             }
             updateWidgetState();
             // Only do suggestions if actually typed by user
-            if (mSuggestionsAdapter.getNonUserQuery()) {
+            if (!mSuggestionsAdapter.getNonUserQuery()) {
                 mPreviousSuggestionQuery = s.toString();
                 mUserQuery = mSearchTextField.getText().toString();
                 mUserQuerySelStart = mSearchTextField.getSelectionStart();
@@ -640,6 +641,12 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
                 if (DBG_LOG_TIMING == 1) {
                     dbgLogTiming("doTextKey()");
                 }
+                // dispatch "typing in the list" first
+                if (mSearchTextField.isPopupShowing() && 
+                        mSearchTextField.getListSelection() != ListView.INVALID_POSITION) {
+                     return onSuggestionsKey(v, keyCode, event);
+                }
+                // otherwise, dispatch an "edit view" key
                 switch (keyCode) {
                 case KeyEvent.KEYCODE_ENTER:
                 case KeyEvent.KEYCODE_DPAD_CENTER:
@@ -649,6 +656,13 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
                         return true;
                     }
                     break;
+                case KeyEvent.KEYCODE_DPAD_DOWN:                    
+                    // capture the EditText state, so we can restore the user entry later
+                    mUserQuery = mSearchTextField.getText().toString();
+                    mUserQuerySelStart = mSearchTextField.getSelectionStart();
+                    mUserQuerySelEnd = mSearchTextField.getSelectionEnd();
+                    // pass through - we're just watching here
+                    break;
                 default:
                     if (event.getAction() == KeyEvent.ACTION_DOWN) {
                         SearchableInfo.ActionKeyInfo actionKey = mSearchable.findActionKey(keyCode);
@@ -668,24 +682,18 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
      * React to the user typing while the suggestions are focused.  First, check for action
      * keys.  If not handled, try refocusing regular characters into the EditText.  In this case,
      * replace the query text (start typing fresh text).
-     * 
-     * TODO:  Move this code into mTextKeyListener, testing for a list entry being hilited
      */
-    /*
-    View.OnKeyListener mSuggestionsKeyListener = new View.OnKeyListener() {
-        public boolean onKey(View v, int keyCode, KeyEvent event) {
-            boolean handled = false;
-            // also guard against possible race conditions (late arrival after dismiss)
-            if (mSearchable != null) {
-                handled = doSuggestionsKey(v, keyCode, event);
-                if (!handled) {
-                    handled = refocusingKeyListener(v, keyCode, event);
-                }
+    private boolean onSuggestionsKey(View v, int keyCode, KeyEvent event) {
+        boolean handled = false;
+        // also guard against possible race conditions (late arrival after dismiss)
+        if (mSearchable != null) {
+            handled = doSuggestionsKey(v, keyCode, event);
+            if (!handled) {
+                handled = refocusingKeyListener(v, keyCode, event);
             }
-            return handled;
         }
-    };
-    */
+        return handled;
+    }
     
     /**
      * Per UI design, we're going to "steer" any typed keystrokes back into the EditText
@@ -821,26 +829,26 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
             
             // First, check for enter or search (both of which we'll treat as a "click")
             if (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_SEARCH) {
-                AdapterView<?> av = (AdapterView<?>) v;
-                int position = av.getSelectedItemPosition();
-                return launchSuggestion(av, position);
+                int position = mSearchTextField.getListSelection();
+                return launchSuggestion(mSuggestionsAdapter, position);
             }
             
-            // Next, check for left/right moves while we'll manually grab and shift focus
+            // Next, check for left/right moves, which we use to "return" the user to the edit view
             if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
-                // give focus to text editor
-                // but don't restore the user's original query
-                mLeaveJammedQueryOnRefocus = true;
-                if (mSearchTextField.requestFocus()) {
-                    mLeaveJammedQueryOnRefocus = false;
-                    if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
-                        mSearchTextField.setSelection(0);
-                    } else {
-                        mSearchTextField.setSelection(mSearchTextField.length());
-                    }
-                    return true;
-                }
-                mLeaveJammedQueryOnRefocus = false;
+                // give "focus" to text editor, but don't restore the user's original query
+                int selPoint = (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) ? 
+                        0 : mSearchTextField.length();
+                mSearchTextField.setSelection(selPoint);
+                mSearchTextField.setListSelection(0);
+                mSearchTextField.clearListSelection();
+                return true;
+            }
+            
+            // Next, check for an "up and out" move
+            if (keyCode == KeyEvent.KEYCODE_DPAD_UP && 0 == mSearchTextField.getListSelection()) {
+                jamSuggestionQuery(false, null, -1);
+                // let ACTV complete the move
+                return false;
             }
             
             // Next, check for an "action key"
@@ -849,11 +857,9 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
                     ((actionKey.mSuggestActionMsg != null) || 
                      (actionKey.mSuggestActionMsgColumn != null))) {
                 //   launch suggestion using action key column
-                ListView lv = (ListView) v;
-                int position = lv.getSelectedItemPosition();
+                int position = mSearchTextField.getListSelection();
                 if (position >= 0) {
-                    CursorAdapter ca = getSuggestionsAdapter(lv);
-                    Cursor c = ca.getCursor();
+                    Cursor c = mSuggestionsAdapter.getCursor();
                     if (c.moveToPosition(position)) {
                         final String actionMsg = getActionKeyMessage(c, actionKey);
                         if (actionMsg != null && (actionMsg.length() > 0)) {
@@ -977,19 +983,6 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
 
     /**
      * Shared code for launching a query from a suggestion.
-     * 
-     * @param av The AdapterView (really a ListView) containing the suggestions
-     * @param position The suggestion we'll be launching from
-     * 
-     * @return Returns true if a successful launch, false if could not (e.g. bad position)
-     */
-    private boolean launchSuggestion(AdapterView<?> av, int position) {
-        CursorAdapter ca = getSuggestionsAdapter(av);
-        return launchSuggestion(ca, position);
-    }
-    
-    /**
-     * Shared code for launching a query from a suggestion.
      * @param ca The cursor adapter containing the suggestions
      * @param position The suggestion we'll be launching from
      * @return true if a successful launch, false if could not (e.g. bad position)
@@ -1116,6 +1109,36 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
     }
         
     /**
+     * Local subclass for AutoCompleteTextView
+     * 
+     * This exists entirely to override the threshold method.  Otherwise we just use the class
+     * as-is.
+     */
+    public static class SearchAutoComplete extends AutoCompleteTextView {
+
+        public SearchAutoComplete(Context context) {
+            super(null);
+        }
+        
+        public SearchAutoComplete(Context context, AttributeSet attrs) {
+            super(context, attrs);
+        }
+
+        public SearchAutoComplete(Context context, AttributeSet attrs, int defStyle) {
+            super(context, attrs, defStyle);
+        }
+        
+        /**
+         * We always return true, so that the effective threshold is "zero".  This allows us
+         * to provide "null" suggestions such as "just show me some recent entries".
+         */
+        @Override
+        public boolean enoughToFilter() {
+            return true;
+        }
+    }
+    
+    /**
      * Support for AutoCompleteTextView-based suggestions
      */
     /**
@@ -1391,7 +1414,7 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
      * Implements OnItemClickListener
      */
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-//        Log.d(LOG_TAG, "onItemClick() position " + position);
+        // Log.d(LOG_TAG, "onItemClick() position " + position);
         launchSuggestion(mSuggestionsAdapter, position);
     }
     
@@ -1399,7 +1422,7 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
      * Implements OnItemSelectedListener
      */
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
-//         Log.d(LOG_TAG, "onItemSelected() position " + position);
+         // Log.d(LOG_TAG, "onItemSelected() position " + position);
          jamSuggestionQuery(true, parent, position);
      }
 
@@ -1407,7 +1430,7 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
       * Implements OnItemSelectedListener
       */
      public void onNothingSelected(AdapterView<?> parent) {
-//         Log.d(LOG_TAG, "onNothingSelected()");
+         // Log.d(LOG_TAG, "onNothingSelected()");
      }
 
     /**
diff --git a/core/java/android/content/AbstractSyncableContentProvider.java b/core/java/android/content/AbstractSyncableContentProvider.java
new file mode 100644 (file)
index 0000000..ce6501c
--- /dev/null
@@ -0,0 +1,601 @@
+package android.content;
+
+import android.database.sqlite.SQLiteOpenHelper;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.Cursor;
+import android.net.Uri;
+import android.accounts.AccountMonitor;
+import android.accounts.AccountMonitorListener;
+import android.provider.SyncConstValue;
+import android.util.Config;
+import android.util.Log;
+import android.os.Bundle;
+import android.text.TextUtils;
+
+import java.util.Collections;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Vector;
+import java.util.ArrayList;
+
+/**
+ * A specialization of the ContentProvider that centralizes functionality
+ * used by ContentProviders that are syncable. It also wraps calls to the ContentProvider
+ * inside of database transactions.
+ *
+ * @hide
+ */
+public abstract class AbstractSyncableContentProvider extends SyncableContentProvider {
+    private static final String TAG = "SyncableContentProvider";
+    protected SQLiteOpenHelper mOpenHelper;
+    protected SQLiteDatabase mDb;
+    private final String mDatabaseName;
+    private final int mDatabaseVersion;
+    private final Uri mContentUri;
+    private AccountMonitor mAccountMonitor;
+
+    /** the account set in the last call to onSyncStart() */
+    private String mSyncingAccount;
+
+    private SyncStateContentProviderHelper mSyncState = null;
+
+    private static final String[] sAccountProjection = new String[] {SyncConstValue._SYNC_ACCOUNT};
+
+    private boolean mIsTemporary;
+
+    private AbstractTableMerger mCurrentMerger = null;
+    private boolean mIsMergeCancelled = false;
+
+    private static final String SYNC_ACCOUNT_WHERE_CLAUSE = SyncConstValue._SYNC_ACCOUNT + "=?";
+
+    protected boolean isTemporary() {
+        return mIsTemporary;
+    }
+
+    /**
+     * Indicates whether or not this ContentProvider contains a full
+     * set of data or just diffs. This knowledge comes in handy when
+     * determining how to incorporate the contents of a temporary
+     * provider into a real provider.
+     */
+    private boolean mContainsDiffs;
+
+    /**
+     * Initializes the AbstractSyncableContentProvider
+     * @param dbName the filename of the database
+     * @param dbVersion the current version of the database schema
+     * @param contentUri The base Uri of the syncable content in this provider
+     */
+    public AbstractSyncableContentProvider(String dbName, int dbVersion, Uri contentUri) {
+        super();
+
+        mDatabaseName = dbName;
+        mDatabaseVersion = dbVersion;
+        mContentUri = contentUri;
+        mIsTemporary = false;
+        setContainsDiffs(false);
+        if (Config.LOGV) {
+            Log.v(TAG, "created SyncableContentProvider " + this);
+        }
+    }
+
+    /**
+     * Close resources that must be closed. You must call this to properly release
+     * the resources used by the AbstractSyncableContentProvider.
+     */
+    public void close() {
+        if (mOpenHelper != null) {
+            mOpenHelper.close();  // OK to call .close() repeatedly.
+        }
+    }
+
+    /**
+     * Override to create your schema and do anything else you need to do with a new database.
+     * This is run inside a transaction (so you don't need to use one).
+     * This method may not use getDatabase(), or call content provider methods, it must only
+     * use the database handle passed to it.
+     */
+    protected void bootstrapDatabase(SQLiteDatabase db) {}
+
+    /**
+     * Override to upgrade your database from an old version to the version you specified.
+     * Don't set the DB version; this will automatically be done after the method returns.
+     * This method may not use getDatabase(), or call content provider methods, it must only
+     * use the database handle passed to it.
+     *
+     * @param oldVersion version of the existing database
+     * @param newVersion current version to upgrade to
+     * @return true if the upgrade was lossless, false if it was lossy
+     */
+    protected abstract boolean upgradeDatabase(SQLiteDatabase db, int oldVersion, int newVersion);
+
+    /**
+     * Override to do anything (like cleanups or checks) you need to do after opening a database.
+     * Does nothing by default.  This is run inside a transaction (so you don't need to use one).
+     * This method may not use getDatabase(), or call content provider methods, it must only
+     * use the database handle passed to it.
+     */
+    protected void onDatabaseOpened(SQLiteDatabase db) {}
+
+    private class DatabaseHelper extends SQLiteOpenHelper {
+        DatabaseHelper(Context context, String name) {
+            // Note: context and name may be null for temp providers
+            super(context, name, null, mDatabaseVersion);
+        }
+
+        @Override
+        public void onCreate(SQLiteDatabase db) {
+            bootstrapDatabase(db);
+            mSyncState.createDatabase(db);
+        }
+
+        @Override
+        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+            if (!upgradeDatabase(db, oldVersion, newVersion)) {
+                mSyncState.discardSyncData(db, null /* all accounts */);
+                getContext().getContentResolver().startSync(mContentUri, new Bundle());
+            }
+        }
+
+        @Override
+        public void onOpen(SQLiteDatabase db) {
+            onDatabaseOpened(db);
+            mSyncState.onDatabaseOpened(db);
+        }
+    }
+
+    @Override
+    public boolean onCreate() {
+        if (isTemporary()) throw new IllegalStateException("onCreate() called for temp provider");
+        mOpenHelper = new AbstractSyncableContentProvider.DatabaseHelper(getContext(), mDatabaseName);
+        mSyncState = new SyncStateContentProviderHelper(mOpenHelper);
+
+        AccountMonitorListener listener = new AccountMonitorListener() {
+            public void onAccountsUpdated(String[] accounts) {
+                // Some providers override onAccountsChanged(); give them a database to work with.
+                mDb = mOpenHelper.getWritableDatabase();
+                onAccountsChanged(accounts);
+                TempProviderSyncAdapter syncAdapter = (TempProviderSyncAdapter)getSyncAdapter();
+                if (syncAdapter != null) {
+                    syncAdapter.onAccountsChanged(accounts);
+                }
+            }
+        };
+        mAccountMonitor = new AccountMonitor(getContext(), listener);
+
+        return true;
+    }
+
+    /**
+     * Get a non-persistent instance of this content provider.
+     * You must call {@link #close} on the returned
+     * SyncableContentProvider when you are done with it.
+     *
+     * @return a non-persistent content provider with the same layout as this
+     * provider.
+     */
+    public AbstractSyncableContentProvider getTemporaryInstance() {
+        AbstractSyncableContentProvider temp;
+        try {
+            temp = getClass().newInstance();
+        } catch (InstantiationException e) {
+            throw new RuntimeException("unable to instantiate class, "
+                    + "this should never happen", e);
+        } catch (IllegalAccessException e) {
+            throw new RuntimeException(
+                    "IllegalAccess while instantiating class, "
+                            + "this should never happen", e);
+        }
+
+        // Note: onCreate() isn't run for the temp provider, and it has no Context.
+        temp.mIsTemporary = true;
+        temp.setContainsDiffs(true);
+        temp.mOpenHelper = temp.new DatabaseHelper(null, null);
+        temp.mSyncState = new SyncStateContentProviderHelper(temp.mOpenHelper);
+        if (!isTemporary()) {
+            mSyncState.copySyncState(
+                    mOpenHelper.getReadableDatabase(),
+                    temp.mOpenHelper.getWritableDatabase(),
+                    getSyncingAccount());
+        }
+        return temp;
+    }
+
+    public SQLiteDatabase getDatabase() {
+       if (mDb == null) mDb = mOpenHelper.getWritableDatabase();
+       return mDb;
+    }
+
+    public boolean getContainsDiffs() {
+        return mContainsDiffs;
+    }
+
+    public void setContainsDiffs(boolean containsDiffs) {
+        if (containsDiffs && !isTemporary()) {
+            throw new IllegalStateException(
+                    "only a temporary provider can contain diffs");
+        }
+        mContainsDiffs = containsDiffs;
+    }
+
+    /**
+     * Each subclass of this class should define a subclass of {@link
+     * android.content.AbstractTableMerger} for each table they wish to merge.  It
+     * should then override this method and return one instance of
+     * each merger, in sequence.  Their {@link
+     * android.content.AbstractTableMerger#merge merge} methods will be called, one at a
+     * time, in the order supplied.
+     *
+     * <p>The default implementation returns an empty list, so that no
+     * merging will occur.
+     * @return A sequence of subclasses of {@link
+     * android.content.AbstractTableMerger}, one for each table that should be merged.
+     */
+    protected Iterable<? extends AbstractTableMerger> getMergers() {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public final int update(final Uri url, final ContentValues values,
+            final String selection, final String[] selectionArgs) {
+        mDb = mOpenHelper.getWritableDatabase();
+        mDb.beginTransaction();
+        try {
+            if (isTemporary() && mSyncState.matches(url)) {
+                int numRows = mSyncState.asContentProvider().update(
+                        url, values, selection, selectionArgs);
+                mDb.setTransactionSuccessful();
+                return numRows;
+            }
+
+            int result = updateInternal(url, values, selection, selectionArgs);
+            mDb.setTransactionSuccessful();
+
+            if (!isTemporary() && result > 0) {
+                getContext().getContentResolver().notifyChange(url, null /* observer */,
+                        changeRequiresLocalSync(url));
+            }
+
+            return result;
+        } finally {
+            mDb.endTransaction();
+        }
+    }
+
+    @Override
+    public final int delete(final Uri url, final String selection,
+            final String[] selectionArgs) {
+        mDb = mOpenHelper.getWritableDatabase();
+        mDb.beginTransaction();
+        try {
+            if (isTemporary() && mSyncState.matches(url)) {
+                int numRows = mSyncState.asContentProvider().delete(url, selection, selectionArgs);
+                mDb.setTransactionSuccessful();
+                return numRows;
+            }
+            int result = deleteInternal(url, selection, selectionArgs);
+            mDb.setTransactionSuccessful();
+            if (!isTemporary() && result > 0) {
+                getContext().getContentResolver().notifyChange(url, null /* observer */,
+                        changeRequiresLocalSync(url));
+            }
+            return result;
+        } finally {
+            mDb.endTransaction();
+        }
+    }
+
+    @Override
+    public final Uri insert(final Uri url, final ContentValues values) {
+        mDb = mOpenHelper.getWritableDatabase();
+        mDb.beginTransaction();
+        try {
+            if (isTemporary() && mSyncState.matches(url)) {
+                Uri result = mSyncState.asContentProvider().insert(url, values);
+                mDb.setTransactionSuccessful();
+                return result;
+            }
+            Uri result = insertInternal(url, values);
+            mDb.setTransactionSuccessful();
+            if (!isTemporary() && result != null) {
+                getContext().getContentResolver().notifyChange(url, null /* observer */,
+                        changeRequiresLocalSync(url));
+            }
+            return result;
+        } finally {
+            mDb.endTransaction();
+        }
+    }
+
+    @Override
+    public final int bulkInsert(final Uri uri, final ContentValues[] values) {
+        int size = values.length;
+        int completed = 0;
+        final boolean isSyncStateUri = mSyncState.matches(uri);
+        mDb = mOpenHelper.getWritableDatabase();
+        mDb.beginTransaction();
+        try {
+            for (int i = 0; i < size; i++) {
+                Uri result;
+                if (isTemporary() && isSyncStateUri) {
+                    result = mSyncState.asContentProvider().insert(uri, values[i]);
+                } else {
+                    result = insertInternal(uri, values[i]);
+                    mDb.yieldIfContended();
+                }
+                if (result != null) {
+                    completed++;
+                }
+            }
+            mDb.setTransactionSuccessful();
+        } finally {
+            mDb.endTransaction();
+        }
+        if (!isTemporary() && completed == size) {
+            getContext().getContentResolver().notifyChange(uri, null /* observer */,
+                    changeRequiresLocalSync(uri));
+        }
+        return completed;
+    }
+
+    /**
+     * Check if changes to this URI can be syncable changes.
+     * @param uri the URI of the resource that was changed
+     * @return true if changes to this URI can be syncable changes, false otherwise
+     */
+    public boolean changeRequiresLocalSync(Uri uri) {
+        return true;
+    }
+
+    @Override
+    public final Cursor query(final Uri url, final String[] projection,
+            final String selection, final String[] selectionArgs,
+            final String sortOrder) {
+        mDb = mOpenHelper.getReadableDatabase();
+        if (isTemporary() && mSyncState.matches(url)) {
+            return mSyncState.asContentProvider().query(
+                    url, projection, selection,  selectionArgs, sortOrder);
+        }
+        return queryInternal(url, projection, selection, selectionArgs, sortOrder);
+    }
+
+    /**
+     * Called right before a sync is started.
+     *
+     * @param context the sync context for the operation
+     * @param account
+     */
+    public void onSyncStart(SyncContext context, String account) {
+        if (TextUtils.isEmpty(account)) {
+            throw new IllegalArgumentException("you passed in an empty account");
+        }
+        mSyncingAccount = account;
+    }
+
+    /**
+     * Called right after a sync is completed
+     *
+     * @param context the sync context for the operation
+     * @param success true if the sync succeeded, false if an error occurred
+     */
+    public void onSyncStop(SyncContext context, boolean success) {
+    }
+
+    /**
+     * The account of the most recent call to onSyncStart()
+     * @return the account
+     */
+    public String getSyncingAccount() {
+        return mSyncingAccount;
+    }
+
+    /**
+     * Merge diffs from a sync source with this content provider.
+     *
+     * @param context the SyncContext within which this merge is taking place
+     * @param diffs A temporary content provider containing diffs from a sync
+     *   source.
+     * @param result a MergeResult that contains information about the merge, including
+     *   a temporary content provider with the same layout as this provider containing
+     * @param syncResult
+     */
+    public void merge(SyncContext context, SyncableContentProvider diffs,
+            TempProviderSyncResult result, SyncResult syncResult) {
+        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        db.beginTransaction();
+        try {
+            synchronized(this) {
+                mIsMergeCancelled = false;
+            }
+            Iterable<? extends AbstractTableMerger> mergers = getMergers();
+            try {
+                for (AbstractTableMerger merger : mergers) {
+                    synchronized(this) {
+                        if (mIsMergeCancelled) break;
+                        mCurrentMerger = merger;
+                    }
+                    merger.merge(context, getSyncingAccount(), diffs, result, syncResult, this);
+                }
+                if (mIsMergeCancelled) return;
+                if (diffs != null) {
+                    mSyncState.copySyncState(
+                        ((AbstractSyncableContentProvider)diffs).mOpenHelper.getReadableDatabase(),
+                        mOpenHelper.getWritableDatabase(),
+                        getSyncingAccount());
+                }
+            } finally {
+                synchronized (this) {
+                    mCurrentMerger = null;
+                }
+            }
+            db.setTransactionSuccessful();
+        } finally {
+            db.endTransaction();
+        }
+    }
+
+
+    /**
+     * Invoked when the active sync has been canceled. Sets the sync state of this provider and
+     * its merger to canceled.
+     */
+    public void onSyncCanceled() {
+        synchronized (this) {
+            mIsMergeCancelled = true;
+            if (mCurrentMerger != null) {
+                mCurrentMerger.onMergeCancelled();
+            }
+        }
+    }
+
+
+    public boolean isMergeCancelled() {
+        return mIsMergeCancelled;
+    }
+
+    /**
+     * Subclasses should override this instead of update(). See update()
+     * for details.
+     *
+     * <p> This method is called within a acquireDbLock()/releaseDbLock() block,
+     * which means a database transaction will be active during the call;
+     */
+    protected abstract int updateInternal(Uri url, ContentValues values,
+            String selection, String[] selectionArgs);
+
+    /**
+     * Subclasses should override this instead of delete(). See delete()
+     * for details.
+     *
+     * <p> This method is called within a acquireDbLock()/releaseDbLock() block,
+     * which means a database transaction will be active during the call;
+     */
+    protected abstract int deleteInternal(Uri url, String selection, String[] selectionArgs);
+
+    /**
+     * Subclasses should override this instead of insert(). See insert()
+     * for details.
+     *
+     * <p> This method is called within a acquireDbLock()/releaseDbLock() block,
+     * which means a database transaction will be active during the call;
+     */
+    protected abstract Uri insertInternal(Uri url, ContentValues values);
+
+    /**
+     * Subclasses should override this instead of query(). See query()
+     * for details.
+     *
+     * <p> This method is *not* called within a acquireDbLock()/releaseDbLock()
+     * block for performance reasons. If an implementation needs atomic access
+     * to the database the lock can be acquired then.
+     */
+    protected abstract Cursor queryInternal(Uri url, String[] projection,
+            String selection, String[] selectionArgs, String sortOrder);
+
+    /**
+     * Make sure that there are no entries for accounts that no longer exist
+     * @param accountsArray the array of currently-existing accounts
+     */
+    protected void onAccountsChanged(String[] accountsArray) {
+        Map<String, Boolean> accounts = new HashMap<String, Boolean>();
+        for (String account : accountsArray) {
+            accounts.put(account, false);
+        }
+        accounts.put(SyncConstValue.NON_SYNCABLE_ACCOUNT, false);
+
+        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        Map<String, String> tableMap = db.getSyncedTables();
+        Vector<String> tables = new Vector<String>();
+        tables.addAll(tableMap.keySet());
+        tables.addAll(tableMap.values());
+
+        db.beginTransaction();
+        try {
+            mSyncState.onAccountsChanged(accountsArray);
+            for (String table : tables) {
+                deleteRowsForRemovedAccounts(accounts, table,
+                        SyncConstValue._SYNC_ACCOUNT);
+            }
+            db.setTransactionSuccessful();
+        } finally {
+            db.endTransaction();
+        }
+    }
+
+    /**
+     * A helper method to delete all rows whose account is not in the accounts
+     * map. The accountColumnName is the name of the column that is expected
+     * to hold the account. If a row has an empty account it is never deleted.
+     *
+     * @param accounts a map of existing accounts
+     * @param table the table to delete from
+     * @param accountColumnName the name of the column that is expected
+     * to hold the account.
+     */
+    protected void deleteRowsForRemovedAccounts(Map<String, Boolean> accounts,
+            String table, String accountColumnName) {
+        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        Cursor c = db.query(table, sAccountProjection, null, null,
+                accountColumnName, null, null);
+        try {
+            while (c.moveToNext()) {
+                String account = c.getString(0);
+                if (TextUtils.isEmpty(account)) {
+                    continue;
+                }
+                if (!accounts.containsKey(account)) {
+                    int numDeleted;
+                    numDeleted = db.delete(table, accountColumnName + "=?", new String[]{account});
+                    if (Config.LOGV) {
+                        Log.v(TAG, "deleted " + numDeleted
+                                + " records from table " + table
+                                + " for account " + account);
+                    }
+                }
+            }
+        } finally {
+            c.close();
+        }
+    }
+
+    /**
+     * Called when the sync system determines that this provider should no longer
+     * contain records for the specified account.
+     */
+    public void wipeAccount(String account) {
+        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        Map<String, String> tableMap = db.getSyncedTables();
+        ArrayList<String> tables = new ArrayList<String>();
+        tables.addAll(tableMap.keySet());
+        tables.addAll(tableMap.values());
+
+        db.beginTransaction();
+
+        try {
+            // remove the SyncState data
+            mSyncState.discardSyncData(db, account);
+
+            // remove the data in the synced tables
+            for (String table : tables) {
+                db.delete(table, SYNC_ACCOUNT_WHERE_CLAUSE, new String[]{account});
+            }
+            db.setTransactionSuccessful();
+        } finally {
+            db.endTransaction();
+        }
+    }
+
+    /**
+     * Retrieves the SyncData bytes for the given account. The byte array returned may be null.
+     */
+    public byte[] readSyncDataBytes(String account) {
+        return mSyncState.readSyncDataBytes(mOpenHelper.getReadableDatabase(), account);
+    }
+
+    /**
+     * Sets the SyncData bytes for the given account. The byte array may be null.
+     */
+    public void writeSyncDataBytes(String account, byte[] data) {
+        mSyncState.writeSyncDataBytes(mOpenHelper.getWritableDatabase(), account, data);
+    }
+}
index 5511ff6..700f1d8 100644 (file)
@@ -21,12 +21,8 @@ import android.database.DatabaseUtils;
 import android.database.sqlite.SQLiteDatabase;
 import android.net.Uri;
 import android.os.Debug;
-import static android.provider.SyncConstValue._SYNC_ACCOUNT;
-import static android.provider.SyncConstValue._SYNC_DIRTY;
-import static android.provider.SyncConstValue._SYNC_ID;
-import static android.provider.SyncConstValue._SYNC_LOCAL_ID;
-import static android.provider.SyncConstValue._SYNC_MARK;
-import static android.provider.SyncConstValue._SYNC_VERSION;
+import android.provider.BaseColumns;
+import static android.provider.SyncConstValue.*;
 import android.text.TextUtils;
 import android.util.Log;
 
@@ -53,7 +49,7 @@ public abstract class AbstractTableMerger
 
     private static final String TAG = "AbstractTableMerger";
     private static final String[] syncDirtyProjection =
-            new String[] {_SYNC_DIRTY, "_id", _SYNC_ID, _SYNC_VERSION};
+            new String[] {_SYNC_DIRTY, BaseColumns._ID, _SYNC_ID, _SYNC_VERSION};
     private static final String[] syncIdAndVersionProjection =
             new String[] {_SYNC_ID, _SYNC_VERSION};
 
@@ -61,8 +57,9 @@ public abstract class AbstractTableMerger
 
     private static final String SELECT_MARKED = _SYNC_MARK + "> 0 and " + _SYNC_ACCOUNT + "=?";
 
-    private static final String SELECT_BY_ID_AND_ACCOUNT =
+    private static final String SELECT_BY_SYNC_ID_AND_ACCOUNT =
             _SYNC_ID +"=? and " + _SYNC_ACCOUNT + "=?";
+    private static final String SELECT_BY_ID = BaseColumns._ID +"=?";
 
     private static final String SELECT_UNSYNCED = ""
             + _SYNC_DIRTY + " > 0 and (" + _SYNC_ACCOUNT + "=? or " + _SYNC_ACCOUNT + " is null)";
@@ -90,7 +87,8 @@ public abstract class AbstractTableMerger
      * This is called when it is determined that a row should be deleted from the
      * ContentProvider. The localCursor is on a table from the local ContentProvider
      * and its current position is of the row that should be deleted. The localCursor
-     * contains the complete projection of the table.
+     * is only guaranteed to contain the BaseColumns.ID column so the implementation
+     * of deleteRow() must query the database directly if other columns are needed.
      * <p>
      * It is the responsibility of the implementation of this method to ensure that the cursor
      * points to the next row when this method returns, either by calling Cursor.deleteRow() or
@@ -153,7 +151,10 @@ public abstract class AbstractTableMerger
         if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "merge complete");
     }
 
-    private void mergeServerDiffs(SyncContext context,
+    /**
+     * @hide this is public for testing purposes only
+     */
+    public void mergeServerDiffs(SyncContext context,
             String account, SyncableContentProvider serverDiffs, SyncResult syncResult) {
         boolean diffsArePartial = serverDiffs.getContainsDiffs();
         // mark the current rows so that we can distinguish these from new
@@ -202,7 +203,7 @@ public abstract class AbstractTableMerger
             mDb.yieldIfContended();
             String serverSyncId = diffsCursor.getString(serverSyncIDColumn);
             String serverSyncVersion = diffsCursor.getString(serverSyncVersionColumn);
-            long localPersonID = 0;
+            long localRowId = 0;
             String localSyncVersion = null;
 
             diffsCount++;
@@ -316,7 +317,7 @@ public abstract class AbstractTableMerger
                                 " that matches the server _sync_id");
                     }
                     localSyncDirty = localCursor.getInt(0) != 0;
-                    localPersonID = localCursor.getLong(1);
+                    localRowId = localCursor.getLong(1);
                     localSyncVersion = localCursor.getString(3);
                     localCursor.moveToNext();
                 }
@@ -345,23 +346,20 @@ public abstract class AbstractTableMerger
                 continue;
             }
 
-            // If the _sync_local_id is set and > -1 in the diffsCursor
+            // If the _sync_local_id is present in the diffsCursor
             // then this record corresponds to a local record that was just
             // inserted into the server and the _sync_local_id is the row id
             // of the local record. Set these fields so that the next check
             // treats this record as an update, which will allow the
             // merger to update the record with the server's sync id
-            long serverLocalSyncId =
-                    diffsCursor.isNull(serverSyncLocalIdColumn)
-                            ? -1
-                            : diffsCursor.getLong(serverSyncLocalIdColumn);
-            if (serverLocalSyncId > -1) {
-                if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "the remote record with sync id "
-                        + serverSyncId + " has a local sync id, "
-                        + serverLocalSyncId);
+            if (!diffsCursor.isNull(serverSyncLocalIdColumn)) {
+                localRowId = diffsCursor.getLong(serverSyncLocalIdColumn);
+                if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                    Log.v(TAG, "the remote record with sync id " + serverSyncId
+                            + " has a local sync id, " + localRowId);
+                }
                 localSyncID = serverSyncId;
                 localSyncDirty = false;
-                localPersonID = serverLocalSyncId;
                 localSyncVersion = null;
             }
 
@@ -372,12 +370,9 @@ public abstract class AbstractTableMerger
                 if (recordChanged) {
                     if (localSyncDirty) {
                         if (Log.isLoggable(TAG, Log.VERBOSE)) {
-                            Log.v(TAG,
-                                    "remote record " +
-                                            serverSyncId +
-                                    " conflicts with local _sync_id " +
-                                    localSyncID + ", local _id " +
-                                    localPersonID);
+                            Log.v(TAG, "remote record " + serverSyncId
+                                    + " conflicts with local _sync_id " + localSyncID
+                                    + ", local _id " + localRowId);
                         }
                         conflict = true;
                     } else {
@@ -387,7 +382,7 @@ public abstract class AbstractTableMerger
                                              serverSyncId +
                                      " updates local _sync_id " +
                                      localSyncID + ", local _id " +
-                                     localPersonID);
+                                     localRowId);
                          }
                          update = true;
                     }
@@ -395,18 +390,16 @@ public abstract class AbstractTableMerger
             } else {
                 // the local db doesn't know about this record so add it
                 if (Log.isLoggable(TAG, Log.VERBOSE)) {
-                    Log.v(TAG, "remote record "
-                            + serverSyncId + " is new, inserting");
+                    Log.v(TAG, "remote record " + serverSyncId + " is new, inserting");
                 }
                 insert = true;
             }
 
             if (update) {
-                updateRow(localPersonID, serverDiffs, diffsCursor);
+                updateRow(localRowId, serverDiffs, diffsCursor);
                 syncResult.stats.numUpdates++;
             } else if (conflict) {
-                resolveRow(localPersonID, serverSyncId, serverDiffs,
-                        diffsCursor);
+                resolveRow(localRowId, serverSyncId, serverDiffs, diffsCursor);
                 syncResult.stats.numUpdates++;
             } else if (insert) {
                 insertRow(serverDiffs, diffsCursor);
@@ -414,16 +407,16 @@ public abstract class AbstractTableMerger
             }
         }
 
-        if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "processed " + diffsCount +
-                " server entries");
+        if (Log.isLoggable(TAG, Log.VERBOSE)) {
+            Log.v(TAG, "processed " + diffsCount + " server entries");
+        }
 
         // If tombstones aren't in use delete any remaining local rows that
         // don't have corresponding server rows. Keep the rows that don't
         // have a sync id since those were created locally and haven't been
         // synced to the server yet.
         if (!diffsArePartial) {
-            while (!localCursor.isAfterLast() &&
-                    !TextUtils.isEmpty(localCursor.getString(2))) {
+            while (!localCursor.isAfterLast() && !TextUtils.isEmpty(localCursor.getString(2))) {
                 if (mIsMergeCancelled) {
                     localCursor.deactivate();
                     deletedCursor.deactivate();
@@ -458,7 +451,6 @@ public abstract class AbstractTableMerger
         // Apply deletions from the server
         if (mDeletedTableURL != null) {
             diffsCursor = serverDiffs.query(mDeletedTableURL, null, null, null, null);
-            serverSyncIDColumn = diffsCursor.getColumnIndexOrThrow(_SYNC_ID);
 
             while (diffsCursor.moveToNext()) {
                 if (mIsMergeCancelled) {
@@ -466,19 +458,31 @@ public abstract class AbstractTableMerger
                     return;
                 }
                 // delete all rows that match each element in the diffsCursor
-                fullyDeleteRowsWithSyncId(diffsCursor.getString(serverSyncIDColumn), account,
-                        syncResult);
+                fullyDeleteMatchingRows(diffsCursor, account, syncResult);
                 mDb.yieldIfContended();
             }
             diffsCursor.deactivate();
         }
     }
 
-    private void fullyDeleteRowsWithSyncId(String syncId, String account, SyncResult syncResult) {
-        final String[] selectionArgs = new String[]{syncId, account};
+    private void fullyDeleteMatchingRows(Cursor diffsCursor, String account,
+            SyncResult syncResult) {
+        int serverSyncIdColumn = diffsCursor.getColumnIndexOrThrow(_SYNC_ID);
+        final boolean deleteBySyncId = !diffsCursor.isNull(serverSyncIdColumn);
+
         // delete the rows explicitly so that the delete operation can be overridden
-        Cursor c = mDb.query(mTable, getDeleteRowProjection(), SELECT_BY_ID_AND_ACCOUNT,
-                selectionArgs, null, null, null);
+        final Cursor c;
+        final String[] selectionArgs;
+        if (deleteBySyncId) {
+            selectionArgs = new String[]{diffsCursor.getString(serverSyncIdColumn), account};
+            c = mDb.query(mTable, new String[]{BaseColumns._ID}, SELECT_BY_SYNC_ID_AND_ACCOUNT,
+                    selectionArgs, null, null, null);
+        } else {
+            int serverSyncLocalIdColumn = diffsCursor.getColumnIndexOrThrow(_SYNC_LOCAL_ID);
+            selectionArgs = new String[]{diffsCursor.getString(serverSyncLocalIdColumn)};
+            c = mDb.query(mTable, new String[]{BaseColumns._ID}, SELECT_BY_ID, selectionArgs,
+                    null, null, null);
+        }
         try {
             c.moveToFirst();
             while (!c.isAfterLast()) {
@@ -488,22 +492,12 @@ public abstract class AbstractTableMerger
         } finally {
             c.deactivate();
         }
-        if (mDeletedTable != null) {
-            mDb.delete(mDeletedTable, SELECT_BY_ID_AND_ACCOUNT, selectionArgs);
+        if (deleteBySyncId && mDeletedTable != null) {
+            mDb.delete(mDeletedTable, SELECT_BY_SYNC_ID_AND_ACCOUNT, selectionArgs);
         }
     }
 
     /**
-     * Provides the projection used by
-     * {@link AbstractTableMerger#deleteRow(android.database.Cursor)}.
-     * This should be overridden if the deleteRow implementation requires
-     * additional columns.
-     */
-    protected String[] getDeleteRowProjection() {
-        return new String[]{"_id"};
-    }
-
-    /**
      * Converts cursor into a Map, using the correct types for the values.
      */
     protected void cursorRowToContentValues(Cursor cursor, ContentValues map) {
index 1e55e27..e0cd786 100644 (file)
 
 package android.content;
 
-import android.accounts.AccountMonitor;
-import android.accounts.AccountMonitorListener;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
 import android.net.Uri;
-import android.provider.SyncConstValue;
-import android.text.TextUtils;
-import android.util.Config;
-import android.util.Log;
-import android.os.Bundle;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
+
 import java.util.Map;
-import java.util.Vector;
 
 /**
  * A specialization of the ContentProvider that centralizes functionality
@@ -42,68 +30,13 @@ import java.util.Vector;
  * @hide
  */
 public abstract class SyncableContentProvider extends ContentProvider {
-    private static final String TAG = "SyncableContentProvider";
-    protected SQLiteOpenHelper mOpenHelper;
-    protected SQLiteDatabase mDb;
-    private final String mDatabaseName;
-    private final int mDatabaseVersion;
-    private final Uri mContentUri;
-    private AccountMonitor mAccountMonitor;
-
-    /** the account set in the last call to onSyncStart() */
-    private String mSyncingAccount;
-
-    private SyncStateContentProviderHelper mSyncState = null;
-
-    private static final String[] sAccountProjection = new String[] {SyncConstValue._SYNC_ACCOUNT};
-
-    private boolean mIsTemporary;
-
-    private AbstractTableMerger mCurrentMerger = null;
-    private boolean mIsMergeCancelled = false;
-
-    private static final String SYNC_ACCOUNT_WHERE_CLAUSE = SyncConstValue._SYNC_ACCOUNT + "=?";
-
-    protected boolean isTemporary() {
-        return mIsTemporary;
-    }
-
-    /**
-     * Indicates whether or not this ContentProvider contains a full
-     * set of data or just diffs. This knowledge comes in handy when
-     * determining how to incorporate the contents of a temporary
-     * provider into a real provider.
-     */
-    private boolean mContainsDiffs;
-
-    /**
-     * Initializes the SyncableContentProvider
-     * @param dbName the filename of the database
-     * @param dbVersion the current version of the database schema
-     * @param contentUri The base Uri of the syncable content in this provider
-     */
-    public SyncableContentProvider(String dbName, int dbVersion, Uri contentUri) {
-        super();
-
-        mDatabaseName = dbName;
-        mDatabaseVersion = dbVersion;
-        mContentUri = contentUri;
-        mIsTemporary = false;
-        setContainsDiffs(false);
-        if (Config.LOGV) {
-            Log.v(TAG, "created SyncableContentProvider " + this);
-        }
-    }
+    protected abstract boolean isTemporary();
 
     /**
      * Close resources that must be closed. You must call this to properly release
      * the resources used by the SyncableContentProvider.
      */
-    public void close() {
-        if (mOpenHelper != null) {
-            mOpenHelper.close();  // OK to call .close() repeatedly.
-        }
-    }
+    public abstract void close();
 
     /**
      * Override to create your schema and do anything else you need to do with a new database.
@@ -111,7 +44,7 @@ public abstract class SyncableContentProvider extends ContentProvider {
      * This method may not use getDatabase(), or call content provider methods, it must only
      * use the database handle passed to it.
      */
-    protected void bootstrapDatabase(SQLiteDatabase db) {}
+    protected abstract void bootstrapDatabase(SQLiteDatabase db);
 
     /**
      * Override to upgrade your database from an old version to the version you specified.
@@ -131,56 +64,7 @@ public abstract class SyncableContentProvider extends ContentProvider {
      * This method may not use getDatabase(), or call content provider methods, it must only
      * use the database handle passed to it.
      */
-    protected void onDatabaseOpened(SQLiteDatabase db) {}
-
-    private class DatabaseHelper extends SQLiteOpenHelper {
-        DatabaseHelper(Context context, String name) {
-            // Note: context and name may be null for temp providers
-            super(context, name, null, mDatabaseVersion);
-        }
-
-        @Override
-        public void onCreate(SQLiteDatabase db) {
-            bootstrapDatabase(db);
-            mSyncState.createDatabase(db);
-        }
-
-        @Override
-        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
-            if (!upgradeDatabase(db, oldVersion, newVersion)) {
-                mSyncState.discardSyncData(db, null /* all accounts */);
-                getContext().getContentResolver().startSync(mContentUri, new Bundle());
-            }
-        }
-
-        @Override
-        public void onOpen(SQLiteDatabase db) {
-            onDatabaseOpened(db);
-            mSyncState.onDatabaseOpened(db);
-        }
-    }
-
-    @Override
-    public boolean onCreate() {
-        if (isTemporary()) throw new IllegalStateException("onCreate() called for temp provider");
-        mOpenHelper = new DatabaseHelper(getContext(), mDatabaseName);
-        mSyncState = new SyncStateContentProviderHelper(mOpenHelper);
-
-        AccountMonitorListener listener = new AccountMonitorListener() {
-            public void onAccountsUpdated(String[] accounts) {
-                // Some providers override onAccountsChanged(); give them a database to work with.
-                mDb = mOpenHelper.getWritableDatabase();
-                onAccountsChanged(accounts);
-                TempProviderSyncAdapter syncAdapter = (TempProviderSyncAdapter)getSyncAdapter();
-                if (syncAdapter != null) {
-                    syncAdapter.onAccountsChanged(accounts);
-                }
-            }
-        };
-        mAccountMonitor = new AccountMonitor(getContext(), listener);
-
-        return true;
-    }
+    protected abstract void onDatabaseOpened(SQLiteDatabase db);
 
     /**
      * Get a non-persistent instance of this content provider.
@@ -190,49 +74,13 @@ public abstract class SyncableContentProvider extends ContentProvider {
      * @return a non-persistent content provider with the same layout as this
      * provider.
      */
-    public SyncableContentProvider getTemporaryInstance() {
-        SyncableContentProvider temp;
-        try {
-            temp = getClass().newInstance();
-        } catch (InstantiationException e) {
-            throw new RuntimeException("unable to instantiate class, "
-                    + "this should never happen", e);
-        } catch (IllegalAccessException e) {
-            throw new RuntimeException(
-                    "IllegalAccess while instantiating class, "
-                            + "this should never happen", e);
-        }
-
-        // Note: onCreate() isn't run for the temp provider, and it has no Context.
-        temp.mIsTemporary = true;
-        temp.setContainsDiffs(true);
-        temp.mOpenHelper = temp.new DatabaseHelper(null, null);
-        temp.mSyncState = new SyncStateContentProviderHelper(temp.mOpenHelper);
-        if (!isTemporary()) {
-            mSyncState.copySyncState(
-                    mOpenHelper.getReadableDatabase(),
-                    temp.mOpenHelper.getWritableDatabase(),
-                    getSyncingAccount());
-        }
-        return temp;
-    }
-
-    public SQLiteDatabase getDatabase() {
-       if (mDb == null) mDb = mOpenHelper.getWritableDatabase();
-       return mDb;
-    }
-
-    public boolean getContainsDiffs() {
-        return mContainsDiffs;
-    }
-
-    public void setContainsDiffs(boolean containsDiffs) {
-        if (containsDiffs && !isTemporary()) {
-            throw new IllegalStateException(
-                    "only a temporary provider can contain diffs");
-        }
-        mContainsDiffs = containsDiffs;
-    }
+    public abstract SyncableContentProvider getTemporaryInstance();
+
+    public abstract SQLiteDatabase getDatabase();
+
+    public abstract boolean getContainsDiffs();
+
+    public abstract void setContainsDiffs(boolean containsDiffs);
 
     /**
      * Each subclass of this class should define a subclass of {@link
@@ -247,133 +95,14 @@ public abstract class SyncableContentProvider extends ContentProvider {
      * @return A sequence of subclasses of {@link
      * AbstractTableMerger}, one for each table that should be merged.
      */
-    protected Iterable<? extends AbstractTableMerger> getMergers() {
-        return Collections.emptyList();
-    }
-
-    @Override
-    public final int update(final Uri url, final ContentValues values,
-            final String selection, final String[] selectionArgs) {
-        mDb = mOpenHelper.getWritableDatabase();
-        mDb.beginTransaction();
-        try {
-            if (isTemporary() && mSyncState.matches(url)) {
-                int numRows = mSyncState.asContentProvider().update(
-                        url, values, selection, selectionArgs);
-                mDb.setTransactionSuccessful();
-                return numRows;
-            }
-
-            int result = updateInternal(url, values, selection, selectionArgs);
-            mDb.setTransactionSuccessful();
-
-            if (!isTemporary() && result > 0) {
-                getContext().getContentResolver().notifyChange(url, null /* observer */,
-                        changeRequiresLocalSync(url));
-            }
-
-            return result;
-        } finally {
-            mDb.endTransaction();
-        }
-    }
-
-    @Override
-    public final int delete(final Uri url, final String selection,
-            final String[] selectionArgs) {
-        mDb = mOpenHelper.getWritableDatabase();
-        mDb.beginTransaction();
-        try {
-            if (isTemporary() && mSyncState.matches(url)) {
-                int numRows = mSyncState.asContentProvider().delete(url, selection, selectionArgs);
-                mDb.setTransactionSuccessful();
-                return numRows;
-            }
-            int result = deleteInternal(url, selection, selectionArgs);
-            mDb.setTransactionSuccessful();
-            if (!isTemporary() && result > 0) {
-                getContext().getContentResolver().notifyChange(url, null /* observer */,
-                        changeRequiresLocalSync(url));
-            }
-            return result;
-        } finally {
-            mDb.endTransaction();
-        }
-    }
-
-    @Override
-    public final Uri insert(final Uri url, final ContentValues values) {
-        mDb = mOpenHelper.getWritableDatabase();
-        mDb.beginTransaction();
-        try {
-            if (isTemporary() && mSyncState.matches(url)) {
-                Uri result = mSyncState.asContentProvider().insert(url, values);
-                mDb.setTransactionSuccessful();
-                return result;
-            }
-            Uri result = insertInternal(url, values);
-            mDb.setTransactionSuccessful();
-            if (!isTemporary() && result != null) {
-                getContext().getContentResolver().notifyChange(url, null /* observer */,
-                        changeRequiresLocalSync(url));
-            }
-            return result;
-        } finally {
-            mDb.endTransaction();
-        }
-    }
-
-    @Override
-    public final int bulkInsert(final Uri uri, final ContentValues[] values) {
-        int size = values.length;
-        int completed = 0;
-        final boolean isSyncStateUri = mSyncState.matches(uri);
-        mDb = mOpenHelper.getWritableDatabase();
-        mDb.beginTransaction();
-        try {
-            for (int i = 0; i < size; i++) {
-                Uri result;
-                if (isTemporary() && isSyncStateUri) {
-                    result = mSyncState.asContentProvider().insert(uri, values[i]);
-                } else {
-                    result = insertInternal(uri, values[i]);
-                    mDb.yieldIfContended();
-                }
-                if (result != null) {
-                    completed++;
-                }
-            }
-            mDb.setTransactionSuccessful();
-        } finally {
-            mDb.endTransaction();
-        }
-        if (!isTemporary() && completed == values.length) {
-            getContext().getContentResolver().notifyChange(uri, null /* observer */,
-                    changeRequiresLocalSync(uri));
-        }
-        return completed;
-    }
+    protected abstract Iterable<? extends AbstractTableMerger> getMergers();
 
     /**
      * Check if changes to this URI can be syncable changes.
      * @param uri the URI of the resource that was changed
      * @return true if changes to this URI can be syncable changes, false otherwise
      */
-    public boolean changeRequiresLocalSync(Uri uri) {
-        return true;
-    }
-
-    @Override
-    public final Cursor query(final Uri url, final String[] projection,
-            final String selection, final String[] selectionArgs,
-            final String sortOrder) {
-        mDb = mOpenHelper.getReadableDatabase();
-        if (isTemporary() && mSyncState.matches(url)) {
-            return mSyncState.asContentProvider().query(
-                    url, projection, selection,  selectionArgs, sortOrder);
-        }
-        return queryInternal(url, projection, selection, selectionArgs, sortOrder);
-    }
+    public abstract boolean changeRequiresLocalSync(Uri uri);
 
     /**
      * Called right before a sync is started.
@@ -381,12 +110,7 @@ public abstract class SyncableContentProvider extends ContentProvider {
      * @param context the sync context for the operation
      * @param account
      */
-    public void onSyncStart(SyncContext context, String account) {
-        if (TextUtils.isEmpty(account)) {
-            throw new IllegalArgumentException("you passed in an empty account");
-        }
-        mSyncingAccount = account;
-    }
+    public abstract void onSyncStart(SyncContext context, String account);
 
     /**
      * Called right after a sync is completed
@@ -394,16 +118,13 @@ public abstract class SyncableContentProvider extends ContentProvider {
      * @param context the sync context for the operation
      * @param success true if the sync succeeded, false if an error occurred
      */
-    public void onSyncStop(SyncContext context, boolean success) {
-    }
+    public abstract void onSyncStop(SyncContext context, boolean success);
 
     /**
      * The account of the most recent call to onSyncStart()
      * @return the account
      */
-    public String getSyncingAccount() {
-        return mSyncingAccount;
-    }
+    public abstract String getSyncingAccount();
 
     /**
      * Merge diffs from a sync source with this content provider.
@@ -415,40 +136,8 @@ public abstract class SyncableContentProvider extends ContentProvider {
      *   a temporary content provider with the same layout as this provider containing
      * @param syncResult
      */
-    public void merge(SyncContext context, SyncableContentProvider diffs,
-            TempProviderSyncResult result, SyncResult syncResult) {
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        db.beginTransaction();
-        try {
-            synchronized(this) {
-                mIsMergeCancelled = false;
-            }
-            Iterable<? extends AbstractTableMerger> mergers = getMergers();
-            try {
-                for (AbstractTableMerger merger : mergers) {
-                    synchronized(this) {
-                        if (mIsMergeCancelled) break;
-                        mCurrentMerger = merger;
-                    }
-                    merger.merge(context, getSyncingAccount(), diffs, result, syncResult, this);
-                }
-                if (mIsMergeCancelled) return;
-                if (diffs != null) {
-                    mSyncState.copySyncState(
-                        diffs.mOpenHelper.getReadableDatabase(),
-                        mOpenHelper.getWritableDatabase(),
-                        getSyncingAccount());
-                }
-            } finally {
-                synchronized (this) {
-                    mCurrentMerger = null;
-                }
-            }
-            db.setTransactionSuccessful();
-        } finally {
-            db.endTransaction();
-        }
-    }
+    public abstract void merge(SyncContext context, SyncableContentProvider diffs,
+            TempProviderSyncResult result, SyncResult syncResult);
 
 
     /**
@@ -457,19 +146,10 @@ public abstract class SyncableContentProvider extends ContentProvider {
      * provider is syncable). Subclasses of ContentProvider
      * that support canceling of sync should override this.
      */
-    public void onSyncCanceled() {
-        synchronized (this) {
-            mIsMergeCancelled = true;
-            if (mCurrentMerger != null) {
-                mCurrentMerger.onMergeCancelled();
-            }
-        }
-    }
+    public abstract void onSyncCanceled();
 
 
-    public boolean isMergeCancelled() {
-        return mIsMergeCancelled;
-    }
+    public abstract boolean isMergeCancelled();
 
     /**
      * Subclasses should override this instead of update(). See update()
@@ -514,31 +194,7 @@ public abstract class SyncableContentProvider extends ContentProvider {
      * Make sure that there are no entries for accounts that no longer exist
      * @param accountsArray the array of currently-existing accounts
      */
-    protected void onAccountsChanged(String[] accountsArray) {
-        Map<String, Boolean> accounts = new HashMap<String, Boolean>();
-        for (String account : accountsArray) {
-            accounts.put(account, false);
-        }
-        accounts.put(SyncConstValue.NON_SYNCABLE_ACCOUNT, false);
-
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        Map<String, String> tableMap = db.getSyncedTables();
-        Vector<String> tables = new Vector<String>();
-        tables.addAll(tableMap.keySet());
-        tables.addAll(tableMap.values());
-
-        db.beginTransaction();
-        try {
-            mSyncState.onAccountsChanged(accountsArray);
-            for (String table : tables) {
-                deleteRowsForRemovedAccounts(accounts, table,
-                        SyncConstValue._SYNC_ACCOUNT);
-            }
-            db.setTransactionSuccessful();
-        } finally {
-            db.endTransaction();
-        }
-    }
+    protected abstract void onAccountsChanged(String[] accountsArray);
 
     /**
      * A helper method to delete all rows whose account is not in the accounts
@@ -550,71 +206,23 @@ public abstract class SyncableContentProvider extends ContentProvider {
      * @param accountColumnName the name of the column that is expected
      * to hold the account.
      */
-    protected void deleteRowsForRemovedAccounts(Map<String, Boolean> accounts,
-            String table, String accountColumnName) {
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        Cursor c = db.query(table, sAccountProjection, null, null,
-                accountColumnName, null, null);
-        try {
-            while (c.moveToNext()) {
-                String account = c.getString(0);
-                if (TextUtils.isEmpty(account)) {
-                    continue;
-                }
-                if (!accounts.containsKey(account)) {
-                    int numDeleted;
-                    numDeleted = db.delete(table, accountColumnName + "=?", new String[]{account});
-                    if (Config.LOGV) {
-                        Log.v(TAG, "deleted " + numDeleted
-                                + " records from table " + table
-                                + " for account " + account);
-                    }
-                }
-            }
-        } finally {
-            c.close();
-        }
-    }
+    protected abstract void deleteRowsForRemovedAccounts(Map<String, Boolean> accounts,
+            String table, String accountColumnName);
 
     /**
      * Called when the sync system determines that this provider should no longer
      * contain records for the specified account.
      */
-    public void wipeAccount(String account) {
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        Map<String, String> tableMap = db.getSyncedTables();
-        ArrayList<String> tables = new ArrayList<String>();
-        tables.addAll(tableMap.keySet());
-        tables.addAll(tableMap.values());
-
-        db.beginTransaction();
-
-        try {
-            // remote the SyncState data
-            mSyncState.discardSyncData(db, account);
-
-            // remove the data in the synced tables
-            for (String table : tables) {
-                db.delete(table, SYNC_ACCOUNT_WHERE_CLAUSE, new String[]{account});
-            }
-            db.setTransactionSuccessful();
-        } finally {
-            db.endTransaction();
-        }
-    }
+    public abstract void wipeAccount(String account);
 
     /**
      * Retrieves the SyncData bytes for the given account. The byte array returned may be null.
      */
-    public byte[] readSyncDataBytes(String account) {
-        return mSyncState.readSyncDataBytes(mOpenHelper.getReadableDatabase(), account);
-    }
+    public abstract byte[] readSyncDataBytes(String account);
 
     /**
      * Sets the SyncData bytes for the given account. The bytes array may be null.
      */
-    public void writeSyncDataBytes(String account, byte[] data) {
-        mSyncState.writeSyncDataBytes(mOpenHelper.getWritableDatabase(), account, data);
-    }
+    public abstract void writeSyncDataBytes(String account, byte[] data);
 }
 
index 4108bdd..9abc23b 100644 (file)
@@ -105,7 +105,8 @@ class IInputMethodWrapper extends IInputMethod.Stub
                 mInputMethod.revokeSession((InputMethodSession)msg.obj);
                 return;
             case DO_SHOW_SOFT_INPUT:
-                mInputMethod.showSoftInput();
+                mInputMethod.showSoftInput(
+                        msg.arg1 != 0 ? InputMethod.SHOW_EXPLICIT : 0);
                 return;
             case DO_HIDE_SOFT_INPUT:
                 mInputMethod.hideSoftInput();
@@ -162,8 +163,9 @@ class IInputMethodWrapper extends IInputMethod.Stub
         }
     }
     
-    public void showSoftInput() {
-        mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_SHOW_SOFT_INPUT));
+    public void showSoftInput(boolean explicit) {
+        mCaller.executeOrSendMessage(mCaller.obtainMessageI(DO_SHOW_SOFT_INPUT,
+                explicit ? 1 : 0));
     }
     
     public void hideSoftInput() {
index 0588bea..21bb38e 100644 (file)
@@ -289,9 +289,9 @@ public class InputMethodService extends AbstractInputMethodService {
         /**
          * Handle a request by the system to show the soft input area.
          */
-        public void showSoftInput() {
+        public void showSoftInput(int flags) {
             if (DEBUG) Log.v(TAG, "showSoftInput()");
-            showWindow(true);
+            onShowRequested(flags);
         }
     }
     
@@ -805,6 +805,27 @@ public class InputMethodService extends AbstractInputMethodService {
         }
     }
 
+    /**
+     * The system has decided that it may be time to show your input method.
+     * This is called due to a corresponding call to your
+     * {@link InputMethod#showSoftInput(int) InputMethod.showSoftInput(int)}
+     * method.  The default implementation simply calls
+     * {@link #showWindow(boolean)}, except if the
+     * {@link InputMethod#SHOW_EXPLICIT InputMethod.SHOW_EXPLICIT} flag is
+     * not set and the input method is running in fullscreen mode.
+     * 
+     * @param flags Provides additional information about the show request,
+     * as per {@link InputMethod#showSoftInput(int) InputMethod.showSoftInput(int)}.
+     */
+    public void onShowRequested(int flags) {
+        if ((flags&InputMethod.SHOW_EXPLICIT) == 0 && onEvaluateFullscreenMode()) {
+            // Don't show if this is not explicit requested by the user and
+            // the input method is fullscreen.  That would be too disruptive.
+            return;
+        }
+        showWindow(true);
+    }
+    
     public void showWindow(boolean showInput) {
         if (DEBUG) Log.v(TAG, "Showing window: showInput=" + showInput
                 + " mShowInputRequested=" + mShowInputRequested
@@ -943,10 +964,13 @@ public class InputMethodService extends AbstractInputMethodService {
      * Close this input method's soft input area, removing it from the display.
      * The input method will continue running, but the user can no longer use
      * it to generate input by touching the screen.
+     * @param flags Provides additional operating flags.  Currently may be
+     * 0 or have the {@link InputMethodManager#HIDE_IMPLICIT_ONLY
+     * InputMethodManager.HIDE_IMPLICIT_ONLY} bit set.
      */
-    public void dismissSoftInput() {
+    public void dismissSoftInput(int flags) {
         ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE))
-                .hideSoftInputFromInputMethod(mToken);
+                .hideSoftInputFromInputMethod(mToken, flags);
     }
     
     public boolean onKeyDown(int keyCode, KeyEvent event) {
@@ -955,7 +979,7 @@ public class InputMethodService extends AbstractInputMethodService {
             if (mShowInputRequested) {
                 // If the soft input area is shown, back closes it and we
                 // consume the back key.
-                dismissSoftInput();
+                dismissSoftInput(0);
                 return true;
             }
             if (mShowCandidatesRequested) {
index 3b5d741..6f044b6 100755 (executable)
@@ -68,6 +68,24 @@ public class KeyboardView extends View implements View.OnClickListener {
      * Listener for virtual keyboard events.
      */
     public interface OnKeyboardActionListener {
+        
+        /**
+         * Called when the user presses a key. This is sent before the {@link #onKey} is called.
+         * For keys that repeat, this is only called once.
+         * @param primaryCode the unicode of the key being pressed. If the touch is not on a valid
+         * key, the value will be zero.
+         * @hide Pending API Council approval
+         */
+        void onPress(int primaryCode);
+        
+        /**
+         * Called when the user releases a key. This is sent after the {@link #onKey} is called.
+         * For keys that repeat, this is only called once.
+         * @param primaryCode the code of the key that was released
+         * @hide Pending API Council approval
+         */
+        void onRelease(int primaryCode);
+
         /**
          * Send a key press to the listener.
          * @param primaryCode this is the key that was pressed
@@ -111,6 +129,9 @@ public class KeyboardView extends View implements View.OnClickListener {
     private int mLabelTextSize;
     private int mKeyTextSize;
     private int mKeyTextColor;
+    private float mShadowRadius;
+    private int mShadowColor;
+    private float mBackgroundDimAmount;
     
     private TextView mPreviewText;
     private PopupWindow mPreviewPopup;
@@ -150,8 +171,6 @@ public class KeyboardView extends View implements View.OnClickListener {
     private int mStartX;
     private int mStartY;
 
-    private boolean mVibrateOn;
-    private boolean mSoundOn;
     private boolean mProximityCorrectOn;
     
     private Paint mPaint;
@@ -172,20 +191,15 @@ public class KeyboardView extends View implements View.OnClickListener {
     private int mRepeatKeyIndex = NOT_A_KEY;
     private int mPopupLayout;
     private boolean mAbortKey;
+    private Key mInvalidatedKey;
+    private Rect mClipRegion = new Rect(0, 0, 0, 0);
     
     private Drawable mKeyBackground;
-    
-    private static final String PREF_VIBRATE_ON = "vibrate_on";
-    private static final String PREF_SOUND_ON = "sound_on";
-    private static final String PREF_PROXIMITY_CORRECTION = "hit_correction";
 
     private static final int REPEAT_INTERVAL = 50; // ~20 keys per second
     private static final int REPEAT_START_DELAY = 400;
     private static final int LONGPRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout();
 
-    private Vibrator mVibrator;
-    private long[] mVibratePattern = new long[] {1, 20};
-
     private static int MAX_NEARBY_KEYS = 12;
     private int[] mDistances = new int[MAX_NEARBY_KEYS];
 
@@ -269,15 +283,19 @@ public class KeyboardView extends View implements View.OnClickListener {
             case com.android.internal.R.styleable.KeyboardView_popupLayout:
                 mPopupLayout = a.getResourceId(attr, 0);
                 break;
+            case com.android.internal.R.styleable.KeyboardView_shadowColor:
+                mShadowColor = a.getColor(attr, 0);
+                break;
+            case com.android.internal.R.styleable.KeyboardView_shadowRadius:
+                mShadowRadius = a.getFloat(attr, 0f);
+                break;
             }
         }
         
-        // Get the settings preferences
-        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
-        mVibrateOn = sp.getBoolean(PREF_VIBRATE_ON, mVibrateOn);
-        mSoundOn = sp.getBoolean(PREF_SOUND_ON, mSoundOn);
-        mProximityCorrectOn = sp.getBoolean(PREF_PROXIMITY_CORRECTION, true);
-        
+        a = mContext.obtainStyledAttributes(
+                com.android.internal.R.styleable.Theme);
+        mBackgroundDimAmount = a.getFloat(android.R.styleable.Theme_backgroundDimAmount, 0.5f);
+
         mPreviewPopup = new PopupWindow(context);
         if (previewLayout != 0) {
             mPreviewText = (TextView) inflate.inflate(previewLayout, null);
@@ -309,7 +327,7 @@ public class KeyboardView extends View implements View.OnClickListener {
         resetMultiTap();
         initGestureDetector();
     }
-    
+
     private void initGestureDetector() {
         mGestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
             @Override
@@ -440,7 +458,26 @@ public class KeyboardView extends View implements View.OnClickListener {
             mPreviewPopup.dismiss();
         }
     }
-    
+
+    /**
+     * Enables or disables proximity correction. When enabled, {@link OnKeyboardActionListener#onKey}
+     * gets called with key codes for adjacent keys. Otherwise only the primary code is returned.
+     * @param enabled whether or not the proximity correction is enabled
+     * @hide Pending API Council approval
+     */
+    public void setProximityCorrectionEnabled(boolean enabled) {
+        mProximityCorrectOn = enabled;
+    }
+
+    /**
+     * Returns the enabled state of the proximity correction.
+     * @return true if proximity correction is enabled, false otherwise
+     * @hide Pending API Council approval
+     */
+    public boolean isProximityCorrectionEnabled() {
+        return mProximityCorrectOn;
+    }
+
     /** 
      * Popup keyboard close button clicked.
      * @hide 
@@ -498,19 +535,37 @@ public class KeyboardView extends View implements View.OnClickListener {
         if (mKeyboard == null) return;
         
         final Paint paint = mPaint;
-        //final int descent = (int) paint.descent();
         final Drawable keyBackground = mKeyBackground;
+        final Rect clipRegion = mClipRegion;
         final Rect padding = mPadding;
         final int kbdPaddingLeft = mPaddingLeft;
         final int kbdPaddingTop = mPaddingTop;
-        List<Key> keys = mKeyboard.getKeys();
+        final List<Key> keys = mKeyboard.getKeys();
+        final Key invalidKey = mInvalidatedKey;
         //canvas.translate(0, mKeyboardPaddingTop);
         paint.setAlpha(255);
         paint.setColor(mKeyTextColor);
-
+        boolean drawSingleKey = false;
+        if (invalidKey != null && canvas.getClipBounds(clipRegion)) {
+//            System.out.println("Key bounds = " + (invalidKey.x + mPaddingLeft) + ","
+//                    + (invalidKey.y + mPaddingTop) + "," 
+//                    + (invalidKey.x + invalidKey.width + mPaddingLeft) + "," 
+//                    + (invalidKey.y + invalidKey.height + mPaddingTop));
+//            System.out.println("Clip bounds =" + clipRegion.toShortString());
+            // Is clipRegion completely contained within the invalidated key?
+            if (invalidKey.x + kbdPaddingLeft - 1 <= clipRegion.left &&
+                    invalidKey.y + kbdPaddingTop - 1 <= clipRegion.top &&
+                    invalidKey.x + invalidKey.width + kbdPaddingLeft + 1 >= clipRegion.right &&
+                    invalidKey.y + invalidKey.height + kbdPaddingTop + 1 >= clipRegion.bottom) {
+                drawSingleKey = true;
+            }
+        }
         final int keyCount = keys.size();
         for (int i = 0; i < keyCount; i++) {
             final Key key = keys.get(i);
+            if (drawSingleKey && invalidKey != key) {
+                continue;
+            }
             int[] drawableState = key.getCurrentDrawableState();
             keyBackground.setState(drawableState);
             
@@ -535,7 +590,7 @@ public class KeyboardView extends View implements View.OnClickListener {
                     paint.setTypeface(Typeface.DEFAULT);
                 }
                 // Draw a drop shadow for the text
-                paint.setShadowLayer(3f, 0, 0, 0xCC000000);
+                paint.setShadowLayer(mShadowRadius, 0, 0, mShadowColor);
                 // Draw the text
                 canvas.drawText(label,
                     (key.width - padding.left - padding.right) / 2
@@ -558,10 +613,10 @@ public class KeyboardView extends View implements View.OnClickListener {
             }
             canvas.translate(-key.x - kbdPaddingLeft, -key.y - kbdPaddingTop);
         }
-        
+        mInvalidatedKey = null;
         // Overlay a dark rectangle to dim the keyboard
         if (mMiniKeyboardOnScreen) {
-            paint.setColor(0xA0000000);
+            paint.setColor((int) (mBackgroundDimAmount * 0xFF) << 24);
             canvas.drawRect(0, 0, getWidth(), getHeight(), paint);
         }
 
@@ -577,22 +632,6 @@ public class KeyboardView extends View implements View.OnClickListener {
         }
     }
 
-    private void playKeyClick() {
-        if (mSoundOn) {
-            playSoundEffect(0);
-        }
-    }
-
-    private void vibrate() {
-        if (!mVibrateOn) {
-            return;
-        }
-        if (mVibrator == null) {
-            mVibrator = new Vibrator();
-        }
-        mVibrator.vibrate(mVibratePattern, -1);
-    }
-
     private int getKeyIndices(int x, int y, int[] allKeys) {
         final List<Key> keys = mKeyboard.getKeys();
         final boolean shifted = mKeyboard.isShifted();
@@ -650,12 +689,12 @@ public class KeyboardView extends View implements View.OnClickListener {
     private void detectAndSendKey(int x, int y, long eventTime) {
         int index = mCurrentKey;
         if (index != NOT_A_KEY) {
-            vibrate();
             final Key key = mKeyboard.getKeys().get(index);
             if (key.text != null) {
                 for (int i = 0; i < key.text.length(); i++) {
                     mKeyboardActionListener.onKey(key.text.charAt(i), key.codes);
                 }
+                mKeyboardActionListener.onRelease(NOT_A_KEY);
             } else {
                 int code = key.codes[0];
                 //TextEntryState.keyPressedAt(key, x, y);
@@ -672,6 +711,7 @@ public class KeyboardView extends View implements View.OnClickListener {
                     code = key.codes[mTapCount];
                 }
                 mKeyboardActionListener.onKey(code, codes);
+                mKeyboardActionListener.onRelease(code);
             }
             mLastSentIndex = index;
             mLastTapTime = eventTime;
@@ -781,6 +821,7 @@ public class KeyboardView extends View implements View.OnClickListener {
             return;
         }
         final Key key = mKeyboard.getKeys().get(keyIndex);
+        mInvalidatedKey = key;
         invalidate(key.x + mPaddingLeft, key.y + mPaddingTop, 
                 key.x + key.width + mPaddingLeft, key.y + key.height + mPaddingTop);
     }
@@ -834,6 +875,12 @@ public class KeyboardView extends View implements View.OnClickListener {
                     public void swipeRight() { }
                     public void swipeUp() { }
                     public void swipeDown() { }
+                    public void onPress(int primaryCode) {
+                        mKeyboardActionListener.onPress(primaryCode);
+                    }
+                    public void onRelease(int primaryCode) {
+                        mKeyboardActionListener.onRelease(primaryCode);
+                    }
                 });
                 //mInputView.setSuggest(mSuggest);
                 Keyboard keyboard;
@@ -913,6 +960,8 @@ public class KeyboardView extends View implements View.OnClickListener {
                 mDownTime = me.getEventTime();
                 mLastMoveTime = mDownTime;
                 checkMultiTap(eventTime, keyIndex);
+                mKeyboardActionListener.onPress(keyIndex != NOT_A_KEY ? 
+                        mKeyboard.getKeys().get(keyIndex).codes[0] : 0);
                 if (mCurrentKey >= 0 && mKeyboard.getKeys().get(mCurrentKey).repeatable) {
                     mRepeatKeyIndex = mCurrentKey;
                     repeatKey();
@@ -924,8 +973,6 @@ public class KeyboardView extends View implements View.OnClickListener {
                     mHandler.sendMessageDelayed(msg, LONGPRESS_TIMEOUT);
                 }
                 showPreview(keyIndex);
-                playKeyClick();
-                vibrate();
                 break;
 
             case MotionEvent.ACTION_MOVE:
index c3bb967..5f7f91f 100644 (file)
@@ -182,11 +182,11 @@ public final class Debug
     }
 
     /**
-     * Change the JDWP port -- this is a temporary measure.
+     * Change the JDWP port.
      *
-     * If a debugger is currently attached the change may not happen
-     * until after the debugger disconnects.
+     * @deprecated no longer needed or useful
      */
+    @Deprecated
     public static void changeDebugPort(int port) {}
 
     /**
index b137b34..d75a25f 100644 (file)
 
 package android.provider;
 
-import com.google.android.gdata.client.AndroidGDataClient;
-import com.google.android.gdata.client.AndroidXmlParserFactory;
-import com.google.wireless.gdata.calendar.client.CalendarClient;
-import com.google.wireless.gdata.calendar.data.EventEntry;
-import com.google.wireless.gdata.calendar.data.Who;
-import com.google.wireless.gdata.calendar.parser.xml.XmlCalendarGDataParserFactory;
-import com.google.wireless.gdata.client.AuthenticationException;
-import com.google.wireless.gdata.client.AllDeletedUnavailableException;
-import com.google.wireless.gdata.data.Entry;
-import com.google.wireless.gdata.data.StringUtils;
-import com.google.wireless.gdata.parser.ParseException;
-import com.android.internal.database.ArrayListCursor;
-
 import android.app.AlarmManager;
 import android.app.PendingIntent;
 import android.content.ContentResolver;
@@ -45,8 +32,15 @@ import android.text.format.DateUtils;
 import android.text.format.Time;
 import android.util.Config;
 import android.util.Log;
+import com.android.internal.database.ArrayListCursor;
+import com.google.android.gdata.client.AndroidGDataClient;
+import com.google.android.gdata.client.AndroidXmlParserFactory;
+import com.google.wireless.gdata.calendar.client.CalendarClient;
+import com.google.wireless.gdata.calendar.data.EventEntry;
+import com.google.wireless.gdata.calendar.data.Who;
+import com.google.wireless.gdata.calendar.parser.xml.XmlCalendarGDataParserFactory;
+import com.google.wireless.gdata.data.StringUtils;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Vector;
 
@@ -922,9 +916,30 @@ public final class Calendar {
         public static final String ALARM_TIME = "alarmTime";
 
         /**
+         * The creation time of this database entry, in UTC.
+         * (Useful for debugging missed reminders.)
+         * <P>Type: INTEGER (long; millis since epoch)</P>
+         */
+        public static final String CREATION_TIME = "creationTime";
+
+        /**
+         * The time that the alarm broadcast was received by the Calendar app,
+         * in UTC. (Useful for debugging missed reminders.)
+         * <P>Type: INTEGER (long; millis since epoch)</P>
+         */
+        public static final String RECEIVED_TIME = "receivedTime";
+
+        /**
+         * The time that the notification was created by the Calendar app,
+         * in UTC. (Useful for debugging missed reminders.)
+         * <P>Type: INTEGER (long; millis since epoch)</P>
+         */
+        public static final String NOTIFY_TIME = "notifyTime";
+
+        /**
          * The state of this alert.  It starts out as SCHEDULED, then when
          * the alarm goes off, it changes to FIRED, and then when the user
-         * sees and dismisses the alarm it changes to DISMISSED.
+         * dismisses the alarm it changes to DISMISSED.
          * <P>Type: INTEGER</P>
          */
         public static final String STATE = "state";
@@ -966,6 +981,10 @@ public final class Calendar {
             values.put(CalendarAlerts.BEGIN, begin);
             values.put(CalendarAlerts.END, end);
             values.put(CalendarAlerts.ALARM_TIME, alarmTime);
+            long currentTime = System.currentTimeMillis();
+            values.put(CalendarAlerts.CREATION_TIME, currentTime);
+            values.put(CalendarAlerts.RECEIVED_TIME, 0);
+            values.put(CalendarAlerts.NOTIFY_TIME, 0);
             values.put(CalendarAlerts.STATE, SCHEDULED);
             values.put(CalendarAlerts.MINUTES, minutes);
             return cr.insert(CONTENT_URI, values);
index 0b6a758..1bbcc33 100644 (file)
@@ -1433,6 +1433,11 @@ public final class Gmail {
             return SORTED_USER_MEANINGFUL_SYSTEM_LABELS;
         }
 
+        /**
+         * If you are ever tempted to remove outbox or draft from this set make sure you have a
+         * way to stop draft and outbox messages from getting purged before they are sent to the
+         * server.
+         */
         private static final Set<String> FORCED_INCLUDED_LABELS =
                 Sets.newHashSet(LABEL_OUTBOX, LABEL_DRAFT);
 
index 7b2f18c..0184db8 100644 (file)
@@ -1303,6 +1303,16 @@ public final class MediaStore
              * <P>Type: TEXT</P>
              */
             public static final String BUCKET_DISPLAY_NAME = "bucket_display_name";
+
+            /**
+             * The bookmark for the video. Time in ms. Represents the location in the video that the
+             * video should start playing at the next time it is opened. If the value is null or
+             * out of the range 0..DURATION-1 then the video should start playing from the
+             * beginning.
+             * @hide
+             * <P>Type: INTEGER</P>
+             */
+            public static final String BOOKMARK = "bookmark";
         }
 
         public static final class Media implements VideoColumns {
index 91624ad..7b64405 100644 (file)
@@ -25,7 +25,10 @@ import android.annotation.SdkConstant.SdkConstantType;
 import android.content.ContentQueryMap;
 import android.content.ContentResolver;
 import android.content.ContentValues;
+import android.content.Context;
 import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.database.Cursor;
@@ -37,6 +40,7 @@ import android.text.TextUtils;
 import android.util.AndroidException;
 import android.util.Log;
 
+import java.net.URISyntaxException;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.HashMap;
@@ -855,6 +859,43 @@ public final class Settings {
         public static final String WIFI_IDLE_MS = "wifi_idle_ms";
 
         /**
+         * The policy for deciding when Wi-Fi should go to sleep (which will in
+         * turn switch to using the mobile data as an Internet connection).
+         * <p>
+         * Set to one of {@link #WIFI_SLEEP_POLICY_DEFAULT},
+         * {@link #WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED}, or
+         * {@link #WIFI_SLEEP_POLICY_NEVER}.
+         * 
+         * @hide pending API council
+         */
+        public static final String WIFI_SLEEP_POLICY = "wifi_sleep_policy";
+
+        /**
+         * Value for {@link #WIFI_SLEEP_POLICY} to use the default Wi-Fi sleep
+         * policy, which is to sleep shortly after the turning off
+         * according to the {@link #STAY_ON_WHILE_PLUGGED_IN} setting.
+         * 
+         * @hide pending API council
+         */
+        public static final int WIFI_SLEEP_POLICY_DEFAULT = 0;
+
+        /**
+         * Value for {@link #WIFI_SLEEP_POLICY} to use the default policy when
+         * the device is on battery, and never go to sleep when the device is
+         * plugged in.
+         * 
+         * @hide pending API council
+         */
+        public static final int WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED = 1;
+        
+        /**
+         * Value for {@link #WIFI_SLEEP_POLICY} to never go to sleep.
+         * 
+         * @hide pending API council
+         */
+        public static final int WIFI_SLEEP_POLICY_NEVER = 2;
+        
+        /**
          * Whether to use static IP and other static network attributes.
          * <p>
          * Set to 1 for true and 0 for false.
@@ -2674,7 +2715,12 @@ public final class Settings {
 
         /**
          * Descriptive name of the bookmark that can be displayed to the user.
-         * <P>Type: TEXT</P>
+         * If this is empty, the title should be resolved at display time (use
+         * {@link #getTitle(Context, Cursor)} any time you want to display the
+         * title of a bookmark.)
+         * <P>
+         * Type: TEXT
+         * </P>
          */
         public static final String TITLE = "title";
 
@@ -2754,17 +2800,16 @@ public final class Settings {
 
         /**
          * Add a new bookmark to the system.
-         *
+         * 
          * @param cr The ContentResolver to query.
          * @param intent The desired target of the bookmark.
-         * @param title Bookmark title that is shown to the user; null if none.
+         * @param title Bookmark title that is shown to the user; null if none
+         *            or it should be resolved to the intent's title.
          * @param folder Folder in which to place the bookmark; null if none.
-         * @param shortcut Shortcut that will invoke the bookmark; 0 if none.
-         *                 If this is non-zero and there is an existing
-         *                 bookmark entry with this same shortcut, then that
-         *                 existing shortcut is cleared (the bookmark is not
-         *                 removed).
-         *
+         * @param shortcut Shortcut that will invoke the bookmark; 0 if none. If
+         *            this is non-zero and there is an existing bookmark entry
+         *            with this same shortcut, then that existing shortcut is
+         *            cleared (the bookmark is not removed).
          * @return The unique content URL for the new bookmark entry.
          */
         public static Uri add(ContentResolver cr,
@@ -2813,9 +2858,49 @@ public final class Settings {
          * @return CharSequence The label for this folder that should be shown
          *         to the user.
          */
-        public static CharSequence labelForFolder(Resources r, String folder) {
+        public static CharSequence getLabelForFolder(Resources r, String folder) {
             return folder;
         }
+
+        /**
+         * Return the title as it should be displayed to the user. This takes
+         * care of localizing bookmarks that point to activities.
+         * 
+         * @param context A context.
+         * @param cursor A cursor pointing to the row whose title should be
+         *            returned. The cursor must contain at least the
+         *            {@link #TITLE} and {@link #INTENT} columns.
+         * @return A title that is localized and can be displayed to the user.
+         */
+        public static CharSequence getTitle(Context context, Cursor cursor) {
+            int titleColumn = cursor.getColumnIndex(TITLE);
+            int intentColumn = cursor.getColumnIndex(INTENT);
+            if (titleColumn == -1 || intentColumn == -1) {
+                throw new IllegalArgumentException(
+                        "The cursor must contain the TITLE and INTENT columns.");
+            }
+            
+            String title = cursor.getString(titleColumn);
+            if (!TextUtils.isEmpty(title)) {
+                return title;
+            }
+            
+            String intentUri = cursor.getString(intentColumn);
+            if (TextUtils.isEmpty(intentUri)) {
+                return "";
+            }
+            
+            Intent intent;
+            try {
+                intent = Intent.getIntent(intentUri);
+            } catch (URISyntaxException e) {
+                return "";
+            }
+            
+            PackageManager packageManager = context.getPackageManager();
+            ResolveInfo info = packageManager.resolveActivity(intent, 0);
+            return info.loadLabel(packageManager);
+        }
     }
 
     /**
index ded50e4..90ef8f6 100644 (file)
@@ -53,6 +53,8 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub {
     private static final String BLUETOOTH_ADMIN_PERM = android.Manifest.permission.BLUETOOTH_ADMIN;
     private static final String BLUETOOTH_PERM = android.Manifest.permission.BLUETOOTH;
 
+    private static final String A2DP_SINK_ADDRESS = "a2dp_sink_address";
+
     private final Context mContext;
     private final IntentFilter mIntentFilter;
     private HashMap<String, SinkState> mAudioDevices;
@@ -251,6 +253,7 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub {
             }
         }
 
+        mAudioManager.setParameter(A2DP_SINK_ADDRESS, lookupAddress(path));
         mAudioManager.setBluetoothA2dpOn(true);
         updateState(path, BluetoothA2dp.STATE_CONNECTED);
     }
@@ -302,13 +305,15 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub {
             s.state = state;
         }
 
-        if (DBG) log("state " + address + " (" + path + ") " + prevState + "->" + state);
-
-        Intent intent = new Intent(BluetoothA2dp.SINK_STATE_CHANGED_ACTION);
-        intent.putExtra(BluetoothIntent.ADDRESS, address);
-        intent.putExtra(BluetoothA2dp.SINK_PREVIOUS_STATE, prevState);
-        intent.putExtra(BluetoothA2dp.SINK_STATE, state);
-        mContext.sendBroadcast(intent, BLUETOOTH_PERM);
+        if (state != prevState) {
+            if (DBG) log("state " + address + " (" + path + ") " + prevState + "->" + state);
+    
+            Intent intent = new Intent(BluetoothA2dp.SINK_STATE_CHANGED_ACTION);
+            intent.putExtra(BluetoothIntent.ADDRESS, address);
+            intent.putExtra(BluetoothA2dp.SINK_PREVIOUS_STATE, prevState);
+            intent.putExtra(BluetoothA2dp.SINK_STATE, state);
+            mContext.sendBroadcast(intent, BLUETOOTH_PERM);
+        }
     }
 
     @Override
diff --git a/core/java/android/speech/srec/WaveHeader.java b/core/java/android/speech/srec/WaveHeader.java
new file mode 100644 (file)
index 0000000..0aa3cc2
--- /dev/null
@@ -0,0 +1,267 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.speech.srec;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * This class represents the header of a WAVE format audio file, which usually
+ * have a .wav suffix.  The following integer valued fields are contained:
+ * <ul>
+ * <li> format - usually PCM, ALAW or ULAW.
+ * <li> numChannels - 1 for mono, 2 for stereo.
+ * <li> sampleRate - usually 8000, 11025, 16000, 22050, or 44100 hz.
+ * <li> bitsPerSample - usually 16 for PCM, 8 for ALAW, or 8 for ULAW.
+ * <li> numBytes - size of audio data after this header, in bytes.
+ * </ul>
+ * @hide pending API council approval
+ */
+public class WaveHeader {
+    
+    // follows WAVE format in http://ccrma.stanford.edu/courses/422/projects/WaveFormat
+
+    private static final String TAG = "WaveHeader";
+    
+    private static final int HEADER_LENGTH = 44;
+    
+    /** Indicates PCM format. */
+    public static final short FORMAT_PCM = 1;
+    /** Indicates ALAW format. */
+    public static final short FORMAT_ALAW = 6;
+    /** Indicates ULAW format. */
+    public static final short FORMAT_ULAW = 7;
+    
+    private short mFormat;
+    private short mNumChannels;
+    private int mSampleRate;
+    private short mBitsPerSample;
+    private int mNumBytes;
+    
+    /**
+     * Construct a WaveHeader, with all fields defaulting to zero.
+     */
+    public WaveHeader() {
+    }
+    
+    /**
+     * Construct a WaveHeader, with fields initialized.
+     * @param format format of audio data,
+     * one of {@link #FORMAT_PCM}, {@link #FORMAT_ULAW}, or {@link #FORMAT_ALAW}. 
+     * @param numChannels 1 for mono, 2 for stereo.
+     * @param sampleRate typically 8000, 11025, 16000, 22050, or 44100 hz.
+     * @param bitsPerSample usually 16 for PCM, 8 for ULAW or 8 for ALAW.
+     * @param numBytes size of audio data after this header, in bytes.
+     */
+    public WaveHeader(short format, short numChannels, int sampleRate, short bitsPerSample, int numBytes) {
+        mFormat = format;
+        mSampleRate = sampleRate;
+        mNumChannels = numChannels;
+        mBitsPerSample = bitsPerSample;
+        mNumBytes = numBytes;
+    }
+    
+    /**
+     * Get the format field.
+     * @return format field,
+     * one of {@link #FORMAT_PCM}, {@link #FORMAT_ULAW}, or {@link #FORMAT_ALAW}.
+     */
+    public short getFormat() {
+        return mFormat;
+    }
+    
+    /**
+     * Set the format field.
+     * @param format
+     * one of {@link #FORMAT_PCM}, {@link #FORMAT_ULAW}, or {@link #FORMAT_ALAW}.
+     * @return reference to this WaveHeader instance.
+     */
+    public WaveHeader setFormat(short format) {
+        mFormat = format;
+        return this;
+    }
+    
+    /**
+     * Get the number of channels.
+     * @return number of channels, 1 for mono, 2 for stereo.
+     */
+    public short getNumChannels() {
+        return mNumChannels;
+    }
+    
+    /**
+     * Set the number of channels.
+     * @param numChannels 1 for mono, 2 for stereo.
+     * @return reference to this WaveHeader instance.
+     */
+    public WaveHeader setNumChannels(short numChannels) {
+        mNumChannels = numChannels;
+        return this;
+    }
+    
+    /**
+     * Get the sample rate.
+     * @return sample rate, typically 8000, 11025, 16000, 22050, or 44100 hz.
+     */
+    public int getSampleRate() {
+        return mSampleRate;
+    }
+    
+    /**
+     * Set the sample rate.
+     * @param sampleRate sample rate, typically 8000, 11025, 16000, 22050, or 44100 hz.
+     * @return reference to this WaveHeader instance.
+     */
+    public WaveHeader setSampleRate(int sampleRate) {
+        mSampleRate = sampleRate;
+        return this;
+    }
+    
+    /**
+     * Get the number of bits per sample.
+     * @return number of bits per sample,
+     * usually 16 for PCM, 8 for ULAW or 8 for ALAW.
+     */
+    public short getBitsPerSample() {
+        return mBitsPerSample;
+    }
+    
+    /**
+     * Set the number of bits per sample.
+     * @param bitsPerSample number of bits per sample,
+     * usually 16 for PCM, 8 for ULAW or 8 for ALAW.
+     * @return reference to this WaveHeader instance.
+     */
+    public WaveHeader setBitsPerSample(short bitsPerSample) {
+        mBitsPerSample = bitsPerSample;
+        return this;
+    }
+    
+    /**
+     * Get the size of audio data after this header, in bytes.
+     * @return size of audio data after this header, in bytes.
+     */
+    public int getNumBytes() {
+        return mNumBytes;
+    }
+    
+    /**
+     * Set the size of audio data after this header, in bytes.
+     * @param numBytes size of audio data after this header, in bytes.
+     * @return reference to this WaveHeader instance.
+     */
+    public WaveHeader setNumBytes(int numBytes) {
+        mNumBytes = numBytes;
+        return this;
+    }
+    
+    /**
+     * Read and initialize a WaveHeader.
+     * @param in {@link java.io.InputStream} to read from.
+     * @return number of bytes consumed.
+     * @throws IOException
+     */
+    public int read(InputStream in) throws IOException {
+        /* RIFF header */
+        readId(in, "RIFF");
+        int numBytes = readInt(in) - 36;
+        readId(in, "WAVE");
+
+        /* fmt chunk */
+        readId(in, "fmt ");
+        if (16 != readInt(in)) throw new IOException("fmt chunk length not 16");
+        mFormat = readShort(in);
+        mNumChannels = readShort(in);
+        mSampleRate = readInt(in);
+        int byteRate = readInt(in);
+        short blockAlign = readShort(in);
+        mBitsPerSample = readShort(in);
+        if (byteRate != mNumChannels * mSampleRate * mBitsPerSample / 8) {
+            throw new IOException("fmt.ByteRate field inconsistent");
+        }
+        if (blockAlign != mNumChannels * mBitsPerSample / 8) {
+            throw new IOException("fmt.BlockAlign field inconsistent");
+        }
+
+        /* data chunk */
+        readId(in, "data");
+        mNumBytes = readInt(in);
+        
+        return HEADER_LENGTH;
+    }
+
+    private static void readId(InputStream in, String id) throws IOException {
+        for (int i = 0; i < id.length(); i++) {
+            if (id.charAt(i) != in.read()) throw new IOException( id + " tag not present");
+        }
+    }
+
+    private static int readInt(InputStream in) throws IOException {
+        return in.read() | (in.read() << 8) | (in.read() << 16) | (in.read() << 24);
+    }
+
+    private static short readShort(InputStream in) throws IOException {
+        return (short)(in.read() | (in.read() << 8));
+    }
+
+    /**
+     * Write a WAVE file header.
+     * @param out {@link java.io.OutputStream} to receive the header.
+     * @return number of bytes written.
+     * @throws IOException
+     */
+    public int write(OutputStream out) throws IOException {
+        /* RIFF header */
+        writeId(out, "RIFF");
+        writeInt(out, 36 + mNumBytes);
+        writeId(out, "WAVE");
+
+        /* fmt chunk */
+        writeId(out, "fmt ");
+        writeInt(out, 16);
+        writeShort(out, mFormat);
+        writeShort(out, mNumChannels);
+        writeInt(out, mSampleRate);
+        writeInt(out, mNumChannels * mSampleRate * mBitsPerSample / 8);
+        writeShort(out, (short)(mNumChannels * mBitsPerSample / 8));
+        writeShort(out, mBitsPerSample);
+
+        /* data chunk */
+        writeId(out, "data");
+        writeInt(out, mNumBytes);
+        
+        return HEADER_LENGTH;
+    }
+
+    private static void writeId(OutputStream out, String id) throws IOException {
+        for (int i = 0; i < id.length(); i++) out.write(id.charAt(i));
+    }
+
+    private static void writeInt(OutputStream out, int val) throws IOException {
+        out.write(val >> 0);
+        out.write(val >> 8);
+        out.write(val >> 16);
+        out.write(val >> 24);
+    }
+
+    private static void writeShort(OutputStream out, short val) throws IOException {
+        out.write(val >> 0);
+        out.write(val >> 8);
+    }
+
+}
index 3437978..73adedf 100644 (file)
@@ -70,7 +70,7 @@ import java.text.SimpleDateFormat;
     &quot;MMMM dd, yyyy h:mmaa&quot; -&gt; &quot;April 6, 1970 3:23am&quot<br/>
     &quot;E, MMMM dd, yyyy h:mmaa&quot; -&gt; &quot;Mon, April 6, 1970 3:23am&<br/>
     &quot;EEEE, MMMM dd, yyyy h:mmaa&quot; -&gt; &quot;Monday, April 6, 1970 3:23am&quot;<br/>
-    &quot;&apos;Best day evar: &apos;M/d/yy&quot; -&gt; &quot;Best day evar: 4/6/70&quot;
+    &quot;&apos;Noteworthy day: &apos;M/d/yy&quot; -&gt; &quot;Noteworthy day: 4/6/70&quot;
  */
 
 public class DateFormat {
index 52ee00e..393b98e 100644 (file)
@@ -68,6 +68,20 @@ public class DayOfMonthCursor extends MonthDisplayHelper {
     public int getSelectedDayOfMonth() {
         return getDayAt(mRow, mColumn);
     }
+
+    /**
+     * @return 0 if the selection is in the current month, otherwise -1 or +1
+     * depending on whether the selection is in the first or last row.
+     */
+    public int getSelectedMonthOffset() {
+        if (isWithinCurrentMonth(mRow, mColumn)) {
+            return 0;
+        }
+        if (mRow == 0) {
+            return -1;
+        }
+        return 1;
+    }
     
     public void setSelectedDayOfMonth(int dayOfMonth) {
         mRow = getRowOf(dayOfMonth);
index 24f67cd..2572679 100644 (file)
@@ -86,7 +86,7 @@ public final class Log {
 
     /**
      * Send a {@link #VERBOSE} log message.
-     * @param tag Used to identify the source of a log message.  It usually identfies
+     * @param tag Used to identify the source of a log message.  It usually identifies
      *        the class or activity where the log call occurs.
      * @param msg The message you would like logged.
      */
@@ -96,7 +96,7 @@ public final class Log {
 
     /**
      * Send a {@link #VERBOSE} log message and log the exception.
-     * @param tag Used to identify the source of a log message.  It usually identfies
+     * @param tag Used to identify the source of a log message.  It usually identifies
      *        the class or activity where the log call occurs.
      * @param msg The message you would like logged.
      * @param tr An exception to log
@@ -107,7 +107,7 @@ public final class Log {
 
     /**
      * Send a {@link #DEBUG} log message.
-     * @param tag Used to identify the source of a log message.  It usually identfies
+     * @param tag Used to identify the source of a log message.  It usually identifies
      *        the class or activity where the log call occurs.
      * @param msg The message you would like logged.
      */
@@ -117,7 +117,7 @@ public final class Log {
 
     /**
      * Send a {@link #DEBUG} log message and log the exception.
-     * @param tag Used to identify the source of a log message.  It usually identfies
+     * @param tag Used to identify the source of a log message.  It usually identifies
      *        the class or activity where the log call occurs.
      * @param msg The message you would like logged.
      * @param tr An exception to log
@@ -128,7 +128,7 @@ public final class Log {
 
     /**
      * Send an {@link #INFO} log message.
-     * @param tag Used to identify the source of a log message.  It usually identfies
+     * @param tag Used to identify the source of a log message.  It usually identifies
      *        the class or activity where the log call occurs.
      * @param msg The message you would like logged.
      */
@@ -138,7 +138,7 @@ public final class Log {
 
     /**
      * Send a {@link #INFO} log message and log the exception.
-     * @param tag Used to identify the source of a log message.  It usually identfies
+     * @param tag Used to identify the source of a log message.  It usually identifies
      *        the class or activity where the log call occurs.
      * @param msg The message you would like logged.
      * @param tr An exception to log
@@ -149,7 +149,7 @@ public final class Log {
 
     /**
      * Send a {@link #WARN} log message.
-     * @param tag Used to identify the source of a log message.  It usually identfies
+     * @param tag Used to identify the source of a log message.  It usually identifies
      *        the class or activity where the log call occurs.
      * @param msg The message you would like logged.
      */
@@ -159,7 +159,7 @@ public final class Log {
 
     /**
      * Send a {@link #WARN} log message and log the exception.
-     * @param tag Used to identify the source of a log message.  It usually identfies
+     * @param tag Used to identify the source of a log message.  It usually identifies
      *        the class or activity where the log call occurs.
      * @param msg The message you would like logged.
      * @param tr An exception to log
@@ -190,7 +190,7 @@ public final class Log {
         
     /*
      * Send a {@link #WARN} log message and log the exception.
-     * @param tag Used to identify the source of a log message.  It usually identfies
+     * @param tag Used to identify the source of a log message.  It usually identifies
      *        the class or activity where the log call occurs.
      * @param tr An exception to log
      */
@@ -200,7 +200,7 @@ public final class Log {
 
     /**
      * Send an {@link #ERROR} log message.
-     * @param tag Used to identify the source of a log message.  It usually identfies
+     * @param tag Used to identify the source of a log message.  It usually identifies
      *        the class or activity where the log call occurs.
      * @param msg The message you would like logged.
      */
@@ -210,7 +210,7 @@ public final class Log {
 
     /**
      * Send a {@link #ERROR} log message and log the exception.
-     * @param tag Used to identify the source of a log message.  It usually identfies
+     * @param tag Used to identify the source of a log message.  It usually identifies
      *        the class or activity where the log call occurs.
      * @param msg The message you would like logged.
      * @param tr An exception to log
@@ -238,7 +238,7 @@ public final class Log {
     /**
      * Low-level logging call.
      * @param priority The priority/type of this log message
-     * @param tag Used to identify the source of a log message.  It usually identfies
+     * @param tag Used to identify the source of a log message.  It usually identifies
      *        the class or activity where the log call occurs.
      * @param msg The message you would like logged.
      * @return The number of bytes written.
index d89c7b4..40251db 100644 (file)
@@ -67,6 +67,7 @@ interface IWindowManager
     int getAppOrientation(IApplicationToken token);
     void setFocusedApp(IBinder token, boolean moveFocusNow);
     void prepareAppTransition(int transit);
+    int getPendingAppTransition();
     void executeAppTransition();
     void setAppStartingWindow(IBinder token, String pkg, int theme,
             CharSequence nonLocalizedLabel, int labelRes,
index 580a80d..30da83e 100644 (file)
@@ -10,8 +10,9 @@ package android.view;
 public class RawInputEvent {
     // Event class as defined by EventHub.
     public static final int CLASS_KEYBOARD = 0x00000001;
-    public static final int CLASS_TOUCHSCREEN = 0x00000002;
-    public static final int CLASS_TRACKBALL = 0x00000004;
+    public static final int CLASS_ALPHAKEY = 0x00000002;
+    public static final int CLASS_TOUCHSCREEN = 0x00000004;
+    public static final int CLASS_TRACKBALL = 0x00000008;
     
     // More special classes for QueuedEvent below.
     public static final int CLASS_CONFIGURATION_CHANGED = 0x10000000;
index 1cc7b60..85f482c 100644 (file)
@@ -1670,6 +1670,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback {
         int viewFlagValues = 0;
         int viewFlagMasks = 0;
 
+        boolean setScrollContainer = false;
+        
         int x = 0;
         int y = 0;
 
@@ -1796,6 +1798,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback {
                         viewFlagMasks |= SCROLLBARS_STYLE_MASK;
                     }
                     break;
+                case R.styleable.View_isScrollContainer:
+                    setScrollContainer = true;
+                    if (a.getBoolean(attr, false)) {
+                        setScrollContainer(true);
+                    }
+                    break;
                 case com.android.internal.R.styleable.View_keepScreenOn:
                     if (a.getBoolean(attr, false)) {
                         viewFlagValues |= KEEP_SCREEN_ON;
@@ -1856,6 +1864,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback {
             scrollTo(x, y);
         }
 
+        if (!setScrollContainer && (viewFlagValues&SCROLLBARS_VERTICAL) != 0) {
+            setScrollContainer(true);
+        }
+  
         a.recycle();
     }
 
@@ -3555,10 +3567,28 @@ public class View implements Drawable.Callback, KeyEvent.Callback {
     }
 
     /**
+     * Check whether the called view is a text editor, in which case it
+     * would make sense to automatically display a soft input window for
+     * it.  Subclasses should override this if they implement
+     * {@link #onCreateInputConnection(EditorInfo)} to return true if
+     * a call on that method would return a non-null InputConnection.  The
+     * default implementation always returns false.
+     * 
+     * @return Returns true if this view is a text editor, else false.
+     */
+    public boolean onCheckIsTextEditor() {
+        return false;
+    }
+    
+    /**
      * Create a new InputConnection for an InputMethod to interact
      * with the view.  The default implementation returns null, since it doesn't
      * support input methods.  You can override this to implement such support.
      * This is only needed for views that take focus and text input.
+     * 
+     * <p>When implementing this, you probably also want to implement
+     * {@link #onCheckIsTextEditor()} to indicate you will return a
+     * non-null InputConnection.
      *
      * @param outAttrs Fill in with attribute information about the connection.
      */
index a254edb..9d7a124 100644 (file)
@@ -1579,9 +1579,16 @@ public final class ViewRoot extends Handler implements ViewParent,
                     InputMethodManager imm = InputMethodManager.peekInstance();
                     if (imm != null) {
                         imm.onWindowFocus(mView.findFocus(),
-                                mWindowAttributes.softInputMode, !mHasHadWindowFocus,
-                                mWindowAttributes.flags);
+                                mWindowAttributes.softInputMode,
+                                !mHasHadWindowFocus, mWindowAttributes.flags);
                     }
+                    // Clear the forward bit.  We can just do this directly, since
+                    // the window manager doesn't care about it.
+                    mWindowAttributes.softInputMode &=
+                            ~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
+                    ((WindowManager.LayoutParams)mView.getLayoutParams())
+                            .softInputMode &=
+                                ~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
                     mHasHadWindowFocus = true;
                 }
             }
@@ -2030,14 +2037,20 @@ public final class ViewRoot extends Handler implements ViewParent,
             }
             return;
         }
-        InputMethodManager imm = InputMethodManager.peekInstance();
-        if (imm != null && mView != null && imm.isActive()) {
-            int seq = enqueuePendingEvent(event, sendDone);
-            if (DEBUG_IMF) Log.v(TAG, "Sending key event to IME: seq="
-                    + seq + " event=" + event);
-            imm.dispatchKeyEvent(mView.getContext(), seq, event,
-                    mInputMethodCallback);
-            return;
+        // If it is possible for this window to interact with the input
+        // method window, then we want to first dispatch our key events
+        // to the input method.
+        if (WindowManager.LayoutParams.mayUseInputMethod(
+                mWindowAttributes.flags)) {
+            InputMethodManager imm = InputMethodManager.peekInstance();
+            if (imm != null && mView != null && imm.isActive()) {
+                int seq = enqueuePendingEvent(event, sendDone);
+                if (DEBUG_IMF) Log.v(TAG, "Sending key event to IME: seq="
+                        + seq + " event=" + event);
+                imm.dispatchKeyEvent(mView.getContext(), seq, event,
+                        mInputMethodCallback);
+                return;
+            }
         }
         deliverKeyEventToViewHierarchy(event, sendDone);
     }
index 7d202aa..7e47ad1 100644 (file)
@@ -466,12 +466,6 @@ public interface WindowManager extends ViewManager {
          */
         public static final int FLAG_WATCH_OUTSIDE_TOUCH = 0x00040000;
         
-        /** Window flag: set when this window was created from the restored
-         * state of a previous window, indicating this is not the first time
-         * the user has navigated to it.
-         */
-        public static final int FLAG_RESTORED_STATE = 0x00080000;
-        
         /** Window flag: a special option intended for system dialogs.  When
          * this flag is set, the window will demand focus unconditionally when
          * it is created.
@@ -479,6 +473,29 @@ public interface WindowManager extends ViewManager {
         public static final int FLAG_SYSTEM_ERROR = 0x40000000;
 
         /**
+         * Given a particular set of window manager flags, determine whether
+         * such a window may be a target for an input method when it has
+         * focus.  In particular, this checks the
+         * {@link #FLAG_NOT_FOCUSABLE} and {@link #FLAG_ALT_FOCUSABLE_IM}
+         * flags and returns true if the combination of the two corresponds
+         * to a window that needs to be behind the input method so that the
+         * user can type into it.
+         * 
+         * @param flags The current window manager flags.
+         * 
+         * @return Returns true if such a window should be behind/interact
+         * with an input method, false if not.
+         */
+        public static boolean mayUseInputMethod(int flags) {
+            switch (flags&(FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM)) {
+                case 0:
+                case FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM:
+                    return true;
+            }
+            return false;
+        }
+        
+        /**
          * Mask for {@link #softInputMode} of the bits that determine the
          * desired visibility state of the soft input area for this window.
          */
@@ -502,16 +519,17 @@ public interface WindowManager extends ViewManager {
         public static final int SOFT_INPUT_STATE_HIDDEN = 2;
         
         /**
-         * Visibility state for {@link #softInputMode}: please show the soft input area
-         * the first time the window is shown.
+         * Visibility state for {@link #softInputMode}: please show the soft
+         * input area when normally appropriate (when the user is navigating
+         * forward to your window).
          */
-        public static final int SOFT_INPUT_STATE_FIRST_VISIBLE = 3;
+        public static final int SOFT_INPUT_STATE_VISIBLE = 3;
         
         /**
-         * Visibility state for {@link #softInputMode}: please always show the soft
-         * input area.
+         * Visibility state for {@link #softInputMode}: please always make the
+         * soft input area visible when this window receives input focus.
          */
-        public static final int SOFT_INPUT_STATE_VISIBLE = 4;
+        public static final int SOFT_INPUT_STATE_ALWAYS_VISIBLE = 4;
         
         /**
          * Mask for {@link #softInputMode} of the bits that determine the
@@ -547,13 +565,22 @@ public interface WindowManager extends ViewManager {
         public static final int SOFT_INPUT_ADJUST_PAN = 0x20;
         
         /**
+         * Bit for {@link #softInputMode}: set when the user has navigated
+         * forward to the window.  This is normally set automatically for
+         * you by the system, though you may want to set it in certain cases
+         * when you are displaying a window yourself.  This flag will always
+         * be cleared automatically after the window is displayed.
+         */
+        public static final int SOFT_INPUT_IS_FORWARD_NAVIGATION = 0x100;
+        
+        /**
          * Desired operating mode for any soft input area.  May any combination
          * of:
          * 
          * <ul>
          * <li> One of the visibility states
          * {@link #SOFT_INPUT_STATE_UNSPECIFIED}, {@link #SOFT_INPUT_STATE_UNCHANGED},
-         * {@link #SOFT_INPUT_STATE_HIDDEN}, {@link #SOFT_INPUT_STATE_FIRST_VISIBLE}, or
+         * {@link #SOFT_INPUT_STATE_HIDDEN}, {@link #SOFT_INPUT_STATE_ALWAYS_VISIBLE}, or
          * {@link #SOFT_INPUT_STATE_VISIBLE}.
          * <li> One of the adjustment options
          * {@link #SOFT_INPUT_ADJUST_UNSPECIFIED},
index d1d549c..9264398 100644 (file)
@@ -118,7 +118,12 @@ public abstract class Animation {
      * Indicates whether the animation transformation should be applied after the
      * animation ends.
      */
-    boolean mFillAfter = true;
+    boolean mFillAfter = false;
+
+    /**
+     * Indicates whether fillAfter should be taken into account.
+     */
+    boolean mFillEnabled = false;    
 
     /**
      * The time in milliseconds at which the animation must start;
@@ -193,6 +198,7 @@ public abstract class Animation {
         setDuration((long) a.getInt(com.android.internal.R.styleable.Animation_duration, 0));
         setStartOffset((long) a.getInt(com.android.internal.R.styleable.Animation_startOffset, 0));
         
+        setFillEnabled(a.getBoolean(com.android.internal.R.styleable.Animation_fillEnabled, mFillEnabled));
         setFillBefore(a.getBoolean(com.android.internal.R.styleable.Animation_fillBefore, mFillBefore));
         setFillAfter(a.getBoolean(com.android.internal.R.styleable.Animation_fillAfter, mFillAfter));
 
@@ -406,6 +412,31 @@ public abstract class Animation {
     }
 
     /**
+     * If fillEnabled is true, this animation will apply fillBefore and fillAfter.
+     *
+     * @return true if the animation will take fillBefore and fillAfter into account
+     * @attr ref android.R.styleable#Animation_fillEnabled
+     */
+    public boolean isFillEnabled() {
+        return mFillEnabled;
+    }
+
+    /**
+     * If fillEnabled is true, the animation will apply the value of fillBefore and
+     * fillAfter. Otherwise, fillBefore and fillAfter are ignored and the animation
+     * transformation is always applied.
+     *
+     * @param fillEnabled true if the animation should take fillBefore and fillAfter into account
+     * @attr ref android.R.styleable#Animation_fillEnabled
+     *
+     * @see #setFillBefore(boolean)
+     * @see #setFillAfter(boolean)
+     */
+    public void setFillEnabled(boolean fillEnabled) {
+        mFillEnabled = fillEnabled;
+    }
+
+    /**
      * If fillBefore is true, this animation will apply its transformation
      * before the start time of the animation. Defaults to true if not set.
      * Note that this applies when using an {@link
@@ -415,6 +446,8 @@ public abstract class Animation {
      *
      * @param fillBefore true if the animation should apply its transformation before it starts
      * @attr ref android.R.styleable#Animation_fillBefore
+     *
+     * @see #setFillEnabled(boolean)
      */
     public void setFillBefore(boolean fillBefore) {
         mFillBefore = fillBefore;
@@ -422,7 +455,7 @@ public abstract class Animation {
 
     /**
      * If fillAfter is true, the transformation that this animation performed
-     * will persist when it is finished. Defaults to true if not set.
+     * will persist when it is finished. Defaults to false if not set.
      * Note that this applies when using an {@link
      * android.view.animation.AnimationSet AnimationSet} to chain
      * animations. The transformation is not applied before the AnimationSet
@@ -430,6 +463,8 @@ public abstract class Animation {
      *
      * @param fillAfter true if the animation should apply its transformation after it ends
      * @attr ref android.R.styleable#Animation_fillAfter
+     *
+     * @see #setFillEnabled(boolean) 
      */
     public void setFillAfter(boolean fillAfter) {
         mFillAfter = fillAfter;
@@ -623,9 +658,11 @@ public abstract class Animation {
             normalizedTime = currentTime < mStartTime ? 0.0f : 1.0f;
         }
 
-        boolean expired = normalizedTime >= 1.0f;
+        final boolean expired = normalizedTime >= 1.0f;
         mMore = !expired;
 
+        if (!mFillEnabled) normalizedTime = Math.max(Math.min(normalizedTime, 1.0f), 0.0f);
+
         if ((normalizedTime >= 0.0f || mFillBefore) && (normalizedTime <= 1.0f || mFillAfter)) {
             if (!mStarted) {
                 if (mListener != null) {
@@ -634,8 +671,7 @@ public abstract class Animation {
                 mStarted = true;
             }
 
-            // Pin time to 0.0 to 1.0 range
-            normalizedTime = Math.max(Math.min(normalizedTime, 1.0f), 0.0f);            
+            if (mFillEnabled) normalizedTime = Math.max(Math.min(normalizedTime, 1.0f), 0.0f);
 
             if (mCycleFlip) {
                 normalizedTime = 1.0f - normalizedTime;
index e92cbad..073b01c 100644 (file)
@@ -98,7 +98,7 @@ public class DefaultInputMethod implements InputMethod, InputMethodSession {
     public void hideSoftInput() {
     }
 
-    public void showSoftInput() {
+    public void showSoftInput(int flags) {
     }
 }
 
@@ -231,7 +231,7 @@ class SimpleInputMethod extends IInputMethod.Stub {
         }
     }
 
-    public void showSoftInput() {
+    public void showSoftInput(boolean blah) {
     }
     
     public void hideSoftInput() {
index ad61f94..c0e6590 100644 (file)
@@ -165,9 +165,20 @@ public interface InputMethod {
     public void revokeSession(InputMethodSession session);
     
     /**
+     * Flag for {@link #showSoftInput(int)}: this show has been explicitly
+     * requested by the user.  If not set, the system has decided it may be
+     * a good idea to show the input method based on a navigation operation
+     * in the UI.
+     */
+    public static final int SHOW_EXPLICIT = 0x00001;
+    
+    /**
      * Request that any soft input part of the input method be shown to the user.
+     * 
+     * @param flags Provide additional information about the show request.
+     * Currently may be 0 or have the bit {@link #SHOW_EXPLICIT} set.
      */
-    public void showSoftInput();
+    public void showSoftInput(int flags);
     
     /**
      * Request that any soft input part of the input method be hidden from the user.
index a9c46c3..a676234 100644 (file)
@@ -645,6 +645,13 @@ public final class InputMethodManager {
     }
     
     /**
+     * Flag for {@link #showSoftInput} to indicate that the this is an implicit
+     * request to show the input window, not as the result of a direct request
+     * by the user.  The window may not be shown in this case.
+     */
+    public static final int SHOW_IMPLICIT = 0x0001;
+    
+    /**
      * Explicitly request that the current input method's soft input area be
      * shown to the user, if needed.  Call this if the user interacts with
      * your view in such a way that they have expressed they would like to
@@ -652,21 +659,30 @@ public final class InputMethodManager {
      * 
      * @param view The currently focused view, which would like to receive
      * soft keyboard input.
+     * @param flags Provides additional operating flags.  Currently may be
+     * 0 or have the {@link #SHOW_IMPLICIT} bit set.
      */
-    public void showSoftInput(View view) {
+    public void showSoftInput(View view, int flags) {
         synchronized (mH) {
             if (mServedView != view) {
                 return;
             }
 
             try {
-                mService.showSoftInput(mClient);
+                mService.showSoftInput(mClient, flags);
             } catch (RemoteException e) {
             }
         }
     }
     
     /**
+     * Flag for {@link #hideSoftInputFromWindow} to indicate that the soft
+     * input window should only be hidden if it was not explicitly shown
+     * by the user.
+     */
+    public static final int HIDE_IMPLICIT_ONLY = 0x0001;
+    
+    /**
      * Request to hide the soft input window from the context of the window
      * that is currently accepting input.  This should be called as a result
      * of the user doing some actually than fairly explicitly requests to
@@ -674,15 +690,17 @@ public final class InputMethodManager {
      * 
      * @param windowToken The token of the window that is making the request,
      * as returned by {@link View#getWindowToken() View.getWindowToken()}.
+     * @param flags Provides additional operating flags.  Currently may be
+     * 0 or have the {@link #HIDE_IMPLICIT_ONLY} bit set.
      */
-    public void hideSoftInputFromWindow(IBinder windowToken) {
+    public void hideSoftInputFromWindow(IBinder windowToken, int flags) {
         synchronized (mH) {
             if (mServedView == null || mServedView.getWindowToken() != windowToken) {
                 return;
             }
 
             try {
-                mService.hideSoftInput(mClient);
+                mService.hideSoftInput(mClient, flags);
             } catch (RemoteException e) {
             }
         }
@@ -880,13 +898,14 @@ public final class InputMethodManager {
     
     void closeCurrentInput() {
         try {
-            mService.hideSoftInput(mClient);
+            mService.hideSoftInput(mClient, 0);
         } catch (RemoteException e) {
         }
     }
     
     /**
      * Called by ViewRoot the first time it gets window focus.
+     * @hide
      */
     public void onWindowFocus(View focusedView, int softInputMode,
             boolean first, int windowFlags) {
@@ -896,8 +915,10 @@ public final class InputMethodManager {
                     + " first=" + first + " flags=#"
                     + Integer.toHexString(windowFlags));
             try {
+                final boolean isTextEditor = focusedView != null &&
+                focusedView.onCheckIsTextEditor();
                 mService.windowGainedFocus(mClient, focusedView != null,
-                        softInputMode, first, windowFlags);
+                        isTextEditor, softInputMode, first, windowFlags);
             } catch (RemoteException e) {
             }
         }
@@ -987,13 +1008,16 @@ public final class InputMethodManager {
      * Close/hide the input method's soft input area, so the user no longer
      * sees it or can interact with it.  This can only be called
      * from the currently active input method, as validated by the given token.
+     * 
      * @param token Supplies the identifying token given to an input method
      * when it was started, which allows it to perform this operation on
      * itself.
+     * @param flags Provides additional operating flags.  Currently may be
+     * 0 or have the {@link #HIDE_IMPLICIT_ONLY} bit set.
      */
-    public void hideSoftInputFromInputMethod(IBinder token) {
+    public void hideSoftInputFromInputMethod(IBinder token, int flags) {
         try {
-            mService.hideMySoftInput(token);
+            mService.hideMySoftInput(token, flags);
         } catch (RemoteException e) {
             throw new RuntimeException(e);
         }
index 85cb8c0..685e352 100644 (file)
@@ -430,8 +430,9 @@ public /* package */ class MimeTypeMap {
             sMimeTypeMap.loadEntry("text/h323", "323", true);
             sMimeTypeMap.loadEntry("text/iuls", "uls", true);
             sMimeTypeMap.loadEntry("text/mathml", "mml", true);
-            sMimeTypeMap.loadEntry("text/plain", "asc", true);
+            // add it first so it will be the default for ExtensionFromMimeType
             sMimeTypeMap.loadEntry("text/plain", "txt", true);
+            sMimeTypeMap.loadEntry("text/plain", "asc", true);
             sMimeTypeMap.loadEntry("text/plain", "text", true);
             sMimeTypeMap.loadEntry("text/plain", "diff", true);
             sMimeTypeMap.loadEntry("text/plain", "pot", true);
@@ -469,6 +470,8 @@ public /* package */ class MimeTypeMap {
             sMimeTypeMap.loadEntry("text/x-tex", "cls", true);
             sMimeTypeMap.loadEntry("text/x-vcalendar", "vcs", true);
             sMimeTypeMap.loadEntry("text/x-vcard", "vcf", true);
+            sMimeTypeMap.loadEntry("video/3gpp", "3gp", false);
+            sMimeTypeMap.loadEntry("video/3gpp", "3g2", false);
             sMimeTypeMap.loadEntry("video/dl", "dl", false);
             sMimeTypeMap.loadEntry("video/dv", "dif", false);
             sMimeTypeMap.loadEntry("video/dv", "dv", false);
index bd910b5..f00238d 100644 (file)
@@ -2694,7 +2694,7 @@ public class WebView extends AbsoluteLayout
     private void displaySoftKeyboard() {
         InputMethodManager imm = (InputMethodManager)
                 getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
-        imm.showSoftInput(mTextEntry);
+        imm.showSoftInput(mTextEntry, 0);
     }
 
     // Used to register the global focus change listener one time to avoid
@@ -3066,6 +3066,13 @@ public class WebView extends AbsoluteLayout
         // Bubble up the key event as WebView doesn't handle it
         return false;
     }
+    
+    /**
+     * @hide
+     */
+    public void emulateShiftHeld() {
+        mShiftIsPressed = true;
+    }
 
     private boolean commitCopy() {
         boolean copiedSomething = false;
diff --git a/core/java/android/webkit/gears/ApacheHttpRequestAndroid.java b/core/java/android/webkit/gears/ApacheHttpRequestAndroid.java
new file mode 100644 (file)
index 0000000..0569255
--- /dev/null
@@ -0,0 +1,1122 @@
+// Copyright 2008, The Android Open Source Project
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//  1. Redistributions of source code must retain the above copyright notice,
+//     this list of conditions and the following disclaimer.
+//  2. Redistributions in binary form must reproduce the above copyright notice,
+//     this list of conditions and the following disclaimer in the documentation
+//     and/or other materials provided with the distribution.
+//  3. Neither the name of Google Inc. nor the names of its contributors may be
+//     used to endorse or promote products derived from this software without
+//     specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package android.webkit.gears;
+
+import android.net.http.Headers;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.util.Config;
+import android.util.Log;
+import android.webkit.CacheManager;
+import android.webkit.CacheManager.CacheResult;
+import android.webkit.CookieManager;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.IOException;
+import java.lang.StringBuilder;
+import java.util.Date;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import org.apache.http.Header;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.params.HttpClientParams;
+import org.apache.http.params.HttpParams;
+import org.apache.http.params.HttpConnectionParams;
+import org.apache.http.params.HttpProtocolParams;
+import org.apache.http.HttpResponse;
+import org.apache.http.entity.AbstractHttpEntity;
+import org.apache.http.client.*;
+import org.apache.http.client.methods.*;
+import org.apache.http.impl.client.AbstractHttpClient;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
+import org.apache.http.conn.ssl.StrictHostnameVerifier;
+import org.apache.http.impl.cookie.DateUtils;
+import org.apache.http.util.CharArrayBuffer;
+
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * Performs the underlying HTTP/HTTPS GET, POST, HEAD, PUT, DELETE requests.
+ * <p> These are performed synchronously (blocking). The caller should
+ * ensure that it is in a background thread if asynchronous behavior
+ * is required. All data is pushed, so there is no need for JNI native
+ * callbacks.
+ * <p> This uses Apache's HttpClient framework to perform most
+ * of the underlying network activity. The Android brower's cache,
+ * android.webkit.CacheManager, is also used when caching is enabled,
+ * and updated with new data. The android.webkit.CookieManager is also
+ * queried and updated as necessary.
+ * <p> The public interface is designed to be called by native code
+ * through JNI, and to simplify coding none of the public methods will
+ * surface a checked exception. Unchecked exceptions may still be
+ * raised but only if the system is in an ill state, such as out of
+ * memory.
+ * <p> TODO: This isn't plumbed into LocalServer yet. Mutually
+ * dependent on LocalServer - will attach the two together once both
+ * are submitted.
+ */
+public final class ApacheHttpRequestAndroid {
+    /** Debug logging tag. */
+    private static final String LOG_TAG = "Gears-J";
+    /** HTTP response header line endings are CR-LF style. */
+    private static final String HTTP_LINE_ENDING = "\r\n";
+    /** Safe MIME type to use whenever it isn't specified. */
+    private static final String DEFAULT_MIME_TYPE = "text/plain";
+    /** Case-sensitive header keys */
+    public static final String KEY_CONTENT_LENGTH = "Content-Length";
+    public static final String KEY_EXPIRES = "Expires";
+    public static final String KEY_LAST_MODIFIED = "Last-Modified";
+    public static final String KEY_ETAG = "ETag";
+    public static final String KEY_LOCATION = "Location";
+    public static final String KEY_CONTENT_TYPE = "Content-Type";
+    /** Number of bytes to send and receive on the HTTP connection in
+     * one go. */
+    private static final int BUFFER_SIZE = 4096;
+
+    /** The first element of the String[] value in a headers map is the
+     * unmodified (case-sensitive) key. */
+    public static final int HEADERS_MAP_INDEX_KEY = 0;
+    /** The second element of the String[] value in a headers map is the
+     * associated value. */
+    public static final int HEADERS_MAP_INDEX_VALUE = 1;
+
+    /** Request headers, as key -> value map. */
+    // TODO: replace this design by a simpler one (the C++ side has to
+    // be modified too), where we do not store both the original header
+    // and the lowercase one.
+    private Map<String, String[]> mRequestHeaders =
+        new HashMap<String, String[]>();
+    /** Response headers, as a lowercase key -> value map. */
+    private Map<String, String[]> mResponseHeaders =
+        new HashMap<String, String[]>();
+    /** The URL used for createCacheResult() */
+    private String mCacheResultUrl;
+    /** CacheResult being saved into, if inserting a new cache entry. */
+    private CacheResult mCacheResult;
+    /** Initialized by initChildThread(). Used to target abort(). */
+    private Thread mBridgeThread;
+
+    /** Our HttpClient */
+    private AbstractHttpClient mClient;
+    /** The HttpMethod associated with this request */
+    private HttpRequestBase mMethod;
+    /** The complete response line e.g "HTTP/1.0 200 OK" */
+    private String mResponseLine;
+    /** HTTP body stream, setup after connection. */
+    private InputStream mBodyInputStream;
+
+    /** HTTP Response Entity */
+    private HttpResponse mResponse;
+
+    /** Post Entity, used to stream the request to the server */
+    private StreamEntity mPostEntity = null;
+    /** Content lenght, mandatory when using POST */
+    private long mContentLength;
+
+    /** The request executes in a parallel thread */
+    private Thread mHttpThread = null;
+    /** protect mHttpThread, if interrupt() is called concurrently */
+    private Lock mHttpThreadLock = new ReentrantLock();
+    /** Flag set to true when the request thread is joined */
+    private boolean mConnectionFinished = false;
+    /** Flag set to true by interrupt() and/or connection errors */
+    private boolean mConnectionFailed = false;
+    /** Lock protecting the access to mConnectionFailed */
+    private Lock mConnectionFailedLock = new ReentrantLock();
+
+    /** Lock on the loop in StreamEntity */
+    private Lock mStreamingReadyLock = new ReentrantLock();
+    /** Condition variable used to signal the loop is ready... */
+    private Condition mStreamingReady = mStreamingReadyLock.newCondition();
+
+    /** Used to pass around the block of data POSTed */
+    private Buffer mBuffer = new Buffer();
+    /** Used to signal that the block of data has been written */
+    private SignalConsumed mSignal = new SignalConsumed();
+
+    // inner classes
+
+    /**
+     * Implements the http request
+     */
+    class Connection implements Runnable {
+        public void run() {
+            boolean problem = false;
+            try {
+                if (Config.LOGV) {
+                    Log.i(LOG_TAG, "REQUEST : " + mMethod.getRequestLine());
+                }
+                mResponse = mClient.execute(mMethod);
+                if (mResponse != null) {
+                    if (Config.LOGV) {
+                        Log.i(LOG_TAG, "response (status line): "
+                              + mResponse.getStatusLine());
+                    }
+                    mResponseLine = "" + mResponse.getStatusLine();
+                } else {
+                    if (Config.LOGV) {
+                        Log.i(LOG_TAG, "problem, response == null");
+                    }
+                    problem = true;
+                }
+            } catch (IOException e) {
+                Log.e(LOG_TAG, "Connection IO exception ", e);
+                problem = true;
+            } catch (RuntimeException e) {
+                Log.e(LOG_TAG, "Connection runtime exception ", e);
+                problem = true;
+            }
+
+            if (!problem) {
+                if (Config.LOGV) {
+                    Log.i(LOG_TAG, "Request complete ("
+                          + mMethod.getRequestLine() + ")");
+                }
+            } else {
+                mConnectionFailedLock.lock();
+                mConnectionFailed = true;
+                mConnectionFailedLock.unlock();
+                if (Config.LOGV) {
+                    Log.i(LOG_TAG, "Request FAILED ("
+                          + mMethod.getRequestLine() + ")");
+                }
+                // We abort the execution in order to shutdown and release
+                // the underlying connection
+                mMethod.abort();
+                if (mPostEntity != null) {
+                    // If there is a post entity, we need to wake it up from
+                    // a potential deadlock
+                    mPostEntity.signalOutputStream();
+                }
+            }
+        }
+    }
+
+    /**
+     * simple buffer class implementing a producer/consumer model
+     */
+    class Buffer {
+        private DataPacket mPacket;
+        private boolean mEmpty = true;
+        public synchronized void put(DataPacket packet) {
+            while (!mEmpty) {
+                try {
+                    wait();
+                } catch (InterruptedException e) {
+                    if (Config.LOGV) {
+                        Log.i(LOG_TAG, "InterruptedException while putting " +
+                            "a DataPacket in the Buffer: " + e);
+                    }
+                }
+            }
+            mPacket = packet;
+            mEmpty = false;
+            notify();
+        }
+        public synchronized DataPacket get() {
+            while (mEmpty) {
+                try {
+                    wait();
+                } catch (InterruptedException e) {
+                    if (Config.LOGV) {
+                      Log.i(LOG_TAG, "InterruptedException while getting " +
+                          "a DataPacket in the Buffer: " + e);
+                    }
+                }
+            }
+            mEmpty = true;
+            notify();
+            return mPacket;
+        }
+    }
+
+    /**
+     * utility class used to block until the packet is signaled as being
+     * consumed
+     */
+    class SignalConsumed {
+        private boolean mConsumed = false;
+        public synchronized void waitUntilPacketConsumed() {
+            while (!mConsumed) {
+                try {
+                    wait();
+                } catch (InterruptedException e) {
+                    if (Config.LOGV) {
+                        Log.i(LOG_TAG, "InterruptedException while waiting " +
+                            "until a DataPacket is consumed: " + e);
+                    }
+                }
+            }
+            mConsumed = false;
+            notify();
+        }
+        public synchronized void packetConsumed() {
+            while (mConsumed) {
+                try {
+                    wait();
+                } catch (InterruptedException e) {
+                    if (Config.LOGV) {
+                        Log.i(LOG_TAG, "InterruptedException while indicating "
+                              + "that the DataPacket has been consumed: " + e);
+                    }
+                }
+            }
+            mConsumed = true;
+            notify();
+        }
+    }
+
+    /**
+     * Utility class encapsulating a packet of data
+     */
+    class DataPacket {
+        private byte[] mContent;
+        private int mLength;
+        public DataPacket(byte[] content, int length) {
+            mContent = content;
+            mLength = length;
+        }
+        public byte[] getBytes() {
+            return mContent;
+        }
+        public int getLength() {
+            return mLength;
+        }
+    }
+
+    /**
+     * HttpEntity class to write the bytes received by the C++ thread
+     * on the connection outputstream, in a streaming way.
+     * This entity is executed in the request thread.
+     * The writeTo() method is automatically called by the
+     * HttpPost execution; upon reception, we loop while receiving
+     * the data packets from the main thread, until completion
+     * or error. When done, we flush the outputstream.
+     * The main thread (sendPostData()) also blocks until the
+     * outputstream is made available (or an error happens)
+     */
+    class StreamEntity implements HttpEntity {
+        private OutputStream mOutputStream;
+
+        // HttpEntity interface methods
+
+        public boolean isRepeatable() {
+            return false;
+        }
+
+        public boolean isChunked() {
+            return false;
+        }
+
+        public long getContentLength() {
+            return mContentLength;
+        }
+
+        public Header getContentType() {
+            return null;
+        }
+
+        public Header getContentEncoding() {
+            return null;
+        }
+
+        public InputStream getContent() throws IOException {
+            return null;
+        }
+
+        public void writeTo(final OutputStream out) throws IOException {
+            // We signal that the outputstream is available
+            mStreamingReadyLock.lock();
+            mOutputStream = out;
+            mStreamingReady.signal();
+            mStreamingReadyLock.unlock();
+
+            // We then loop waiting on messages to process.
+            boolean finished = false;
+            while (!finished) {
+                DataPacket packet = mBuffer.get();
+                if (packet == null) {
+                    finished = true;
+                } else {
+                    write(packet);
+                }
+                mSignal.packetConsumed();
+                mConnectionFailedLock.lock();
+                if (mConnectionFailed) {
+                    if (Config.LOGV) {
+                        Log.i(LOG_TAG, "stopping loop on error");
+                    }
+                    finished = true;
+                }
+                mConnectionFailedLock.unlock();
+            }
+            if (Config.LOGV) {
+                Log.i(LOG_TAG, "flushing the outputstream...");
+            }
+            mOutputStream.flush();
+        }
+
+        public boolean isStreaming() {
+            return true;
+        }
+
+        public void consumeContent() throws IOException {
+            // Nothing to release
+        }
+
+        // local methods
+
+        private void write(DataPacket packet) {
+            try {
+                if (mOutputStream == null) {
+                    if (Config.LOGV) {
+                        Log.i(LOG_TAG, "NO OUTPUT STREAM !!!");
+                    }
+                    return;
+                }
+                mOutputStream.write(packet.getBytes(), 0, packet.getLength());
+                mOutputStream.flush();
+            } catch (IOException e) {
+                if (Config.LOGV) {
+                    Log.i(LOG_TAG, "exc: " + e);
+                }
+                mConnectionFailedLock.lock();
+                mConnectionFailed = true;
+                mConnectionFailedLock.unlock();
+            }
+        }
+
+        public boolean isReady() {
+            mStreamingReadyLock.lock();
+            try {
+                if (mOutputStream == null) {
+                    mStreamingReady.await();
+                }
+            } catch (InterruptedException e) {
+                if (Config.LOGV) {
+                    Log.i(LOG_TAG, "InterruptedException in "
+                          + "StreamEntity::isReady() : ", e);
+                }
+            } finally {
+                mStreamingReadyLock.unlock();
+            }
+            if (mOutputStream == null) {
+                return false;
+            }
+            return true;
+        }
+
+        public void signalOutputStream() {
+            mStreamingReadyLock.lock();
+            mStreamingReady.signal();
+            mStreamingReadyLock.unlock();
+        }
+    }
+
+    /**
+     * Initialize mBridgeThread using the TLS value of
+     * Thread.currentThread(). Called on start up of the native child
+     * thread.
+     */
+    public synchronized void initChildThread() {
+        mBridgeThread = Thread.currentThread();
+    }
+
+    public void setContentLength(long length) {
+        mContentLength = length;
+    }
+
+    /**
+     * Analagous to the native-side HttpRequest::open() function. This
+     * initializes an underlying HttpClient method, but does
+     * not go to the wire. On success, this enables a call to send() to
+     * initiate the transaction.
+     *
+     * @param method    The HTTP method, e.g GET or POST.
+     * @param url       The URL to open.
+     * @return          True on success with a complete HTTP response.
+     *                  False on failure.
+     */
+    public synchronized boolean open(String method, String url) {
+        if (Config.LOGV) {
+            Log.i(LOG_TAG, "open " + method + " " + url);
+        }
+        // Create the client
+        if (mConnectionFailed) {
+            // interrupt() could have been called even before open()
+            return false;
+        }
+        mClient = new DefaultHttpClient();
+        mClient.setHttpRequestRetryHandler(
+            new DefaultHttpRequestRetryHandler(0, false));
+        mBodyInputStream = null;
+        mResponseLine = null;
+        mResponseHeaders = null;
+        mPostEntity = null;
+        mHttpThread = null;
+        mConnectionFailed = false;
+        mConnectionFinished = false;
+
+        // Create the method. We support everything that
+        // Apache HttpClient supports, apart from TRACE.
+        if ("GET".equalsIgnoreCase(method)) {
+            mMethod = new HttpGet(url);
+        } else if ("POST".equalsIgnoreCase(method)) {
+            mMethod = new HttpPost(url);
+            mPostEntity = new StreamEntity();
+            ((HttpPost)mMethod).setEntity(mPostEntity);
+        } else if ("HEAD".equalsIgnoreCase(method)) {
+            mMethod = new HttpHead(url);
+        } else if ("PUT".equalsIgnoreCase(method)) {
+            mMethod = new HttpPut(url);
+        } else if ("DELETE".equalsIgnoreCase(method)) {
+            mMethod = new HttpDelete(url);
+        } else {
+            if (Config.LOGV) {
+                Log.i(LOG_TAG, "Method " + method + " not supported");
+            }
+            return false;
+        }
+        HttpParams params = mClient.getParams();
+        // We handle the redirections C++-side
+        HttpClientParams.setRedirecting(params, false);
+        HttpProtocolParams.setUseExpectContinue(params, false);
+        return true;
+    }
+
+    /**
+     * We use this to start the connection thread (doing the method execute).
+     * We usually always return true here, as the connection will run its
+     * course in the thread.
+     * We only return false if interrupted beforehand -- if a connection
+     * problem happens, we will thus fail in either sendPostData() or
+     * parseHeaders().
+     */
+    public synchronized boolean connectToRemote() {
+        boolean ret = false;
+        applyRequestHeaders();
+        mConnectionFailedLock.lock();
+        if (!mConnectionFailed) {
+            mHttpThread = new Thread(new Connection());
+            mHttpThread.start();
+        }
+        ret = mConnectionFailed;
+        mConnectionFailedLock.unlock();
+        return !ret;
+    }
+
+    /**
+     * Get the complete response line of the HTTP request. Only valid on
+     * completion of the transaction.
+     * @return The complete HTTP response line, e.g "HTTP/1.0 200 OK".
+     */
+    public synchronized String getResponseLine() {
+        return mResponseLine;
+    }
+
+    /**
+     * Wait for the request thread completion
+     * (unless already finished)
+     */
+    private void waitUntilConnectionFinished() {
+        if (Config.LOGV) {
+            Log.i(LOG_TAG, "waitUntilConnectionFinished("
+                  + mConnectionFinished + ")");
+        }
+        if (!mConnectionFinished) {
+            if (mHttpThread != null) {
+                try {
+                    mHttpThread.join();
+                    mConnectionFinished = true;
+                    if (Config.LOGV) {
+                        Log.i(LOG_TAG, "http thread joined");
+                    }
+                } catch (InterruptedException e) {
+                    if (Config.LOGV) {
+                        Log.i(LOG_TAG, "interrupted: " + e);
+                    }
+                }
+            } else {
+                Log.e(LOG_TAG, ">>> Trying to join on mHttpThread " +
+                      "when it does not exist!");
+            }
+        }
+    }
+
+    // Headers handling
+
+    /**
+     * Receive all headers from the server and populate
+     * mResponseHeaders.
+     * @return True if headers are successfully received, False on
+     *         connection error.
+     */
+    public synchronized boolean parseHeaders() {
+        mConnectionFailedLock.lock();
+        if (mConnectionFailed) {
+            mConnectionFailedLock.unlock();
+            return false;
+        }
+        mConnectionFailedLock.unlock();
+        waitUntilConnectionFinished();
+        mResponseHeaders = new HashMap<String, String[]>();
+        if (mResponse == null)
+            return false;
+
+        Header[] headers = mResponse.getAllHeaders();
+        for (int i = 0; i < headers.length; i++) {
+            Header header = headers[i];
+            if (Config.LOGV) {
+                Log.i(LOG_TAG, "header " + header.getName()
+                      + " -> " + header.getValue());
+            }
+            setResponseHeader(header.getName(), header.getValue());
+        }
+
+        return true;
+    }
+
+    /**
+     * Set a header to send with the HTTP request. Will not take effect
+     * on a transaction already in progress. The key is associated
+     * case-insensitive, but stored case-sensitive.
+     * @param name  The name of the header, e.g "Set-Cookie".
+     * @param value The value for this header, e.g "text/html".
+     */
+    public synchronized void setRequestHeader(String name, String value) {
+        String[] mapValue = { name, value };
+        if (Config.LOGV) {
+            Log.i(LOG_TAG, "setRequestHeader: " + name + " => " + value);
+        }
+        if (name.equalsIgnoreCase(KEY_CONTENT_LENGTH)) {
+            setContentLength(Long.parseLong(value));
+        } else {
+            mRequestHeaders.put(name.toLowerCase(), mapValue);
+        }
+    }
+
+    /**
+     * Returns the value associated with the given request header.
+     * @param name The name of the request header, non-null, case-insensitive.
+     * @return The value associated with the request header, or null if
+     *         not set, or error.
+     */
+    public synchronized String getRequestHeader(String name) {
+        String[] value = mRequestHeaders.get(name.toLowerCase());
+        if (value != null) {
+            return value[HEADERS_MAP_INDEX_VALUE];
+        } else {
+            return null;
+        }
+    }
+
+    private void applyRequestHeaders() {
+        if (mMethod == null)
+            return;
+        Iterator<String[]> it = mRequestHeaders.values().iterator();
+        while (it.hasNext()) {
+            // Set the key case-sensitive.
+            String[] entry = it.next();
+            if (Config.LOGV) {
+                Log.i(LOG_TAG, "apply header " + entry[HEADERS_MAP_INDEX_KEY] +
+                    " => " + entry[HEADERS_MAP_INDEX_VALUE]);
+            }
+            mMethod.setHeader(entry[HEADERS_MAP_INDEX_KEY],
+                                     entry[HEADERS_MAP_INDEX_VALUE]);
+        }
+    }
+
+    /**
+     * Returns the value associated with the given response header.
+     * @param name The name of the response header, non-null, case-insensitive.
+     * @return The value associated with the response header, or null if
+     *         not set or error.
+     */
+    public synchronized String getResponseHeader(String name) {
+        if (mResponseHeaders != null) {
+            String[] value = mResponseHeaders.get(name.toLowerCase());
+            if (value != null) {
+                return value[HEADERS_MAP_INDEX_VALUE];
+            } else {
+                return null;
+            }
+        } else {
+            if (Config.LOGV) {
+                Log.i(LOG_TAG, "getResponseHeader() called but "
+                      + "response not received");
+            }
+            return null;
+        }
+    }
+
+    /**
+     * Return all response headers, separated by CR-LF line endings, and
+     * ending with a trailing blank line. This mimics the format of the
+     * raw response header up to but not including the body.
+     * @return A string containing the entire response header.
+     */
+    public synchronized String getAllResponseHeaders() {
+        if (mResponseHeaders == null) {
+            if (Config.LOGV) {
+                Log.i(LOG_TAG, "getAllResponseHeaders() called but "
+                      + "response not received");
+            }
+            return null;
+        }
+        StringBuilder result = new StringBuilder();
+        Iterator<String[]> it = mResponseHeaders.values().iterator();
+        while (it.hasNext()) {
+            String[] entry = it.next();
+            // Output the "key: value" lines.
+            result.append(entry[HEADERS_MAP_INDEX_KEY]);
+            result.append(": ");
+            result.append(entry[HEADERS_MAP_INDEX_VALUE]);
+            result.append(HTTP_LINE_ENDING);
+        }
+        result.append(HTTP_LINE_ENDING);
+        return result.toString();
+    }
+
+
+    /**
+     * Set a response header and associated value. The key is associated
+     * case-insensitively, but stored case-sensitively.
+     * @param name  Case sensitive request header key.
+     * @param value The associated value.
+     */
+    private void setResponseHeader(String name, String value) {
+        if (Config.LOGV) {
+            Log.i(LOG_TAG, "Set response header " + name + ": " + value);
+        }
+        String mapValue[] = { name, value };
+        mResponseHeaders.put(name.toLowerCase(), mapValue);
+    }
+
+    // Cookie handling
+
+    /**
+     * Get the cookie for the given URL.
+     * @param url The fully qualified URL.
+     * @return A string containing the cookie for the URL if it exists,
+     *         or null if not.
+     */
+    public static String getCookieForUrl(String url) {
+        // Get the cookie for this URL, set as a header
+        return CookieManager.getInstance().getCookie(url);
+    }
+
+    /**
+     * Set the cookie for the given URL.
+     * @param url    The fully qualified URL.
+     * @param cookie The new cookie value.
+     * @return A string containing the cookie for the URL if it exists,
+     *         or null if not.
+     */
+    public static void setCookieForUrl(String url, String cookie) {
+        // Get the cookie for this URL, set as a header
+        CookieManager.getInstance().setCookie(url, cookie);
+    }
+
+    // Cache handling
+
+    /**
+     * Perform a request using LocalServer if possible. Initializes
+     * class members so that receive() will obtain data from the stream
+     * provided by the response.
+     * @param url The fully qualified URL to try in LocalServer.
+     * @return True if the url was found and is now setup to receive.
+     *         False if not found, with no side-effect.
+     */
+    public synchronized boolean useLocalServerResult(String url) {
+        UrlInterceptHandlerGears handler =
+            UrlInterceptHandlerGears.getInstance();
+        if (handler == null) {
+            return false;
+        }
+        UrlInterceptHandlerGears.ServiceResponse serviceResponse =
+            handler.getServiceResponse(url, mRequestHeaders);
+        if (serviceResponse == null) {
+            if (Config.LOGV) {
+                Log.i(LOG_TAG, "No response in LocalServer");
+            }
+            return false;
+        }
+        // LocalServer will handle this URL. Initialize stream and
+        // response.
+        mBodyInputStream = serviceResponse.getInputStream();
+        mResponseLine = serviceResponse.getStatusLine();
+        mResponseHeaders = serviceResponse.getResponseHeaders();
+        if (Config.LOGV) {
+            Log.i(LOG_TAG, "Got response from LocalServer: " + mResponseLine);
+        }
+        return true;
+    }
+
+    /**
+     * Perform a request using the cache result if present. Initializes
+     * class members so that receive() will obtain data from the cache.
+     * @param url The fully qualified URL to try in the cache.
+     * @return True is the url was found and is now setup to receive
+     *         from cache. False if not found, with no side-effect.
+     */
+    public synchronized boolean useCacheResult(String url) {
+        // Try the browser's cache. CacheManager wants a Map<String, String>.
+        Map<String, String> cacheRequestHeaders = new HashMap<String, String>();
+        Iterator<Map.Entry<String, String[]>> it =
+            mRequestHeaders.entrySet().iterator();
+        while (it.hasNext()) {
+            Map.Entry<String, String[]> entry = it.next();
+            cacheRequestHeaders.put(
+                entry.getKey(),
+                entry.getValue()[HEADERS_MAP_INDEX_VALUE]);
+        }
+        CacheResult mCacheResult =
+            CacheManager.getCacheFile(url, cacheRequestHeaders);
+        if (mCacheResult == null) {
+            if (Config.LOGV) {
+                Log.i(LOG_TAG, "No CacheResult for " + url);
+            }
+            return false;
+        }
+        if (Config.LOGV) {
+            Log.i(LOG_TAG, "Got CacheResult from browser cache");
+        }
+        // Check for expiry. -1 is "never", otherwise milliseconds since 1970.
+        // Can be compared to System.currentTimeMillis().
+        long expires = mCacheResult.getExpires();
+        if (expires >= 0 && System.currentTimeMillis() >= expires) {
+            if (Config.LOGV) {
+                Log.i(LOG_TAG, "CacheResult expired "
+                    + (System.currentTimeMillis() - expires)
+                    + " milliseconds ago");
+            }
+            // Cache hit has expired. Do not return it.
+            return false;
+        }
+        // Setup the mBodyInputStream to come from the cache.
+        mBodyInputStream = mCacheResult.getInputStream();
+        if (mBodyInputStream == null) {
+            // Cache result may have gone away.
+            if (Config.LOGV) {
+                Log.i(LOG_TAG, "No mBodyInputStream for CacheResult " + url);
+            }
+            return false;
+        }
+        // Cache hit. Parse headers.
+        synthesizeHeadersFromCacheResult(mCacheResult);
+        return true;
+    }
+
+    /**
+     * Take the limited set of headers in a CacheResult and synthesize
+     * response headers.
+     * @param cacheResult A CacheResult to populate mResponseHeaders with.
+     */
+    private void synthesizeHeadersFromCacheResult(CacheResult cacheResult) {
+        int statusCode = cacheResult.getHttpStatusCode();
+        // The status message is informal, so we can greatly simplify it.
+        String statusMessage;
+        if (statusCode >= 200 && statusCode < 300) {
+            statusMessage = "OK";
+        } else if (statusCode >= 300 && statusCode < 400) {
+            statusMessage = "MOVED";
+        } else {
+            statusMessage = "UNAVAILABLE";
+        }
+        // Synthesize the response line.
+        mResponseLine = "HTTP/1.1 " + statusCode + " " + statusMessage;
+        if (Config.LOGV) {
+            Log.i(LOG_TAG, "Synthesized " + mResponseLine);
+        }
+        // Synthesize the returned headers from cache.
+        mResponseHeaders = new HashMap<String, String[]>();
+        String contentLength = Long.toString(cacheResult.getContentLength());
+        setResponseHeader(KEY_CONTENT_LENGTH, contentLength);
+        long expires = cacheResult.getExpires();
+        if (expires >= 0) {
+            // "Expires" header is valid and finite. Milliseconds since 1970
+            // epoch, formatted as RFC-1123.
+            String expiresString = DateUtils.formatDate(new Date(expires));
+            setResponseHeader(KEY_EXPIRES, expiresString);
+        }
+        String lastModified = cacheResult.getLastModified();
+        if (lastModified != null) {
+            // Last modification time of the page. Passed end-to-end, but
+            // not used by us.
+            setResponseHeader(KEY_LAST_MODIFIED, lastModified);
+        }
+        String eTag = cacheResult.getETag();
+        if (eTag != null) {
+            // Entity tag. A kind of GUID to identify identical resources.
+            setResponseHeader(KEY_ETAG, eTag);
+        }
+        String location = cacheResult.getLocation();
+        if (location != null) {
+            // If valid, refers to the location of a redirect.
+            setResponseHeader(KEY_LOCATION, location);
+        }
+        String mimeType = cacheResult.getMimeType();
+        if (mimeType == null) {
+            // Use a safe default MIME type when none is
+            // specified. "text/plain" is safe to render in the browser
+            // window (even if large) and won't be intepreted as anything
+            // that would cause execution.
+            mimeType = DEFAULT_MIME_TYPE;
+        }
+        String encoding = cacheResult.getEncoding();
+        // Encoding may not be specified. No default.
+        String contentType = mimeType;
+        if (encoding != null) {
+            if (encoding.length() > 0) {
+                contentType += "; charset=" + encoding;
+            }
+        }
+        setResponseHeader(KEY_CONTENT_TYPE, contentType);
+    }
+
+    /**
+     * Create a CacheResult for this URL. This enables the repsonse body
+     * to be sent in calls to appendCacheResult().
+     * @param url          The fully qualified URL to add to the cache.
+     * @param responseCode The response code returned for the request, e.g 200.
+     * @param mimeType     The MIME type of the body, e.g "text/plain".
+     * @param encoding     The encoding, e.g "utf-8". Use "" for unknown.
+     */
+    public synchronized boolean createCacheResult(
+        String url, int responseCode, String mimeType, String encoding) {
+        if (Config.LOGV) {
+            Log.i(LOG_TAG, "Making cache entry for " + url);
+        }
+        // Take the headers and parse them into a format needed by
+        // CacheManager.
+        Headers cacheHeaders = new Headers();
+        Iterator<Map.Entry<String, String[]>> it =
+            mResponseHeaders.entrySet().iterator();
+        while (it.hasNext()) {
+            Map.Entry<String, String[]> entry = it.next();
+            // Headers.parseHeader() expects lowercase keys.
+            String keyValue = entry.getKey() + ": "
+                + entry.getValue()[HEADERS_MAP_INDEX_VALUE];
+            CharArrayBuffer buffer = new CharArrayBuffer(keyValue.length());
+            buffer.append(keyValue);
+            // Parse it into the header container.
+            cacheHeaders.parseHeader(buffer);
+        }
+        mCacheResult = CacheManager.createCacheFile(
+            url, responseCode, cacheHeaders, mimeType, true);
+        if (mCacheResult != null) {
+            if (Config.LOGV) {
+                Log.i(LOG_TAG, "Saving into cache");
+            }
+            mCacheResult.setEncoding(encoding);
+            mCacheResultUrl = url;
+            return true;
+        } else {
+            if (Config.LOGV) {
+                Log.i(LOG_TAG, "Couldn't create mCacheResult");
+            }
+            return false;
+        }
+    }
+
+    /**
+     * Add data from the response body to the CacheResult created with
+     * createCacheResult().
+     * @param data  A byte array of the next sequential bytes in the
+     *              response body.
+     * @param bytes The number of bytes to write from the start of
+     *              the array.
+     * @return True if all bytes successfully written, false on failure.
+     */
+    public synchronized boolean appendCacheResult(byte[] data, int bytes) {
+        if (mCacheResult == null) {
+            if (Config.LOGV) {
+                Log.i(LOG_TAG, "appendCacheResult() called without a "
+                      + "CacheResult initialized");
+            }
+            return false;
+        }
+        try {
+            mCacheResult.getOutputStream().write(data, 0, bytes);
+        } catch (IOException ex) {
+            if (Config.LOGV) {
+                Log.i(LOG_TAG, "Got IOException writing cache data: " + ex);
+            }
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Save the completed CacheResult into the CacheManager. This must
+     * have been created first with createCacheResult().
+     * @return Returns true if the entry has been successfully saved.
+     */
+    public synchronized boolean saveCacheResult() {
+        if (mCacheResult == null || mCacheResultUrl == null) {
+            if (Config.LOGV) {
+                Log.i(LOG_TAG, "Tried to save cache result but "
+                      + "createCacheResult not called");
+            }
+            return false;
+        }
+
+        if (Config.LOGV) {
+            Log.i(LOG_TAG, "Saving cache result");
+        }
+        CacheManager.saveCacheFile(mCacheResultUrl, mCacheResult);
+        mCacheResult = null;
+        mCacheResultUrl = null;
+        return true;
+    }
+
+
+   /**
+     * Interrupt a blocking IO operation. This will cause the child
+     * thread to expediently return from an operation if it was stuck at
+     * the time. Note that this inherently races, and unfortunately
+     * requires the caller to loop.
+     */
+    public synchronized void interrupt() {
+        if (Config.LOGV) {
+            Log.i(LOG_TAG, "INTERRUPT CALLED");
+        }
+        mConnectionFailedLock.lock();
+        mConnectionFailed = true;
+        mConnectionFailedLock.unlock();
+        if (mMethod != null) {
+            mMethod.abort();
+        }
+        if (mHttpThread != null) {
+            waitUntilConnectionFinished();
+        }
+    }
+
+    /**
+     * Receive the next sequential bytes of the response body after
+     * successful connection. This will receive up to the size of the
+     * provided byte array. If there is no body, this will return 0
+     * bytes on the first call after connection.
+     * @param  buf A pre-allocated byte array to receive data into.
+     * @return The number of bytes from the start of the array which
+     *         have been filled, 0 on EOF, or negative on error.
+     */
+    public synchronized int receive(byte[] buf) {
+        if (mBodyInputStream == null) {
+            // If this is the first call, setup the InputStream. This may
+            // fail if there were headers, but no body returned by the
+            // server.
+            try {
+                if (mResponse != null) {
+                    HttpEntity entity = mResponse.getEntity();
+                    mBodyInputStream = entity.getContent();
+                }
+            } catch (IOException inputException) {
+                if (Config.LOGV) {
+                    Log.i(LOG_TAG, "Failed to connect InputStream: "
+                          + inputException);
+                }
+                // Not unexpected. For example, 404 response return headers,
+                // and sometimes a body with a detailed error.
+            }
+            if (mBodyInputStream == null) {
+                // No error stream either. Treat as a 0 byte response.
+                if (Config.LOGV) {
+                    Log.i(LOG_TAG, "No InputStream");
+                }
+                return 0; // EOF.
+            }
+        }
+        int ret;
+        try {
+            int got = mBodyInputStream.read(buf);
+            if (got > 0) {
+                // Got some bytes, not EOF.
+                ret = got;
+            } else {
+                // EOF.
+                mBodyInputStream.close();
+                ret = 0;
+            }
+        } catch (IOException e) {
+            // An abort() interrupts us by calling close() on our stream.
+            if (Config.LOGV) {
+                Log.i(LOG_TAG, "Got IOException in mBodyInputStream.read(): ", e);
+            }
+            ret = -1;
+        }
+        return ret;
+    }
+
+    /**
+     * For POST method requests, send a stream of data provided by the
+     * native side in repeated callbacks.
+     * We put the data in mBuffer, and wait until it is consumed
+     * by the StreamEntity in the request thread.
+     * @param data  A byte array containing the data to sent, or null
+     *              if indicating EOF.
+     * @param bytes The number of bytes from the start of the array to
+     *              send, or 0 if indicating EOF.
+     * @return True if all bytes were successfully sent, false on error.
+     */
+    public boolean sendPostData(byte[] data, int bytes) {
+        mConnectionFailedLock.lock();
+        if (mConnectionFailed) {
+            mConnectionFailedLock.unlock();
+            return false;
+        }
+        mConnectionFailedLock.unlock();
+        if (mPostEntity == null) return false;
+
+        // We block until the outputstream is available
+        // (or in case of connection error)
+        if (!mPostEntity.isReady()) return false;
+
+        if (data == null && bytes == 0) {
+            mBuffer.put(null);
+        } else {
+            mBuffer.put(new DataPacket(data, bytes));
+        }
+        mSignal.waitUntilPacketConsumed();
+
+        mConnectionFailedLock.lock();
+        if (mConnectionFailed) {
+            Log.e(LOG_TAG, "failure");
+            mConnectionFailedLock.unlock();
+            return false;
+        }
+        mConnectionFailedLock.unlock();
+        return true;
+    }
+
+}
index c22023c..19ec77d 100644 (file)
@@ -696,7 +696,6 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
         setWillNotDraw(false);
         setAlwaysDrawnWithCacheEnabled(false);
         setScrollingCacheEnabled(true);
-        setScrollContainer(true);
     }
 
     private void useDefaultSelector() {
index 1591791..024b663 100644 (file)
@@ -514,8 +514,48 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
     protected CharSequence convertSelectionToString(Object selectedItem) {
         return mFilter.convertResultToString(selectedItem);
     }
+    
+    /**
+     * <p>Clear the list selection.  This may only be temporary, as user input will often bring 
+     * it back.
+     */
+    public void clearListSelection() {
+        if (mDropDownList != null) {
+            mDropDownList.hideSelector();
+            mDropDownList.requestLayout();
+        }
+    }
+    
+    /**
+     * Set the position of the dropdown view selection.
+     * 
+     * @param position The position to move the selector to.
+     */
+    public void setListSelection(int position) {
+        if (mPopup.isShowing() && (mDropDownList != null)) {
+            mDropDownList.setSelection(position);
+            // ListView.setSelection() will call requestLayout()
+        }
+    }
 
     /**
+     * Get the position of the dropdown view selection, if there is one.  Returns 
+     * {@link ListView#INVALID_POSITION ListView.INVALID_POSITION} if there is no dropdown or if
+     * there is no selection.
+     * 
+     * @return the position of the current selection, if there is one, or 
+     * {@link ListView#INVALID_POSITION ListView.INVALID_POSITION} if not.
+     * 
+     * @see ListView#getSelectedItemPosition()
+     */
+    public int getListSelection() {
+        if (mPopup.isShowing() && (mDropDownList != null)) {
+            return mDropDownList.getSelectedItemPosition();
+        }
+        return ListView.INVALID_POSITION;
+    }
+    
+    /**
      * <p>Starts filtering the content of the drop down list. The filtering
      * pattern is the content of the edit box. Subclasses should override this
      * method to filter with a different pattern, for instance a substring of
index 555f216..3d758e7 100644 (file)
@@ -242,6 +242,9 @@ public abstract class CursorAdapter extends BaseAdapter implements Filterable,
      * @param cursor the new cursor to be used
      */
     public void changeCursor(Cursor cursor) {
+        if (cursor == mCursor) {
+            return;
+        }
         if (mCursor != null) {
             mCursor.unregisterContentObserver(mChangeObserver);
             mCursor.unregisterDataSetObserver(mDataSetObserver);
index 49888f7..7f1601e 100644 (file)
@@ -42,6 +42,8 @@ public abstract class Filter {
     
     private Handler mThreadHandler;
     private Handler mResultHandler;
+    private String mConstraint;
+    private boolean mConstraintIsValid = false;
 
     /**
      * <p>Creates a new asynchronous filter.</p>
@@ -79,6 +81,14 @@ public abstract class Filter {
      */
     public final void filter(CharSequence constraint, FilterListener listener) {
         synchronized (this) {
+            String constraintAsString = constraint != null ? constraint.toString() : null;
+            if (mConstraintIsValid && (
+                    (constraintAsString == null && mConstraint == null) ||
+                    (constraintAsString != null && constraintAsString.equals(mConstraint)))) {
+                // nothing to do
+                return;
+            }
+
             if (mThreadHandler == null) {
                 HandlerThread thread = new HandlerThread(THREAD_NAME);
                 thread.start();
@@ -88,13 +98,18 @@ public abstract class Filter {
             Message message = mThreadHandler.obtainMessage(FILTER_TOKEN);
     
             RequestArguments args = new RequestArguments();
-            args.constraint = constraint;
+            // make sure we use an immutable copy of the constraint, so that
+            // it doesn't change while the filter operation is in progress
+            args.constraint = constraintAsString;
             args.listener = listener;
             message.obj = args;
     
             mThreadHandler.removeMessages(FILTER_TOKEN);
             mThreadHandler.removeMessages(FINISH_TOKEN);
             mThreadHandler.sendMessage(message);
+            
+            mConstraint = constraintAsString;
+            mConstraintIsValid = true;
         }
     }
 
index cabca40..7b9735c 100644 (file)
@@ -45,6 +45,9 @@ import android.widget.Scroller;
  * {@link android.R.styleable#Theme_galleryItemBackground} as the background for
  * each View given to the Gallery from the Adapter. If you are not doing this,
  * you may need to adjust some Gallery properties, such as the spacing.
+ * <p>
+ * Views given to the Gallery should use {@link Gallery.LayoutParams} as their
+ * layout parameters type.
  * 
  * @attr ref android.R.styleable#Gallery_animationDuration
  * @attr ref android.R.styleable#Gallery_spacing
index b5c4384..50248c1 100644 (file)
@@ -85,8 +85,10 @@ public class PopupWindow {
     
     private int mWidthMode;
     private int mWidth;
+    private int mLastWidth;
     private int mHeightMode;
     private int mHeight;
+    private int mLastHeight;
 
     private int mPopupWidth;
     private int mPopupHeight;
@@ -634,8 +636,8 @@ public class PopupWindow {
             mPopupView.refreshDrawableState();
         }
         mAboveAnchor = findDropDownPosition(anchor, p, xoff, yoff);
-        if (mHeightMode < 0) p.height = mHeightMode;
-        if (mWidthMode < 0) p.width = mWidthMode;
+        if (mHeightMode < 0) p.height = mLastHeight = mHeightMode;
+        if (mWidthMode < 0) p.width = mLastWidth = mWidthMode;
         p.windowAnimations = computeAnimationResource();
         invokePopup(p);
     }
@@ -708,8 +710,8 @@ public class PopupWindow {
         // by setting the x and y offsets to match the anchor's bottom
         // left corner
         p.gravity = Gravity.LEFT | Gravity.TOP;
-        p.width = mWidth;
-        p.height = mHeight;
+        p.width = mLastWidth = mWidth;
+        p.height = mLastHeight = mHeight;
         if (mBackground != null) {
             p.format = mBackground.getOpacity();
         } else {
@@ -953,15 +955,15 @@ public class PopupWindow {
 
         boolean update = false;
 
-        final int finalWidth = mWidthMode < 0 ? mWidthMode : p.width;
+        final int finalWidth = mWidthMode < 0 ? mWidthMode : mLastWidth;
         if (width != -1 && p.width != finalWidth) {
-            p.width = finalWidth;
+            p.width = mLastWidth = finalWidth;
             update = true;
         }
 
-        final int finalHeight = mHeightMode < 0 ? mHeightMode : p.height;
+        final int finalHeight = mHeightMode < 0 ? mHeightMode : mLastHeight;
         if (height != -1 && p.height != finalHeight) {
-            p.height = finalHeight;
+            p.height = mLastHeight = finalHeight;
             update = true;
         }
 
index a2133b2..20166cf 100644 (file)
@@ -125,18 +125,7 @@ public class ScrollView extends FrameLayout {
     private boolean mSmoothScrollingEnabled = true;
 
     public ScrollView(Context context) {
-        super(context);
-        initScrollView();
-
-        setVerticalScrollBarEnabled(true);
-        setVerticalFadingEdgeEnabled(true);
-
-        TypedArray a = context.obtainStyledAttributes(R.styleable.View);
-
-        initializeScrollbars(a);
-        initializeFadingEdge(a);
-
-        a.recycle();
+        this(context, null);
     }
 
     public ScrollView(Context context, AttributeSet attrs) {
@@ -199,7 +188,6 @@ public class ScrollView extends FrameLayout {
         setFocusable(true);
         setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
         setWillNotDraw(false);
-        setScrollContainer(true);
     }
 
     @Override
index 73c2b3e..8baed7d 100644 (file)
@@ -714,10 +714,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
                     bufferType = BufferType.EDITABLE;
                     break;
             }
-            mInputType = EditorInfo.TYPE_CLASS_TEXT;
         }
 
-        if (password) {
+        if (password && (mInputType&EditorInfo.TYPE_MASK_CLASS)
+                == EditorInfo.TYPE_CLASS_TEXT) {
             mInputType = (mInputType & ~(EditorInfo.TYPE_MASK_VARIATION))
                 | EditorInfo.TYPE_TEXT_VARIATION_PASSWORD;
         }
@@ -3772,8 +3772,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
         return super.onKeyUp(keyCode, event);
     }
 
+    @Override public boolean onCheckIsTextEditor() {
+        return mInputType != EditorInfo.TYPE_NULL;
+    }
+    
     @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
-        if (mInputType != EditorInfo.TYPE_NULL) {
+        if (onCheckIsTextEditor()) {
             if (mInputMethodState == null) {
                 mInputMethodState = new InputMethodState();
             }
@@ -5334,12 +5338,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
             mLayout != null) {
             boolean moved = mMovement.onTouchEvent(this, (Spannable) mText, event);
 
-            if (mText instanceof Editable
-                    && mInputType != EditorInfo.TYPE_NULL) {
+            if (mText instanceof Editable && onCheckIsTextEditor()) {
                 if (event.getAction() == MotionEvent.ACTION_UP && isFocused()) {
                     InputMethodManager imm = (InputMethodManager)
                             getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
-                    imm.showSoftInput(this);
+                    imm.showSoftInput(this, 0);
                 }
             }
 
index 989f972..5c44b2d 100644 (file)
@@ -27,7 +27,6 @@ import android.graphics.drawable.Drawable;
 import android.os.Handler;
 import android.os.Message;
 import android.text.TextUtils;
-import android.text.TextUtils.TruncateAt;
 import android.view.Gravity;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
@@ -172,11 +171,33 @@ public class AlertController {
         mHandler = new ButtonHandler(di);
     }
     
+    static boolean canTextInput(View v) {
+        if (v.onCheckIsTextEditor()) {
+            return true;
+        }
+        
+        if (!(v instanceof ViewGroup)) {
+            return false;
+        }
+        
+        ViewGroup vg = (ViewGroup)v;
+        int i = vg.getChildCount();
+        while (i > 0) {
+            i--;
+            v = vg.getChildAt(i);
+            if (canTextInput(v)) {
+                return true;
+            }
+        }
+        
+        return false;
+    }
+    
     public void installContent() {
         /* We use a custom title so never request a window title */
         mWindow.requestFeature(Window.FEATURE_NO_TITLE);
         
-        if (mView == null) {
+        if (mView == null || !canTextInput(mView)) {
             mWindow.setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
                     WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
         }
index e88a36f..a7081e3 100644 (file)
@@ -115,11 +115,15 @@ public class HandlerCaller {
         return mH.obtainMessage(what, 0, 0, arg1);
     }
     
+    public Message obtainMessageI(int what, int arg1) {
+        return mH.obtainMessage(what, arg1);
+    }
+    
     public Message obtainMessageIO(int what, int arg1, Object arg2) {
         return mH.obtainMessage(what, arg1, 0, arg2);
     }
     
-    public Message obtainMessageIO(int what, int arg1, int arg2, Object arg3) {
+    public Message obtainMessageIIO(int what, int arg1, int arg2, Object arg3) {
         return mH.obtainMessage(what, arg1, arg2, arg3);
     }
     
index 87bf473..f650713 100644 (file)
@@ -48,7 +48,7 @@ oneway interface IInputMethod {
     
     void revokeSession(IInputMethodSession session);
     
-    void showSoftInput();
+    void showSoftInput(boolean explicit);
     
     void hideSoftInput();
 }
index 1c9e797..2a15bdb 100644 (file)
@@ -37,15 +37,15 @@ interface IInputMethodManager {
     InputBindResult startInput(in IInputMethodClient client,
             in EditorInfo attribute, boolean initial, boolean needResult);
     void finishInput(in IInputMethodClient client);
-    void showSoftInput(in IInputMethodClient client);
-    void hideSoftInput(in IInputMethodClient client);
+    void showSoftInput(in IInputMethodClient client, int flags);
+    void hideSoftInput(in IInputMethodClient client, int flags);
     void windowGainedFocus(in IInputMethodClient client,
-            boolean viewHasFocus, int softInputMode, boolean first,
-            int windowFlags);
+            boolean viewHasFocus, boolean isTextEditor,
+            int softInputMode, boolean first, int windowFlags);
             
     void showInputMethodPickerFromClient(in IInputMethodClient client);
     void setInputMethod(in IBinder token, String id);
-    void hideMySoftInput(in IBinder token);
+    void hideMySoftInput(in IBinder token, int flags);
     void updateStatusIcon(int iconId, String iconPackage);
     
     boolean setInputMethodEnabled(String id, boolean enabled);
index 17f86d6..1d8e9c5 100644 (file)
@@ -30,6 +30,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
+import java.io.BufferedInputStream;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URLEncoder;
@@ -124,6 +125,7 @@ public class AndroidGDataClient implements GDataClient {
     public AndroidGDataClient(ContentResolver resolver) {
         mHttpClient = new GoogleHttpClient(resolver, USER_AGENT_APP_VERSION,
                 true /* gzip capable */);
+        mHttpClient.enableCurlLogging(TAG, Log.VERBOSE);
         mResolver = resolver;
     }
 
@@ -213,7 +215,7 @@ public class AndroidGDataClient implements GDataClient {
                 Log.w(TAG, "StatusLine is null.");
                 throw new NullPointerException("StatusLine is null -- should not happen.");
             }
-            
+
             if (Log.isLoggable(TAG, Log.DEBUG)) {
                 Log.d(TAG, response.getStatusLine().toString());
                 for (Header h : response.getAllHeaders()) {
@@ -225,7 +227,11 @@ public class AndroidGDataClient implements GDataClient {
             HttpEntity entity = response.getEntity();
 
             if ((status >= 200) && (status < 300) && entity != null) {
-                return AndroidHttpClient.getUngzippedContent(entity);
+                InputStream in = AndroidHttpClient.getUngzippedContent(entity);
+                if (Log.isLoggable(TAG, Log.DEBUG)) {
+                    in = logInputStreamContents(in);
+                }
+                return in;
             }
 
             // TODO: handle 301, 307?
@@ -308,6 +314,43 @@ public class AndroidGDataClient implements GDataClient {
         throw new IOException("Unable to access feed.");
     }
 
+    /**
+     * Log the contents of the input stream.
+     * The original input stream is consumed, so the caller must use the
+     * BufferedInputStream that is returned.
+     * @param in InputStream
+     * @return replacement input stream for caller to use
+     * @throws IOException
+     */
+    private InputStream logInputStreamContents(InputStream in) throws IOException {
+        if (in == null) {
+            return in;
+        }
+        // bufferSize is the (arbitrary) maximum amount to log.
+        // The original InputStream is wrapped in a
+        // BufferedInputStream with a 16K buffer.  This lets
+        // us read up to 16K, write it to the log, and then
+        // reset the stream so the the original client can
+        // then read the data.  The BufferedInputStream
+        // provides the mark and reset support, even when
+        // the original InputStream does not.
+        final int bufferSize = 16384;
+        BufferedInputStream bin = new BufferedInputStream(in, bufferSize);
+        bin.mark(bufferSize);
+        int wanted = bufferSize;
+        int totalReceived = 0;
+        byte buf[] = new byte[wanted];
+        while (wanted > 0) {
+            int got = bin.read(buf, totalReceived, wanted);
+            if (got <= 0) break; // EOF
+            wanted -= got;
+            totalReceived += got;
+        }
+        Log.d(TAG, new String(buf, 0, totalReceived, "UTF-8"));
+        bin.reset();
+        return bin;
+    }
+
     public InputStream getMediaEntryAsStream(String mediaEntryUrl, String authToken)
             throws HttpException, IOException {
 
index c074b69..32c3a54 100644 (file)
@@ -119,6 +119,7 @@ LOCAL_C_INCLUDES += \
        $(LOCAL_PATH)/android/graphics \
        $(call include-path-for, bluedroid) \
        $(call include-path-for, libhardware)/hardware \
+       $(call include-path-for, libhardware_legacy)/hardware_legacy \
        $(LOCAL_PATH)/../../include/ui \
        $(LOCAL_PATH)/../../include/utils \
        external/skia/include/core \
@@ -147,6 +148,7 @@ LOCAL_SHARED_LIBRARIES := \
        libdvm \
        libGLES_CM \
        libhardware \
+       libhardware_legacy \
        libsonivox \
        libcrypto \
        libssl \
@@ -167,6 +169,9 @@ endif
 ifneq ($(TARGET_SIMULATOR),true)
 LOCAL_SHARED_LIBRARIES += \
        libdl
+  # we need to access the private Bionic header
+  # <bionic_tls.h> in com_google_android_gles_jni_GLImpl.cpp
+  LOCAL_CFLAGS += -I$(LOCAL_PATH)/../../../../bionic/libc/private
 endif
 
 LOCAL_LDLIBS += -lpthread -ldl
index b615895..ff2ed5d 100644 (file)
@@ -59,7 +59,7 @@ static void native_execute(JNIEnv* env, jobject object)
 
     // Throw an exception if an error occured
     if (err != SQLITE_DONE) {
-        throw_sqlite3_exception_errcode(env, err, NULL);
+        throw_sqlite3_exception_errcode(env, err, sqlite3_errmsg(handle));
     }
 
     // Reset the statment so it's ready to use again
@@ -81,7 +81,7 @@ static jlong native_1x1_long(JNIEnv* env, jobject object)
         // No errors, read the data and return it
         value = sqlite3_column_int64(statement, 0);
     } else {
-        throw_sqlite3_exception_errcode(env, err, NULL);
+        throw_sqlite3_exception_errcode(env, err, sqlite3_errmsg(handle));
     }
 
     // Reset the statment so it's ready to use again
@@ -106,7 +106,7 @@ static jstring native_1x1_string(JNIEnv* env, jobject object)
         char const * text = (char const *)sqlite3_column_text(statement, 0);
         value = env->NewStringUTF(text);
     } else {
-        throw_sqlite3_exception_errcode(env, err, NULL);
+        throw_sqlite3_exception_errcode(env, err, sqlite3_errmsg(handle));
     }
 
     // Reset the statment so it's ready to use again
index 264cc51..dee3fdd 100644 (file)
@@ -18,7 +18,7 @@
 
 #include "JNIHelp.h"
 #include "jni.h"
-#include "hardware/gps.h"
+#include "hardware_legacy/gps.h"
 #include "utils/Log.h"
 #include "utils/misc.h"
 
index a302498..bc8af78 100644 (file)
@@ -14,9 +14,9 @@
  * limitations under the License.
 */
 
-#include <hardware/flashlight.h>
-#include <hardware/led.h>
-#include <hardware/power.h>
+#include <hardware_legacy/flashlight.h>
+#include <hardware_legacy/led.h>
+#include <hardware_legacy/power.h>
 
 #include <nativehelper/jni.h>
 #include <android_runtime/AndroidRuntime.h>
index 4e70f63..c2d75b1 100644 (file)
@@ -19,7 +19,7 @@
 #include "jni.h"
 #include "android_runtime/AndroidRuntime.h"
 #include <utils/misc.h>
-#include <hardware/power.h>
+#include <hardware_legacy/power.h>
 #include <sys/reboot.h>
 
 namespace android
index cac4372..7f31b00 100644 (file)
@@ -17,7 +17,7 @@
 #define LOG_TAG "UEventObserver"
 #include "utils/Log.h"
 
-#include "hardware/uevent.h"
+#include "hardware_legacy/uevent.h"
 #include "jni.h"
 #include "JNIHelp.h"
 #include "android_runtime/AndroidRuntime.h"
index 19ed39f..062f893 100644 (file)
@@ -270,11 +270,18 @@ static void onDisconnectSinkResult(DBusMessage *msg, void *user) {
     if (dbus_set_error_from_message(&err, msg)) {
         /* if (!strcmp(err.name, BLUEZ_DBUS_BASE_IFC ".Error.AuthenticationFailed")) */
         LOGE("%s: D-Bus error: %s (%s)\n", __FUNCTION__, err.name, err.message);
+        if (strcmp(err.name, "org.bluez.Error.NotConnected") == 0) {
+            // we were already disconnected, so report disconnect
+            env->CallVoidMethod(nat->me,
+                                method_onSinkDisconnected,
+                                env->NewStringUTF(c_path));
+        } else {
+            // Assume it is still connected
+            env->CallVoidMethod(nat->me,
+                                method_onSinkConnected,
+                                env->NewStringUTF(c_path));
+        }
         dbus_error_free(&err);
-        // Assume it is still connected
-        env->CallVoidMethod(nat->me,
-                            method_onSinkConnected,
-                            env->NewStringUTF(c_path));
         if (env->ExceptionCheck()) {
             LOGE("VM Exception occurred in native function %s (%s:%d)",
                  __FUNCTION__, __FILE__, __LINE__);
index bd08da3..2f48edf 100644 (file)
@@ -16,6 +16,7 @@ LOCAL_C_INCLUDES += \
 LOCAL_SHARED_LIBRARIES := \
        libcutils \
        libhardware \
+       libhardware_legacy \
        libnativehelper \
     libsystem_server \
        libutils \
index 479e57d..224ab18 100644 (file)
@@ -23,7 +23,7 @@
 #include "android_runtime/AndroidRuntime.h"
 #include <utils/misc.h>
 #include <utils/Log.h>
-#include <hardware/vibrator.h>
+#include <hardware_legacy/vibrator.h>
 
 namespace android
 {
index 5e8a084..572a266 100644 (file)
@@ -24,9 +24,9 @@
     <scale android:fromXScale="2.0" android:toXScale="1.0"
            android:fromYScale="2.0" android:toYScale="1.0"
            android:pivotX="50%" android:pivotY="50%"
-           android:duration="200" />
+           android:duration="100" />
     -->
-    <translate android:fromYDelta="100%" android:toYDelta="0" android:duration="200"/>
-    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
-            android:duration="200" />
+    <translate android:fromYDelta="20%" android:toYDelta="0" android:duration="100"/>
+    <alpha android:fromAlpha="0.5" android:toAlpha="1.0"
+            android:duration="100" />
 </set>
index 843cb18..d28313a 100644 (file)
 -->
 <set xmlns:android="http://schemas.android.com/apk/res/android"
         android:interpolator="@anim/accelerate_interpolator">
-    <!--
+    <!-- 
     <scale android:fromXScale="1.0" android:toXScale="2.0"
            android:fromYScale="1.0" android:toYScale="2.0"
            android:pivotX="50%" android:pivotY="50%"
-           android:duration="200" />
+           android:duration="100" />
     -->
-    <translate android:fromYDelta="0" android:toYDelta="100%" android:duration="200"/>
+    <translate android:fromYDelta="0" android:toYDelta="20%" android:duration="100"/>
     <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
-            android:duration="200"/>
+            android:duration="100"/>
 </set>
diff --git a/core/res/res/drawable/btn_code_lock_default_trackball_selected.png b/core/res/res/drawable/btn_code_lock_default_trackball_selected.png
deleted file mode 100755 (executable)
index 2e696c6..0000000
Binary files a/core/res/res/drawable/btn_code_lock_default_trackball_selected.png and /dev/null differ
diff --git a/core/res/res/drawable/btn_default_longpress.9.png b/core/res/res/drawable/btn_default_longpress.9.png
deleted file mode 100644 (file)
index d42ae0b..0000000
Binary files a/core/res/res/drawable/btn_default_longpress.9.png and /dev/null differ
diff --git a/core/res/res/drawable/btn_default_small_longpress.9.png b/core/res/res/drawable/btn_default_small_longpress.9.png
deleted file mode 100644 (file)
index 63c28c0..0000000
Binary files a/core/res/res/drawable/btn_default_small_longpress.9.png and /dev/null differ
diff --git a/core/res/res/drawable/btn_dialog_disable_focused.png b/core/res/res/drawable/btn_dialog_disable_focused.png
deleted file mode 100755 (executable)
index 23545ca..0000000
Binary files a/core/res/res/drawable/btn_dialog_disable_focused.png and /dev/null differ
diff --git a/core/res/res/drawable/btn_dropdown_disabled.9.png b/core/res/res/drawable/btn_dropdown_disabled.9.png
deleted file mode 100644 (file)
index 529511a..0000000
Binary files a/core/res/res/drawable/btn_dropdown_disabled.9.png and /dev/null differ
diff --git a/core/res/res/drawable/btn_dropdown_down.9.png b/core/res/res/drawable/btn_dropdown_down.9.png
deleted file mode 100644 (file)
index 9464139..0000000
Binary files a/core/res/res/drawable/btn_dropdown_down.9.png and /dev/null differ
diff --git a/core/res/res/drawable/btn_flicker_minus.png b/core/res/res/drawable/btn_flicker_minus.png
deleted file mode 100755 (executable)
index 9001654..0000000
Binary files a/core/res/res/drawable/btn_flicker_minus.png and /dev/null differ
diff --git a/core/res/res/drawable/btn_flicker_plus.png b/core/res/res/drawable/btn_flicker_plus.png
deleted file mode 100755 (executable)
index 2d34a46..0000000
Binary files a/core/res/res/drawable/btn_flicker_plus.png and /dev/null differ
diff --git a/core/res/res/drawable/btn_keyboard_key_longpress.9.png b/core/res/res/drawable/btn_keyboard_key_longpress.9.png
deleted file mode 100644 (file)
index a62a60d..0000000
Binary files a/core/res/res/drawable/btn_keyboard_key_longpress.9.png and /dev/null differ
diff --git a/core/res/res/drawable/btn_keyboard_key_longpress_off.9.png b/core/res/res/drawable/btn_keyboard_key_longpress_off.9.png
deleted file mode 100644 (file)
index f03f29c..0000000
Binary files a/core/res/res/drawable/btn_keyboard_key_longpress_off.9.png and /dev/null differ
diff --git a/core/res/res/drawable/btn_keyboard_key_longpress_on.9.png b/core/res/res/drawable/btn_keyboard_key_longpress_on.9.png
deleted file mode 100644 (file)
index 90e572a..0000000
Binary files a/core/res/res/drawable/btn_keyboard_key_longpress_on.9.png and /dev/null differ
diff --git a/core/res/res/drawable/btn_radio_off_disable.png b/core/res/res/drawable/btn_radio_off_disable.png
deleted file mode 100755 (executable)
index 166a9f3..0000000
Binary files a/core/res/res/drawable/btn_radio_off_disable.png and /dev/null differ
diff --git a/core/res/res/drawable/btn_radio_off_disable_focused.png b/core/res/res/drawable/btn_radio_off_disable_focused.png
deleted file mode 100755 (executable)
index cdec0c3..0000000
Binary files a/core/res/res/drawable/btn_radio_off_disable_focused.png and /dev/null differ
diff --git a/core/res/res/drawable/btn_radio_off_longpress.png b/core/res/res/drawable/btn_radio_off_longpress.png
deleted file mode 100644 (file)
index 8938ae4..0000000
Binary files a/core/res/res/drawable/btn_radio_off_longpress.png and /dev/null differ
diff --git a/core/res/res/drawable/btn_radio_on_disable.png b/core/res/res/drawable/btn_radio_on_disable.png
deleted file mode 100755 (executable)
index 26c75f8..0000000
Binary files a/core/res/res/drawable/btn_radio_on_disable.png and /dev/null differ
diff --git a/core/res/res/drawable/btn_radio_on_disable_focused.png b/core/res/res/drawable/btn_radio_on_disable_focused.png
deleted file mode 100755 (executable)
index 12b9b91..0000000
Binary files a/core/res/res/drawable/btn_radio_on_disable_focused.png and /dev/null differ
diff --git a/core/res/res/drawable/btn_radio_on_longpress.png b/core/res/res/drawable/btn_radio_on_longpress.png
deleted file mode 100644 (file)
index 8588977..0000000
Binary files a/core/res/res/drawable/btn_radio_on_longpress.png and /dev/null differ
diff --git a/core/res/res/drawable/btn_star_big_off_longpress.png b/core/res/res/drawable/btn_star_big_off_longpress.png
deleted file mode 100755 (executable)
index 8b9815a..0000000
Binary files a/core/res/res/drawable/btn_star_big_off_longpress.png and /dev/null differ
diff --git a/core/res/res/drawable/btn_star_big_on_longpress.png b/core/res/res/drawable/btn_star_big_on_longpress.png
deleted file mode 100755 (executable)
index fbedb53..0000000
Binary files a/core/res/res/drawable/btn_star_big_on_longpress.png and /dev/null differ
diff --git a/core/res/res/drawable/btn_white_longpress.9.png b/core/res/res/drawable/btn_white_longpress.9.png
deleted file mode 100644 (file)
index 546e5de..0000000
Binary files a/core/res/res/drawable/btn_white_longpress.9.png and /dev/null differ
diff --git a/core/res/res/drawable/contextual_menu_bottom_bright.9.png b/core/res/res/drawable/contextual_menu_bottom_bright.9.png
deleted file mode 100644 (file)
index 2b222fa..0000000
Binary files a/core/res/res/drawable/contextual_menu_bottom_bright.9.png and /dev/null differ
diff --git a/core/res/res/drawable/contextual_menu_top_dark.9.png b/core/res/res/drawable/contextual_menu_top_dark.9.png
deleted file mode 100644 (file)
index 69a59ea..0000000
Binary files a/core/res/res/drawable/contextual_menu_top_dark.9.png and /dev/null differ
diff --git a/core/res/res/drawable/editbox_dropdown_arrowdown.png b/core/res/res/drawable/editbox_dropdown_arrowdown.png
deleted file mode 100644 (file)
index 82dc409..0000000
Binary files a/core/res/res/drawable/editbox_dropdown_arrowdown.png and /dev/null differ
diff --git a/core/res/res/drawable/editbox_dropdown_arrowup.png b/core/res/res/drawable/editbox_dropdown_arrowup.png
deleted file mode 100644 (file)
index a84512a..0000000
Binary files a/core/res/res/drawable/editbox_dropdown_arrowup.png and /dev/null differ
diff --git a/core/res/res/drawable/grey_list_separator.9.png b/core/res/res/drawable/grey_list_separator.9.png
deleted file mode 100644 (file)
index 8a1a336..0000000
Binary files a/core/res/res/drawable/grey_list_separator.9.png and /dev/null differ
diff --git a/core/res/res/drawable/highlight_disabled_pressed.9.png b/core/res/res/drawable/highlight_disabled_pressed.9.png
deleted file mode 100644 (file)
index ee35d39..0000000
Binary files a/core/res/res/drawable/highlight_disabled_pressed.9.png and /dev/null differ
diff --git a/core/res/res/drawable/highlight_pressed_dimmed.9.png b/core/res/res/drawable/highlight_pressed_dimmed.9.png
deleted file mode 100644 (file)
index dad714b..0000000
Binary files a/core/res/res/drawable/highlight_pressed_dimmed.9.png and /dev/null differ
diff --git a/core/res/res/drawable/ic_check_mark_dark.png b/core/res/res/drawable/ic_check_mark_dark.png
deleted file mode 100644 (file)
index 7de2553..0000000
Binary files a/core/res/res/drawable/ic_check_mark_dark.png and /dev/null differ
diff --git a/core/res/res/drawable/ic_check_mark_light.png b/core/res/res/drawable/ic_check_mark_light.png
deleted file mode 100644 (file)
index 137696e..0000000
Binary files a/core/res/res/drawable/ic_check_mark_light.png and /dev/null differ
diff --git a/core/res/res/drawable/indicator_show_current_selected_dark.png b/core/res/res/drawable/indicator_show_current_selected_dark.png
deleted file mode 100755 (executable)
index 9c77920..0000000
Binary files a/core/res/res/drawable/indicator_show_current_selected_dark.png and /dev/null differ
diff --git a/core/res/res/drawable/lock_asset.png b/core/res/res/drawable/lock_asset.png
deleted file mode 100644 (file)
index 5d52537..0000000
Binary files a/core/res/res/drawable/lock_asset.png and /dev/null differ
diff --git a/core/res/res/drawable/panel_picture_frame_bg_disabled.9.png b/core/res/res/drawable/panel_picture_frame_bg_disabled.9.png
deleted file mode 100644 (file)
index 786b361..0000000
Binary files a/core/res/res/drawable/panel_picture_frame_bg_disabled.9.png and /dev/null differ
diff --git a/core/res/res/drawable/pickerbox_divider.png b/core/res/res/drawable/pickerbox_divider.png
deleted file mode 100644 (file)
index 2e82f66..0000000
Binary files a/core/res/res/drawable/pickerbox_divider.png and /dev/null differ
diff --git a/core/res/res/drawable/popup_divider_horizontal_dark.9.png b/core/res/res/drawable/popup_divider_horizontal_dark.9.png
deleted file mode 100644 (file)
index b69619b..0000000
Binary files a/core/res/res/drawable/popup_divider_horizontal_dark.9.png and /dev/null differ
diff --git a/core/res/res/drawable/progress_frame.9.png b/core/res/res/drawable/progress_frame.9.png
deleted file mode 100644 (file)
index 70bd484..0000000
Binary files a/core/res/res/drawable/progress_frame.9.png and /dev/null differ
diff --git a/core/res/res/drawable/progress_inner.9.png b/core/res/res/drawable/progress_inner.9.png
deleted file mode 100644 (file)
index 1db9b65..0000000
Binary files a/core/res/res/drawable/progress_inner.9.png and /dev/null differ
diff --git a/core/res/res/drawable/progress_particle_small.png b/core/res/res/drawable/progress_particle_small.png
deleted file mode 100644 (file)
index 397d8ac..0000000
Binary files a/core/res/res/drawable/progress_particle_small.png and /dev/null differ
diff --git a/core/res/res/drawable/screen_title_background.9.png b/core/res/res/drawable/screen_title_background.9.png
deleted file mode 100644 (file)
index fed37b8..0000000
Binary files a/core/res/res/drawable/screen_title_background.9.png and /dev/null differ
diff --git a/core/res/res/drawable/scroll_thumb_horz.9.png b/core/res/res/drawable/scroll_thumb_horz.9.png
deleted file mode 100644 (file)
index 5c7db1a..0000000
Binary files a/core/res/res/drawable/scroll_thumb_horz.9.png and /dev/null differ
diff --git a/core/res/res/drawable/scroll_thumb_vert.9.png b/core/res/res/drawable/scroll_thumb_vert.9.png
deleted file mode 100644 (file)
index ef660c3..0000000
Binary files a/core/res/res/drawable/scroll_thumb_vert.9.png and /dev/null differ
diff --git a/core/res/res/drawable/scrollbar.9.png b/core/res/res/drawable/scrollbar.9.png
deleted file mode 100644 (file)
index 6e2268b..0000000
Binary files a/core/res/res/drawable/scrollbar.9.png and /dev/null differ
diff --git a/core/res/res/drawable/spinnerbox_background_focus_yellow.9.png b/core/res/res/drawable/spinnerbox_background_focus_yellow.9.png
deleted file mode 100644 (file)
index f1b8692..0000000
Binary files a/core/res/res/drawable/spinnerbox_background_focus_yellow.9.png and /dev/null differ
diff --git a/core/res/res/drawable/spinnerbox_background_normal.9.png b/core/res/res/drawable/spinnerbox_background_normal.9.png
deleted file mode 100644 (file)
index c64de3c..0000000
Binary files a/core/res/res/drawable/spinnerbox_background_normal.9.png and /dev/null differ
diff --git a/core/res/res/drawable/spinnerbox_background_pressed_yellow.9.png b/core/res/res/drawable/spinnerbox_background_pressed_yellow.9.png
deleted file mode 100644 (file)
index 984d2b8..0000000
Binary files a/core/res/res/drawable/spinnerbox_background_pressed_yellow.9.png and /dev/null differ
diff --git a/core/res/res/drawable/starting_frame.9.png b/core/res/res/drawable/starting_frame.9.png
deleted file mode 100644 (file)
index 4b2b78c..0000000
Binary files a/core/res/res/drawable/starting_frame.9.png and /dev/null differ
diff --git a/core/res/res/drawable/stat_notify_browser.png b/core/res/res/drawable/stat_notify_browser.png
deleted file mode 100644 (file)
index f08534b..0000000
Binary files a/core/res/res/drawable/stat_notify_browser.png and /dev/null differ
diff --git a/core/res/res/drawable/stat_notify_xmpp.png b/core/res/res/drawable/stat_notify_xmpp.png
deleted file mode 100644 (file)
index dc79203..0000000
Binary files a/core/res/res/drawable/stat_notify_xmpp.png and /dev/null differ
diff --git a/core/res/res/drawable/status_bar_item_clear_background.9.png b/core/res/res/drawable/status_bar_item_clear_background.9.png
deleted file mode 100644 (file)
index e3036e6..0000000
Binary files a/core/res/res/drawable/status_bar_item_clear_background.9.png and /dev/null differ
diff --git a/core/res/res/drawable/status_bar_shadow_bar.9.png b/core/res/res/drawable/status_bar_shadow_bar.9.png
deleted file mode 100644 (file)
index 9c4463c..0000000
Binary files a/core/res/res/drawable/status_bar_shadow_bar.9.png and /dev/null differ
diff --git a/core/res/res/drawable/sub_menu_bottom_bright.9.png b/core/res/res/drawable/sub_menu_bottom_bright.9.png
deleted file mode 100644 (file)
index ce93435..0000000
Binary files a/core/res/res/drawable/sub_menu_bottom_bright.9.png and /dev/null differ
diff --git a/core/res/res/drawable/sub_menu_top_dark.9.png b/core/res/res/drawable/sub_menu_top_dark.9.png
deleted file mode 100644 (file)
index 9e82fe9..0000000
Binary files a/core/res/res/drawable/sub_menu_top_dark.9.png and /dev/null differ
diff --git a/core/res/res/drawable/submenu_arrow_back.png b/core/res/res/drawable/submenu_arrow_back.png
deleted file mode 100644 (file)
index 733aa13..0000000
Binary files a/core/res/res/drawable/submenu_arrow_back.png and /dev/null differ
diff --git a/core/res/res/drawable/submenu_arrow_focus.png b/core/res/res/drawable/submenu_arrow_focus.png
deleted file mode 100644 (file)
index 2ed1599..0000000
Binary files a/core/res/res/drawable/submenu_arrow_focus.png and /dev/null differ
diff --git a/core/res/res/drawable/sym_battery_white.png b/core/res/res/drawable/sym_battery_white.png
deleted file mode 100644 (file)
index d1849fc..0000000
Binary files a/core/res/res/drawable/sym_battery_white.png and /dev/null differ
diff --git a/core/res/res/drawable/sym_default_number.png b/core/res/res/drawable/sym_default_number.png
deleted file mode 100644 (file)
index b1ed071..0000000
Binary files a/core/res/res/drawable/sym_default_number.png and /dev/null differ
diff --git a/core/res/res/drawable/tab_bottom_shadow.9.png b/core/res/res/drawable/tab_bottom_shadow.9.png
deleted file mode 100755 (executable)
index 3ac4f53..0000000
Binary files a/core/res/res/drawable/tab_bottom_shadow.9.png and /dev/null differ
diff --git a/core/res/res/drawable/tab_selected_highlight.9.png b/core/res/res/drawable/tab_selected_highlight.9.png
deleted file mode 100644 (file)
index 61568a3..0000000
Binary files a/core/res/res/drawable/tab_selected_highlight.9.png and /dev/null differ
diff --git a/core/res/res/drawable/tab_unselected_longpress.9.png b/core/res/res/drawable/tab_unselected_longpress.9.png
deleted file mode 100644 (file)
index 65556c4..0000000
Binary files a/core/res/res/drawable/tab_unselected_longpress.9.png and /dev/null differ
diff --git a/core/res/res/drawable/tab_unselected_pressed.9.png b/core/res/res/drawable/tab_unselected_pressed.9.png
deleted file mode 100644 (file)
index b4102eb..0000000
Binary files a/core/res/res/drawable/tab_unselected_pressed.9.png and /dev/null differ
diff --git a/core/res/res/drawable/tab_unselected_selected.9.png b/core/res/res/drawable/tab_unselected_selected.9.png
deleted file mode 100644 (file)
index 320f754..0000000
Binary files a/core/res/res/drawable/tab_unselected_selected.9.png and /dev/null differ
diff --git a/core/res/res/drawable/textfield_expanded_bottom_selected.9.png b/core/res/res/drawable/textfield_expanded_bottom_selected.9.png
deleted file mode 100755 (executable)
index 935acaf..0000000
Binary files a/core/res/res/drawable/textfield_expanded_bottom_selected.9.png and /dev/null differ
diff --git a/core/res/res/drawable/textfield_expanded_bottom_unselected.9.png b/core/res/res/drawable/textfield_expanded_bottom_unselected.9.png
deleted file mode 100755 (executable)
index 1e5f28d..0000000
Binary files a/core/res/res/drawable/textfield_expanded_bottom_unselected.9.png and /dev/null differ
diff --git a/core/res/res/drawable/textfield_expanded_center_selected.9.png b/core/res/res/drawable/textfield_expanded_center_selected.9.png
deleted file mode 100755 (executable)
index b60a0ad..0000000
Binary files a/core/res/res/drawable/textfield_expanded_center_selected.9.png and /dev/null differ
diff --git a/core/res/res/drawable/textfield_expanded_center_unselected.9.png b/core/res/res/drawable/textfield_expanded_center_unselected.9.png
deleted file mode 100755 (executable)
index f38c58f..0000000
Binary files a/core/res/res/drawable/textfield_expanded_center_unselected.9.png and /dev/null differ
diff --git a/core/res/res/drawable/textfield_expanded_top_selected.9.png b/core/res/res/drawable/textfield_expanded_top_selected.9.png
deleted file mode 100755 (executable)
index 926d09f..0000000
Binary files a/core/res/res/drawable/textfield_expanded_top_selected.9.png and /dev/null differ
diff --git a/core/res/res/drawable/textfield_expanded_top_unselected.9.png b/core/res/res/drawable/textfield_expanded_top_unselected.9.png
deleted file mode 100755 (executable)
index ab1b1ad..0000000
Binary files a/core/res/res/drawable/textfield_expanded_top_unselected.9.png and /dev/null differ
diff --git a/core/res/res/drawable/zoom_in.png b/core/res/res/drawable/zoom_in.png
deleted file mode 100644 (file)
index d151046..0000000
Binary files a/core/res/res/drawable/zoom_in.png and /dev/null differ
diff --git a/core/res/res/drawable/zoom_in_pressed.png b/core/res/res/drawable/zoom_in_pressed.png
deleted file mode 100644 (file)
index 963bf73..0000000
Binary files a/core/res/res/drawable/zoom_in_pressed.png and /dev/null differ
diff --git a/core/res/res/drawable/zoom_indicator.9.png b/core/res/res/drawable/zoom_indicator.9.png
deleted file mode 100644 (file)
index c799193..0000000
Binary files a/core/res/res/drawable/zoom_indicator.9.png and /dev/null differ
diff --git a/core/res/res/drawable/zoom_indicator_selected.png b/core/res/res/drawable/zoom_indicator_selected.png
deleted file mode 100644 (file)
index 20a72c1..0000000
Binary files a/core/res/res/drawable/zoom_indicator_selected.png and /dev/null differ
diff --git a/core/res/res/drawable/zoom_out.png b/core/res/res/drawable/zoom_out.png
deleted file mode 100644 (file)
index 2efbc47..0000000
Binary files a/core/res/res/drawable/zoom_out.png and /dev/null differ
diff --git a/core/res/res/drawable/zoom_out_pressed.png b/core/res/res/drawable/zoom_out_pressed.png
deleted file mode 100644 (file)
index 39e145c..0000000
Binary files a/core/res/res/drawable/zoom_out_pressed.png and /dev/null differ
diff --git a/core/res/res/drawable/zoom_track.png b/core/res/res/drawable/zoom_track.png
deleted file mode 100644 (file)
index 71e71a9..0000000
Binary files a/core/res/res/drawable/zoom_track.png and /dev/null differ
index c88b0a2..6678bc2 100644 (file)
             android:gravity="center_vertical"
             android:baselineAligned="false" >
 
-            <AutoCompleteTextView
+            <view class="android.app.SearchDialog$SearchAutoComplete"
                 android:id="@+id/search_src_text"
                 android:layout_height="wrap_content"
                 android:layout_width="0dip"
                 android:layout_weight="1.0"
                 android:paddingLeft="8dip"
                 android:paddingRight="6dip"
-                android:inputType="text|textAutoComplete"
-                android:completionThreshold="1" />
+                android:inputType="text|textAutoComplete" />
                 <!-- android:focusableInTouchMode="false" -->
                 <!-- android:singleLine="true" -->
                 <!-- android:selectAllOnFocus="true" -->
diff --git a/core/res/res/raw-ar/loaderror.html b/core/res/res/raw-ar/loaderror.html
new file mode 100644 (file)
index 0000000..edcd63a
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+    <head>
+        <title>صفحة الويب غير متوفرة</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>صفحة الويب غير متوفرة</h2>
+            <p>تعذر تحميل صفحة الويب الموجودة على <a href="%s">%s</a> كـ:</p>
+            <!-- The %e is replaced by a localized error string -->
+            <p>%e</p>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-ar/nodomain.html b/core/res/res/raw-ar/nodomain.html
new file mode 100644 (file)
index 0000000..bc070f6
--- /dev/null
@@ -0,0 +1,24 @@
+<html>
+    <head>
+        <title>صفحة الويب غير متوفرة</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>صفحة الويب غير متوفرة</h2>
+            <p>قد تكون صفحة الويب الموجودة على <a href="%s">%s</a> معطلة مؤقتًا، أو قد تمّ نقلها نهائيًا إلى عنوان ويب جديد.</p>
+
+            <p><b>فيما يلي بعض الاقتراحات:</b></p>
+            <ul>
+                <li>تأكد من أن جهازك به وصلة للإشارة والبيانات.</li>
+                <li>أعد تحميل صفحة الويب لاحقًا.</li>
+                <li>قم بعرض نسخة مخبأة من صفحة الويب من صفحة Google.</li>
+
+            </ul>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-cs/loaderror.html b/core/res/res/raw-cs/loaderror.html
new file mode 100644 (file)
index 0000000..ce88981
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+    <head>
+        <title>Webov&aacute; str&aacute;nka nen&iacute; dostupn&aacute;</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>Webov&aacute; str&aacute;nka nen&iacute; dostupn&aacute;</h2>
+            <p>Webov&aacute; str&aacute;nka na adrese <a href="%s">%s</a> nemohla b&yacute;t načtena. Chyba:</p>
+            <!-- The %e is replaced by a localized error string -->
+            <p>%e</p>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-cs/nodomain.html b/core/res/res/raw-cs/nodomain.html
new file mode 100644 (file)
index 0000000..26479a9
--- /dev/null
@@ -0,0 +1,24 @@
+<html>
+    <head>
+        <title>Webov&aacute; str&aacute;nka nen&iacute; dostupn&aacute;</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>Webov&aacute; str&aacute;nka nen&iacute; dostupn&aacute;</h2>
+            <p>Webov&aacute; str&aacute;nka na adrese <a href="%s">%s</a> je možn&aacute; dočasně nedostupn&aacute; nebo byla možn&aacute; přesunuta na novou adresu. </p>
+
+            <p><b>Možnosti dalš&iacute;ho postupu:</b></p>
+            <ul>
+                <li>Zkontrolujte na sv&eacute;m zař&iacute;zen&iacute;, zda je sign&aacute;l dostatečně siln&yacute; a zda je funkčn&iacute; datov&eacute; připojen&iacute;.</li>
+                <li>Otevřete tuto webovou str&aacute;nku později.</li>
+                <li>Pod&iacute;vejte se na kopii t&eacute;to webov&eacute; str&aacute;nky v mezipaměti vyhled&aacute;vače Google</li>
+
+            </ul>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-da/loaderror.html b/core/res/res/raw-da/loaderror.html
new file mode 100644 (file)
index 0000000..12a75c6
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+    <head>
+        <title>Websiden er ikke tilg&aelig;ngelig</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>Websiden er ikke tilg&aelig;ngelig</h2>
+            <p>Websiden p&aring; <a href="%s">%s</a> kunne ikke indl&aelig;ses som:</p>
+            <!-- The %e is replaced by a localized error string -->
+            <p>%e</p>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-da/nodomain.html b/core/res/res/raw-da/nodomain.html
new file mode 100644 (file)
index 0000000..3b8fe78
--- /dev/null
@@ -0,0 +1,24 @@
+<html>
+    <head>
+        <title>Websiden er ikke tilg&aelig;ngelig</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>Websiden er ikke tilg&aelig;ngelig</h2>
+            <p>Websiden p&aring; <a href="%s">%s</a> kan v&aelig;re midlertidigt nede eller flyttet permanent til en ny internetadresse.</p>
+
+            <p><b>Her er nogle forslag:</b></p>
+            <ul>
+                <li>Kontroller, at dit udstyr har signal- og dataforbindelse</li>
+                <li>Genindl&aelig;s websiden senere</li>
+                <li>Se en cached kopi af websiden fra Google</li>
+
+            </ul>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-en-rGB/loaderror.html b/core/res/res/raw-en-rGB/loaderror.html
new file mode 100644 (file)
index 0000000..359a1e7
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+    <head>
+        <title>Web page not available</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>Web page not available</h2>
+            <p>The Web page at <a href="%s">%s</a> could not be loaded as:</p>
+            <!-- The %e is replaced by a localized error string -->
+            <p>%e</p>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-en-rGB/nodomain.html b/core/res/res/raw-en-rGB/nodomain.html
new file mode 100644 (file)
index 0000000..01dd603
--- /dev/null
@@ -0,0 +1,24 @@
+<html>
+    <head>
+        <title>Web page not available</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>Web page not available</h2>
+            <p>The Web page at <a href="%s">%s</a> might be temporarily down or it may have moved permanently to a new web address.</p>
+
+            <p><b>Here are some suggestions:</b></p>
+            <ul>
+                <li>Check to make sure that your device has a signal and data connection</li>
+                <li>Reload this web page later.</li>
+                <li>View a cached copy of the web page from Google</li>
+
+            </ul>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-es/loaderror.html b/core/res/res/raw-es/loaderror.html
new file mode 100644 (file)
index 0000000..8829bf5
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+    <head>
+        <title>P&aacute;gina web no disponible</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>P&aacute;gina web no disponible</h2>
+            <p>La p&aacute;gina web <a href="%s">%s</a> no se ha podido cargar como:</p>
+            <!-- The %e is replaced by a localized error string -->
+            <p>%e</p>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-es/nodomain.html b/core/res/res/raw-es/nodomain.html
new file mode 100644 (file)
index 0000000..a11333e
--- /dev/null
@@ -0,0 +1,24 @@
+<html>
+    <head>
+        <title>P&aacute;gina web no disponible</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>P&aacute;gina web no disponible</h2>
+            <p>Es posible que la p&aacute;gina web <a href="%s">%s</a> se encuentre temporalmente fuera de servicio o se haya trasladado a otra direcci&oacute;n web de forma permanente.</p>
+
+            <p><b>Sugerencias:</b></p>
+            <ul>
+                <li>Aseg&uacute;rate de que tu dispositivo disponga de se&ntilde;al y de una conexi&oacute;n de datos.</li>
+                <li>Vuelve a cargar la p&aacute;gina m&aacute;s tarde.</li>
+                <li>Accede a una copia de la p&aacute;gina almacenada en cach&eacute; desde Google.</li>
+
+            </ul>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-fi/loaderror.html b/core/res/res/raw-fi/loaderror.html
new file mode 100644 (file)
index 0000000..3b1ec97
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+    <head>
+        <title>Verkkosivu ei ole k&auml;ytett&auml;viss&auml;</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>Verkkosivu ei ole k&auml;ytett&auml;viss&auml;</h2>
+            <p>Verkkosivua osoitteessa <a href="%s">%s</a> ei voi ladata, koska:</p>
+            <!-- The %e is replaced by a localized error string -->
+            <p>%e</p>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-fi/nodomain.html b/core/res/res/raw-fi/nodomain.html
new file mode 100644 (file)
index 0000000..84fedb4
--- /dev/null
@@ -0,0 +1,24 @@
+<html>
+    <head>
+        <title>Verkkosivu ei ole k&auml;ytett&auml;viss&auml;</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>Verkkosivu ei ole k&auml;ytett&auml;viss&auml;</h2>
+            <p>Verkkosivu osoitteessa <a href="%s">%s</a> saattaa olla v&auml;liaikaisesti pois k&auml;yt&ouml;st&auml; tai muuttanut pysyv&auml;sti uuteen osoitteeseen.</p>
+
+            <p><b>T&auml;ss&auml; muutamia ehdotuksia:</b></p>
+            <ul>
+                <li>Tarkista, ett&auml; laitteesi signaali ja verkkoyhteys ovat kunnossa</li>
+                <li>Lataa t&auml;m&auml; verkkosivu my&ouml;hemmin uudelleen.</li>
+                <li>Katsele Googlessa verkkosivun v&auml;limuistissa olevaa versiota </li>
+
+            </ul>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-fr/loaderror.html b/core/res/res/raw-fr/loaderror.html
new file mode 100644 (file)
index 0000000..f61f50b
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+    <head>
+        <title>Page Web non disponible</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>Page Web non disponible</h2>
+            <p>Impossible de charger la page Web &agrave; l'adresse <a href="%s">%s</a> en tant que&nbsp;:</p>
+            <!-- The %e is replaced by a localized error string -->
+            <p>%e</p>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-fr/nodomain.html b/core/res/res/raw-fr/nodomain.html
new file mode 100644 (file)
index 0000000..b3b93b3
--- /dev/null
@@ -0,0 +1,24 @@
+<html>
+    <head>
+        <title>Page Web non disponible</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>Page Web non disponible</h2>
+            <p>La page Web &agrave; l'adresse <a href="%s">%s</a> est peut-&ecirc;tre temporairement inaccessible ou a &eacute;t&eacute; d&eacute;plac&eacute;e d&eacute;finitivement vers une nouvelle adresse Web.</p>
+
+            <p><b>Voici quelques suggestions&nbsp;:</b></p>
+            <ul>
+                <li>assurez-vous que votre appareil &eacute;met un signal et dispose d'une connexion de donn&eacute;es&nbsp;;</li>
+                <li>rechargez cette page Web ult&eacute;rieurement&nbsp;;</li>
+                <li>affichez une copie en cache de la page Web &agrave; partir de Google.</li>
+
+            </ul>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-hu/loaderror.html b/core/res/res/raw-hu/loaderror.html
new file mode 100644 (file)
index 0000000..6b3d45e
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+    <head>
+        <title>A weboldal nem &eacute;rhető el</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>A weboldal nem &eacute;rhető el</h2>
+            <p>A  k&ouml;vetkező <a href="%s">%s</a> weboldalt nem siker&uuml;lt bet&ouml;lteni, mert:</p>
+            <!-- The %e is replaced by a localized error string -->
+            <p>%e</p>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-hu/nodomain.html b/core/res/res/raw-hu/nodomain.html
new file mode 100644 (file)
index 0000000..d3465ff
--- /dev/null
@@ -0,0 +1,24 @@
+<html>
+    <head>
+        <title>A weboldal nem &eacute;rhető el</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>A weboldal nem &eacute;rhető el</h2>
+            <p>A k&ouml;vetkező <a href="%s">%s</a> weboldal val&oacute;sz&iacute;nűleg ideiglenesen &uuml;zemen k&iacute;v&uuml;l van vagy v&eacute;glegesen &uacute;j webc&iacute;mre k&ouml;lt&ouml;z&ouml;tt.</p>
+
+            <p><b>&Iacute;me p&aacute;r javaslat:</b></p>
+            <ul>
+                <li>Ellenőrizze, hogy k&eacute;sz&uuml;l&eacute;ke fogja-e a jelet &eacute;s k&eacute;pes-e adat&aacute;tvitelre.</li>
+                <li>T&ouml;ltse &uacute;jra ezt a weboldalt k&eacute;sőbb.</li>
+                <li>A weboldal t&aacute;rolt v&aacute;ltozat&aacute;nak megtekint&eacute;se a Google-r&oacute;l</li>
+
+            </ul>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-it/loaderror.html b/core/res/res/raw-it/loaderror.html
new file mode 100644 (file)
index 0000000..e81466a
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+    <head>
+        <title>Pagina web non disponibile</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>Pagina web non disponibile</h2>
+            <p>Non &egrave; stato possibile caricare la pagina web all'indirizzo <a href="%s">%s</a>. Errore:</p>
+            <!-- The %e is replaced by a localized error string -->
+            <p>%e</p>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-it/nodomain.html b/core/res/res/raw-it/nodomain.html
new file mode 100644 (file)
index 0000000..a2321c7
--- /dev/null
@@ -0,0 +1,24 @@
+<html>
+    <head>
+        <title>Pagina web non disponibile</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>Pagina web non disponibile</h2>
+            <p>La pagina web all'indirizzo <a href="%s">%s</a> potrebbe essere temporaneamente non disponibile oppure essere stata spostata permanentemente a un nuovo indirizzo.</p>
+
+            <p><b>Ecco alcuni suggerimenti:</b></p>
+            <ul>
+                <li>Controlla che ci sia segnale e che la connessione dati sia attiva</li>
+                <li>Ricarica la pagina web in seguito</li>
+                <li>Visualizza la copia cache della pagina web su Google</li>
+
+            </ul>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-iw/loaderror.html b/core/res/res/raw-iw/loaderror.html
new file mode 100644 (file)
index 0000000..8155432
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+    <head>
+        <title>דף אינטרנט לא זמין</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>דף אינטרנט לא זמין</h2>
+            <p>דף האינטרנט ב-&lrm;<a href="%s">%s</a>&lrm; לא ניטן לטעינה בתור:</p>
+            <!-- The %e is replaced by a localized error string -->
+            <p>&lrm;%e</p>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-iw/nodomain.html b/core/res/res/raw-iw/nodomain.html
new file mode 100644 (file)
index 0000000..f7b9f42
--- /dev/null
@@ -0,0 +1,24 @@
+<html>
+    <head>
+        <title>דף אינטרנט לא זמין</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>דף אינטרנט לא זמין</h2>
+            <p>ייתכן שדף האינטרנט ב-&lrm;<a href="%s">%s</a>&lrm; מושבת באופן זמני או שעבר לצמיתות לכתובת אינטרנט חדשה.</p>
+
+            <p><b>להלן מספר הצעות:</b></p>
+            <ul>
+                <li>בדוק כדי לוודא שההתקן שלך כולל חיבור אותות ונתונים</li>
+                <li>טען מחדש דף אינטרנט זה במועד מאוחר יותר.</li>
+                <li>הצג עותק של דף האינטרנט של Google שנשמר במטמון</li>
+
+            </ul>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-ja/loaderror.html b/core/res/res/raw-ja/loaderror.html
new file mode 100644 (file)
index 0000000..68e568b
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+    <head>
+        <title>ページが見つかりませんでした</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>ページが見つかりませんでした</h2>
+            <p>次の原因によりウェブページ <a href="%s">%s</a> を読み込めませんでした。</p>
+            <!-- The %e is replaced by a localized error string -->
+            <p>%e</p>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-ja/nodomain.html b/core/res/res/raw-ja/nodomain.html
new file mode 100644 (file)
index 0000000..1dff1d4
--- /dev/null
@@ -0,0 +1,24 @@
+<html>
+    <head>
+        <title>ページが見つかりませんでした</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>ページが見つかりませんでした</h2>
+            <p>ウェブページ <a href="%s">%s</a> は一時的にご利用いただけないか、URLが変更された可能性があります。</p>
+
+            <p><b>ヒント:</b></p>
+            <ul>
+                <li>端末を圏内で使用していてデータ接続がアクティブであることを確認します</li>
+                <li>しばらくしてからページをリロードします</li>
+                <li>Googleでキャッシュされたページを表示します</li>
+
+            </ul>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-ko/loaderror.html b/core/res/res/raw-ko/loaderror.html
new file mode 100644 (file)
index 0000000..59f0f25
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+    <head>
+        <title>웹페이지를 표시할 수 없습니다.</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>웹페이지를 표시할 수 없습니다.</h2>
+            <p><a href="%s">%s</a>에 있는 웹페이지를 다음으로 로드할 수 없습니다.</p>
+            <!-- The %e is replaced by a localized error string -->
+            <p>%e</p>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-ko/nodomain.html b/core/res/res/raw-ko/nodomain.html
new file mode 100644 (file)
index 0000000..0eadc39
--- /dev/null
@@ -0,0 +1,24 @@
+<html>
+    <head>
+        <title>웹페이지를 표시할 수 없습니다.</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>웹페이지를 표시할 수 없습니다.</h2>
+            <p><a href="%s">%s</a>에 있는 웹페이지가 일시적으로 중단되었거나 새 웹 주소가 영구적으로 이동했을 수 있습니다.</p>
+
+            <p><b>다음은 몇 가지 제안사항입니다.</b></p>
+            <ul>
+                <li>휴대기기의 신호 및 데이터 접속 상태를 확인하세요.</li>
+                <li>나중에 웹페이지를 다시 로드하세요.</li>
+                <li>Google에서 웹페이지의 캐시된 사본을 확인하세요.</li>
+
+            </ul>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-nl/loaderror.html b/core/res/res/raw-nl/loaderror.html
new file mode 100644 (file)
index 0000000..76bb07c
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+    <head>
+        <title>Webpagina niet beschikbaar</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>Webpagina niet beschikbaar</h2>
+            <p>De webpagina op <a href="%s">%s</a> kan niet worden geladen als:</p>
+            <!-- The %e is replaced by a localized error string -->
+            <p>%e</p>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-nl/nodomain.html b/core/res/res/raw-nl/nodomain.html
new file mode 100644 (file)
index 0000000..ffac947
--- /dev/null
@@ -0,0 +1,24 @@
+<html>
+    <head>
+        <title>Webpagina niet beschikbaar</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>Webpagina niet beschikbaar</h2>
+            <p>De webpagina op <a href="%s">%s</a> is mogelijk tijdelijk niet beschikbaar of is permanent verplaatst naar een nieuw webadres.</p>
+
+            <p><b>Hier volgen enkele suggesties:</b></p>
+            <ul>
+                <li>Controleer of uw apparaat een signaal en gegevensverbinding heeft.</li>
+                <li>Laad deze webpagina later opnieuw.</li>
+                <li>Bekijk een exemplaar van de webpagina uit het cachegeheugen van Google.</li>
+
+            </ul>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-pl/loaderror.html b/core/res/res/raw-pl/loaderror.html
new file mode 100644 (file)
index 0000000..9cc1342
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+    <head>
+        <title>Strona internetowa jest niedostępna</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>Strona internetowa jest niedostępna</h2>
+            <p>Nie można załadować strony internetowej pod adresem <a href="%s">%s</a> jako:</p>
+            <!-- The %e is replaced by a localized error string -->
+            <p>%e</p>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-pl/nodomain.html b/core/res/res/raw-pl/nodomain.html
new file mode 100644 (file)
index 0000000..23f529d
--- /dev/null
@@ -0,0 +1,24 @@
+<html>
+    <head>
+        <title>Strona internetowa jest niedostępna</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>Strona internetowa jest niedostępna</h2>
+            <p>Strona internetowa pod adresem <a href="%s">%s</a> może być czasowo niedostępna lub mogła zostać trwale przeniesiona na nowy adres internetowy.</p>
+
+            <p><b>Oto kilka sugestii:</b></p>
+            <ul>
+                <li>Upewnij się, że w urządzeniu jest sygnał i połączenie transmisji danych.</li>
+                <li>Ponownie załaduj tę stronę internetową p&oacute;źniej.</li>
+                <li>Wyświetl kopię zapasową strony internetowej z serwisu Google.</li>
+
+            </ul>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-pt-rBR/loaderror.html b/core/res/res/raw-pt-rBR/loaderror.html
new file mode 100644 (file)
index 0000000..3476239
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+    <head>
+        <title>P&aacute;gina da web n&atilde;o dispon&iacute;vel</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>P&aacute;gina da web n&atilde;o dispon&iacute;vel</h2>
+            <p>N&atilde;o foi poss&iacute;vel carregar a p&aacute;gina da web localizada em <a href="%s">%s</a> como:</p>
+            <!-- The %e is replaced by a localized error string -->
+            <p>%e</p>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-pt-rBR/nodomain.html b/core/res/res/raw-pt-rBR/nodomain.html
new file mode 100644 (file)
index 0000000..546c610
--- /dev/null
@@ -0,0 +1,24 @@
+<html>
+    <head>
+        <title>P&aacute;gina da web n&atilde;o dispon&iacute;vel</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>P&aacute;gina da web n&atilde;o dispon&iacute;vel</h2>
+            <p>A p&aacute;gina da web localizada em <a href="%s">%s</a> pode estar temporariamente inativa ou pode ter sido movida permanentemente para um novo endere&ccedil;o da web.</p>
+
+            <p><b>Veja algumas sugest&otilde;es:</b></p>
+            <ul>
+                <li>Verifique se seu aparelho possui sinal e uma conex&atilde;o de dados.</li>
+                <li>Carregue esta p&aacute;gina da web novamente mais tarde.</li>
+                <li>Visualize uma c&oacute;pia da p&aacute;gina da web armazenada em cache proveniente do Google.</li>
+
+            </ul>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-ru/loaderror.html b/core/res/res/raw-ru/loaderror.html
new file mode 100644 (file)
index 0000000..5a0312e
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+    <head>
+        <title>Веб-страница недоступна</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>Веб-страница недоступна</h2>
+            <p>Невозможно загрузить веб-страницу по адресу <a href="%s">%s</a> по следующей причине:</p>
+            <!-- The %e is replaced by a localized error string -->
+            <p>%e</p>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-ru/nodomain.html b/core/res/res/raw-ru/nodomain.html
new file mode 100644 (file)
index 0000000..86a42a1
--- /dev/null
@@ -0,0 +1,24 @@
+<html>
+    <head>
+        <title>Веб-страница недоступна</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>Веб-страница недоступна</h2>
+            <p>Возможно, веб-страница по адресу <a href="%s">%s</a> временно отключена или навсегда перемещена на новый веб-адрес.</p>
+
+            <p><b>Вот несколько советов:</b></p>
+            <ul>
+                <li>Убедитесь, что у вашего устройства есть сигнал и подключение для передачи данных.</li>
+                <li>Повторите загрузку веб-страницы позже.</li>
+                <li>Просмотрите копию веб-страницы, сохраненную в кэше Google.</li>
+
+            </ul>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-th/loaderror.html b/core/res/res/raw-th/loaderror.html
new file mode 100644 (file)
index 0000000..05310a7
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+    <head>
+        <title>ไม่มีเว็บเพจนี้</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>ไม่มีเว็บเพจนี้</h2>
+            <p>เว็บเพจนี้ที่ <a href="%s">%s</a> ไม่สามารถโหลดเป็น:</p>
+            <!-- The %e is replaced by a localized error string -->
+            <p>%e</p>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-th/nodomain.html b/core/res/res/raw-th/nodomain.html
new file mode 100644 (file)
index 0000000..37b8593
--- /dev/null
@@ -0,0 +1,24 @@
+<html>
+    <head>
+        <title>ไม่มีเว็บเพจนี้</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>ไม่มีเว็บเพจนี้</h2>
+            <p>เว็บเพจที่ <a href="%s">%s</a> อาจใช้งานไม่ได้ชั่วคราว หรืออาจถูกย้ายไปยังที่อยู่เว็บใหม่เป็นการถาวร</p>
+
+            <p><b>ต่อไปนี้เป็นคำแนะนำบางประการ:</b></p>
+            <ul>
+                <li>ตรวจสอบให้แน่ใจว่าอุปกรณ์ของคุณมีสัญญาณและการเชื่อมต่อข้อมูล</li>
+                <li>โหลดเว็บเพจนี้ใหม่ภายหลัง</li>
+                <li>ดูสำเนาเว็บเพจที่เก็บไว้ในแคชจาก Google</li>
+
+            </ul>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-tr/loaderror.html b/core/res/res/raw-tr/loaderror.html
new file mode 100644 (file)
index 0000000..b6f4890
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+    <head>
+        <title>Web sayfası yok</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>Web sayfası yok</h2>
+            <p><a href="%s">%s</a> adresindeki web sayfası y&uuml;klenemedi:</p>
+            <!-- The %e is replaced by a localized error string -->
+            <p>%e</p>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-tr/nodomain.html b/core/res/res/raw-tr/nodomain.html
new file mode 100644 (file)
index 0000000..a79c21b
--- /dev/null
@@ -0,0 +1,24 @@
+<html>
+    <head>
+        <title>Web sayfası yok</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>Web sayfası yok</h2>
+            <p><a href="%s">%s</a> adresindeki web sayfası ge&ccedil;ici olarak arızalı veya kalıcı olarak yeni bir web adresine taşınmış olabilir.</p>
+
+            <p><b>Bazı &ouml;neriler:</b></p>
+            <ul>
+                <li>Aygıtınızın sinyal aldığını ve veri bağlantısı bulunduğunu kontrol edin.</li>
+                <li>Bu web sayfasını daha sonra tekrar y&uuml;kleyin.</li>
+                <li>Google'dan web sayfasının &ouml;nbelleğe alınmış kopyasına bakın</li>
+
+            </ul>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-zh-rCN/loaderror.html b/core/res/res/raw-zh-rCN/loaderror.html
new file mode 100644 (file)
index 0000000..809d31f
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+    <head>
+        <title>找不到网页</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>找不到网页</h2>
+            <p><a href="%s">%s</a> 处的网页不能载入为:</p>
+            <!-- The %e is replaced by a localized error string -->
+            <p>%e</p>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-zh-rCN/nodomain.html b/core/res/res/raw-zh-rCN/nodomain.html
new file mode 100644 (file)
index 0000000..eb03187
--- /dev/null
@@ -0,0 +1,24 @@
+<html>
+    <head>
+        <title>找不到网页</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>找不到网页</h2>
+            <p><a href="%s">%s</a> 处的网页可能暂时出现故障,也可能已永久移至某个新的网络地址。</p>
+
+            <p><b>以下是几点建议:</b></p>
+            <ul>
+                <li>进行检查以确保您的设备具有信号和数据连接</li>
+                <li>稍后重新载入该网页。</li>
+                <li>查看 Google 提供的该网页的缓存副本</li>
+
+            </ul>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-zh-rTW/loaderror.html b/core/res/res/raw-zh-rTW/loaderror.html
new file mode 100644 (file)
index 0000000..0b4695a
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+    <head>
+        <title>您所查詢的網頁不存在或已移除</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>您所查詢的網頁不存在或已移除</h2>
+            <p>由於以下原因,此位址 <a href="%s">%s</a> 的網頁無法開啟:</p>
+            <!-- The %e is replaced by a localized error string -->
+            <p>%e</p>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/raw-zh-rTW/nodomain.html b/core/res/res/raw-zh-rTW/nodomain.html
new file mode 100644 (file)
index 0000000..3577a9d
--- /dev/null
@@ -0,0 +1,24 @@
+<html>
+    <head>
+        <title>您所查詢的網頁不存在或已移除</title>
+        <style type="text/css">
+            body { margin-top: 0px; padding-top: 0px; }
+            h2   { margin-top: 5px; padding-top: 0px; }
+        </style>
+
+        <body>
+
+            <img src="file:///android_asset/webkit/android-weberror.png" align="top" />
+            <h2>您所查詢的網頁不存在或已移除</h2>
+            <p>此網頁位址:<a href="%s">%s</a> 可能暫時無法存取或已經被移到新的網頁位址。</p>
+
+            <p><b>建議您嘗試以下動作:</b></p>
+            <ul>
+                <li>檢查裝置是否有訊號、資料連線是否正常。</li>
+                <li>稍後重新載入網頁</li>
+                <li>從 Google 檢視網頁快取複本</li>
+
+            </ul>
+        </body>
+    </head>
+</html>
diff --git a/core/res/res/values-cs/arrays.xml b/core/res/res/values-cs/arrays.xml
new file mode 100644 (file)
index 0000000..f9c904b
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
new file mode 100644 (file)
index 0000000..5859b9b
--- /dev/null
@@ -0,0 +1,724 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="byteShort">"B"</string>
+    <string name="kilobyteShort">"kB"</string>
+    <string name="megabyteShort">"MB"</string>
+    <string name="gigabyteShort">"GB"</string>
+    <string name="terabyteShort">"TB"</string>
+    <string name="petabyteShort">"PB"</string>
+    <string name="untitled">"&lt;bez názvu&gt;"</string>
+    <string name="ellipsis">"…"</string>
+    <string name="emptyPhoneNumber">"(žádné telefonní číslo)"</string>
+    <string name="unknownName">"(Neznámé)"</string>
+    <string name="defaultVoiceMailAlphaTag">"Hlasová schránka"</string>
+    <string name="defaultMsisdnAlphaTag">"MSISDN1"</string>
+    <string name="mmiError">"Problém s připojením nebo neplatný kód MMI."</string>
+    <string name="serviceEnabled">"Služba byla zapnuta."</string>
+    <string name="serviceEnabledFor">"Služba byla zapnuta pro:"</string>
+    <string name="serviceDisabled">"Služba byla vypnuta."</string>
+    <string name="serviceRegistered">"Registrace byla úspěšná."</string>
+    <string name="serviceErased">"Smazaní proběhlo úspěšně."</string>
+    <string name="passwordIncorrect">"Nesprávné heslo."</string>
+    <string name="mmiComplete">"Funkce MMI byla dokončena."</string>
+    <string name="badPin">"Původní kód PIN byl zadán nesprávně."</string>
+    <string name="badPuk">"Kód PUK byl zadán nesprávně."</string>
+    <string name="mismatchPin">"Zadané kódy PIN se neshodují."</string>
+    <string name="invalidPin">"Zadejte kód PIN o délce 4-8 číslic."</string>
+    <string name="needPuk">"Karta SIM je blokována pomocí kódu PUK. Odblokujete ji zadáním kódu PUK."</string>
+    <string name="needPuk2">"Chcete-li odblokovat kartu SIM, zadejte kód PUK2."</string>
+    <string name="ClipMmi">"Příchozí identifikace volajícího"</string>
+    <string name="ClirMmi">"Odchozí identifikace volajícího"</string>
+    <string name="CfMmi">"Přesměrování hovorů"</string>
+    <string name="CwMmi">"Další hovor na lince"</string>
+    <string name="BaMmi">"Blokování hovorů"</string>
+    <string name="PwdMmi">"Změna hesla"</string>
+    <string name="PinMmi">"Změna kódu PIN"</string>
+    <string name="CLIRDefaultOnNextCallOn">"Ve výchozím nastavení je identifikace volajícího omezena. Příští hovor: Omezeno"</string>
+    <string name="CLIRDefaultOnNextCallOff">"Ve výchozím nastavení je identifikace volajícího omezena. Příští hovor: Neomezeno"</string>
+    <string name="CLIRDefaultOffNextCallOn">"Ve výchozím nastavení není identifikace volajícího omezena. Příští hovor: Omezeno"</string>
+    <string name="CLIRDefaultOffNextCallOff">"Ve výchozím nastavení není identifikace volajícího omezena. Příští hovor: Neomezeno"</string>
+    <string name="serviceNotProvisioned">"Služba není zřízena."</string>
+    <string name="CLIRPermanent">"Nelze změnit nastavení identifikace volajícího."</string>
+    <string name="serviceClassVoice">"Hlas"</string>
+    <string name="serviceClassData">"Data"</string>
+    <string name="serviceClassFAX">"FAX"</string>
+    <string name="serviceClassSMS">"SMS"</string>
+    <string name="serviceClassDataAsync">"Async"</string>
+    <string name="serviceClassDataSync">"Synchronizace"</string>
+    <string name="serviceClassPacket">"Pakety"</string>
+    <string name="serviceClassPAD">"PAD"</string>
+    <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nepřesměrováno"</string>
+    <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+    <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> po <xliff:g id="TIME_DELAY">{2}</xliff:g> sek."</string>
+    <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nepřesměrováno"</string>
+    <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nepřesměrováno"</string>
+    <string name="httpErrorOk">"OK"</string>
+    <string name="httpError">"Webová stránka obsahuje chybu."</string>
+    <string name="httpErrorLookup">"Adresu URL nelze najít."</string>
+    <string name="httpErrorUnsupportedAuthScheme">"Schéma ověření webu není podporováno."</string>
+    <string name="httpErrorAuth">"Ověření nebylo úspěšné."</string>
+    <string name="httpErrorProxyAuth">"Ověření pomocí serveru proxy bylo neúspěšné."</string>
+    <string name="httpErrorConnect">"Připojení k serveru bylo neúspěšné."</string>
+    <string name="httpErrorIO">"Komunikace se serverem se nezdařila. Opakujte akci později."</string>
+    <string name="httpErrorTimeout">"Spojení se serverem vypršelo."</string>
+    <string name="httpErrorRedirectLoop">"Stránka obsahuje příliš mnoho přesměrování serveru."</string>
+    <string name="httpErrorUnsupportedScheme">"Protokol není podporován."</string>
+    <string name="httpErrorFailedSslHandshake">"Nelze navázat zabezpečené spojení."</string>
+    <string name="httpErrorBadUrl">"Stránku nelze otevřít, protože adresa URL je neplatná."</string>
+    <string name="httpErrorFile">"K souboru nelze získat přístup."</string>
+    <string name="httpErrorFileNotFound">"Požadovaný soubor nebyl nalezen."</string>
+    <string name="httpErrorTooManyRequests">"Je zpracováváno příliš mnoho požadavků. Opakujte akci později."</string>
+    <string name="contentServiceSync">"Synchronizace"</string>
+    <string name="contentServiceSyncNotificationTitle">"Synchronizace"</string>
+    <string name="contentServiceTooManyDeletesNotificationDesc">"Příliš mnoho smazaných položek služby <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+    <string name="low_memory">"Paměť telefonu je plná. Smažte některé soubory a uvolněte místo."</string>
+    <string name="me">"Já"</string>
+    <string name="power_dialog">"Možnosti telefonu"</string>
+    <string name="silent_mode">"Tichý režim"</string>
+    <string name="turn_on_radio">"Zapnout bezdrátové připojení"</string>
+    <string name="turn_off_radio">"Vypnout bezdrátové připojení"</string>
+    <string name="screen_lock">"Zámek obrazovky"</string>
+    <string name="power_off">"Vypnout"</string>
+    <string name="shutdown_progress">"Vypínání..."</string>
+    <string name="shutdown_confirm">"Váš telefon bude vypnut."</string>
+    <string name="no_recent_tasks">"Žádné nedávno použité aplikace."</string>
+    <string name="global_actions">"Možnosti telefonu"</string>
+    <string name="global_action_lock">"Zámek obrazovky"</string>
+    <string name="global_action_power_off">"Vypnout"</string>
+    <string name="global_action_toggle_silent_mode">"Tichý režim"</string>
+    <string name="global_action_silent_mode_on_status">"Zvuk je VYPNUTÝ."</string>
+    <string name="global_action_silent_mode_off_status">"Zvuk je zapnutý"</string>
+    <string name="safeMode">"Nouzový režim"</string>
+    <string name="permgrouplab_costMoney">"Zpoplatněné služby"</string>
+    <string name="permgroupdesc_costMoney">"Umožňuje aplikacím provádět činnosti, které vás mohou stát peníze."</string>
+    <string name="permgrouplab_messages">"Vaše zprávy"</string>
+    <string name="permgroupdesc_messages">"Čtení a zápis zpráv SMS, e-mailů a dalších zpráv."</string>
+    <string name="permgrouplab_personalInfo">"Vaše osobní informace"</string>
+    <string name="permgroupdesc_personalInfo">"Přímý přístup k vašim kontaktům a kalendáři v telefonu."</string>
+    <string name="permgrouplab_location">"Vaše poloha"</string>
+    <string name="permgroupdesc_location">"Sleduje vaši fyzickou polohu"</string>
+    <string name="permgrouplab_network">"Síťová komunikace"</string>
+    <string name="permgroupdesc_network">"Umožňuje aplikacím získat přístup k různým funkcím sítě."</string>
+    <string name="permgrouplab_accounts">"Vaše účty Google"</string>
+    <string name="permgroupdesc_accounts">"Přístup k dostupným účtům Google."</string>
+    <string name="permgrouplab_hardwareControls">"Řízení hardwaru"</string>
+    <string name="permgroupdesc_hardwareControls">"Přímý přístup k hardwaru telefonu."</string>
+    <string name="permgrouplab_phoneCalls">"Telefonní hovory"</string>
+    <string name="permgroupdesc_phoneCalls">"Sledování, záznam a zpracování telefonních hovorů."</string>
+    <string name="permgrouplab_systemTools">"Systémové nástroje"</string>
+    <string name="permgroupdesc_systemTools">"Nízkoúrovňový přístup a kontrola nad systémem."</string>
+    <string name="permgrouplab_developmentTools">"Nástroje pro vývojáře"</string>
+    <string name="permgroupdesc_developmentTools">"Funkce pouze pro vývojáře aplikací"</string>
+    <string name="permlab_statusBar">"zakázání či změny stavového řádku"</string>
+    <string name="permdesc_statusBar">"Umožňuje aplikaci zakázat stavový řádek nebo přidat či odebrat systémové ikony."</string>
+    <string name="permlab_expandStatusBar">"rozbalení a sbalení stavového řádku"</string>
+    <string name="permdesc_expandStatusBar">"Umožňuje aplikaci rozbalit či sbalit stavový řádek."</string>
+    <string name="permlab_processOutgoingCalls">"zachycení odchozích hovorů"</string>
+    <string name="permdesc_processOutgoingCalls">"Umožňuje aplikaci zpracovat odchozí hovory a změnit číslo, které má být vytočeno. Škodlivé aplikace mohou sledovat či přesměrovat odchozí hovory nebo jim zabránit."</string>
+    <string name="permlab_receiveSms">"příjem zpráv SMS"</string>
+    <string name="permdesc_receiveSms">"Umožňuje aplikaci přijímat a zpracovávat zprávy SMS. Škodlivé aplikace mohou sledovat vaše zprávy nebo je smazat, aniž by vám byly zobrazeny."</string>
+    <string name="permlab_receiveMms">"příjem zpráv MMS"</string>
+    <string name="permdesc_receiveMms">"Umožňuje aplikaci přijímat a zpracovávat zprávy MMS. Škodlivé aplikace mohou sledovat vaše zprávy nebo je smazat, aniž by vám byly zobrazeny."</string>
+    <string name="permlab_sendSms">"odesílat zprávy SMS"</string>
+    <string name="permdesc_sendSms">"Umožňuje aplikaci odesílat zprávy SMS. Škodlivé aplikace mohou bez vašeho potvrzení odesílat zpoplatněné zprávy."</string>
+    <string name="permlab_readSms">"čtení zpráv SMS a MMS"</string>
+    <string name="permdesc_readSms">"Umožňuje aplikaci číst zprávy SMS uložené ve vašem telefonu nebo na kartě SIM. Škodlivé aplikace mohou načíst vaše soukromé zprávy."</string>
+    <string name="permlab_writeSms">"úprava zpráv SMS a MMS"</string>
+    <string name="permdesc_writeSms">"Umožňuje aplikaci zapisovat do zpráv SMS uložených ve vašem telefonu nebo na kartě SIM. Škodlivé aplikace mohou smazat vaše zprávy."</string>
+    <string name="permlab_receiveWapPush">"příjem WAP"</string>
+    <string name="permdesc_receiveWapPush">"Umožňuje aplikaci přijímat a zpracovávat zprávy WAP. Škodlivé aplikace mohou sledovat vaše zprávy nebo je smazat, aniž by vám byly zobrazeny."</string>
+    <string name="permlab_getTasks">"načtení spuštěných aplikací"</string>
+    <string name="permdesc_getTasks">"Umožňuje aplikaci načíst informace o aktuálně a nedávno spuštěných úlohách. Toto nastavení může škodlivým aplikacím umožnit odhalení soukromých informací o jiných aplikacích."</string>
+    <string name="permlab_reorderTasks">"změna uspořádání spuštěných aplikací"</string>
+    <string name="permdesc_reorderTasks">"Umožňuje aplikaci přesouvat úlohy do popředí či pozadí. Škodlivé aplikace mohou vynutit své přesunutí do popředí bez vašeho přičinění."</string>
+    <string name="permlab_setDebugApp">"povolit ladění aplikací"</string>
+    <string name="permdesc_setDebugApp">"Umožňuje aplikaci povolit ladění jiné aplikace. Škodlivé aplikace mohou pomocí tohoto nastavení ukončit jiné aplikace."</string>
+    <string name="permlab_changeConfiguration">"změny vašeho nastavení uživatelského rozhraní"</string>
+    <string name="permdesc_changeConfiguration">"Umožňuje aplikaci změnit aktuální konfiguraci, např. národní prostředí či obecnou velikost písma."</string>
+    <string name="permlab_restartPackages">"restartování ostatních aplikací"</string>
+    <string name="permdesc_restartPackages">"Umožňuje aplikaci vynutit restartování jiných aplikací."</string>
+    <string name="permlab_setProcessForeground">"zamezení zastavení aplikace"</string>
+    <string name="permdesc_setProcessForeground">"Umožňuje aplikaci spustit jakýkoli proces v popředí tak, že ho nelze ukončit. Běžné aplikace by toto nastavení nikdy neměly používat."</string>
+    <string name="permlab_forceBack">"vynucení zavření aplikace"</string>
+    <string name="permdesc_forceBack">"Umožňuje aplikaci vynutit zavření a přesunutí libovolné činnosti v popředí na pozadí. Běžné aplikace by toto nastavení neměly nikdy využívat."</string>
+    <string name="permlab_dump">"načtení interního stavu systému"</string>
+    <string name="permdesc_dump">"Umožňuje aplikaci načíst interní stav systému. Škodlivé aplikace mohou načíst řádu soukromých a zabezpečených informací, které by nikdy neměly potřebovat."</string>
+    <string name="permlab_addSystemService">"zveřejnění nízkoúrovňových služeb"</string>
+    <string name="permdesc_addSystemService">"Umožňuje aplikaci zveřejnit své vlastní nízkoúrovňové systémové služby. Škodlivé aplikace mohou převzít kontrolu nad systémem a získat či poškodit jakákoli data v něm obsažená."</string>
+    <string name="permlab_runSetActivityWatcher">"sledování a řízení spouštění všech aplikací"</string>
+    <string name="permdesc_runSetActivityWatcher">"Umožňuje aplikaci sledovat a řídit spouštění činností systémem. Škodlivé aplikace mohou zcela ovládnout systém. Toto oprávnění je zapotřebí pouze pro účely vývoje, nikdy pro běžné použití telefonu."</string>
+    <string name="permlab_broadcastPackageRemoved">"odeslání vysílání o odstranění balíčku"</string>
+    <string name="permdesc_broadcastPackageRemoved">"Umožňuje aplikaci vysílat oznámení o odstranění balíčku aplikace. Škodlivé aplikace mohou pomocí tohoto nastavení ukončit libovolnou další spuštěnou aplikaci."</string>
+    <string name="permlab_broadcastSmsReceived">"odeslání vysílání o přijaté zprávě SMS"</string>
+    <string name="permdesc_broadcastSmsReceived">"Umožňuje aplikaci vysílat oznámení o přijetí zprávy SMS. Škodlivé aplikace mohou pomocí tohoto nastavení falšovat příchozí zprávy SMS."</string>
+    <string name="permlab_broadcastWapPush">"odeslání vysílání typu WAP-PUSH-received"</string>
+    <string name="permdesc_broadcastWapPush">"Umožňuje aplikaci vysílat oznámení o přijetí zprávy WAP PUSH. Škodlivé aplikace mohou pomocí tohoto nastavení zfalšovat výpis o doručení zprávy MMS nebo nepozorovaně nahradit obsah jakékoli webové stránky škodlivým obsahem."</string>
+    <string name="permlab_setProcessLimit">"omezení počtu spuštěných procesů"</string>
+    <string name="permdesc_setProcessLimit">"Umožňuje aplikaci řídit maximální počet spuštěných procesů. Běžné aplikace toto nastavení nikdy nevyužívají."</string>
+    <string name="permlab_setAlwaysFinish">"zavření všech aplikací na pozadí"</string>
+    <string name="permdesc_setAlwaysFinish">"Umožňuje aplikaci ovládat, zda jsou činnosti vždy dokončeny po přesunutí do pozadí. Běžné aplikace toto nastavení nikdy nevyužívají."</string>
+    <string name="permlab_fotaUpdate">"automatická instalace aktualizací systému"</string>
+    <string name="permdesc_fotaUpdate">"Umožňuje aplikaci přijímat oznámení o čekajících aktualizacích systému a spouštět jejich instalaci. Škodlivé aplikace mohou díky tomuto nastavení poškodit systém pomocí neoprávněných aktualizací nebo celkově narušovat proces aktualizace."</string>
+    <string name="permlab_batteryStats">"změna statistických údajů o baterii"</string>
+    <string name="permdesc_batteryStats">"Umožňuje změnu shromážděných statistických údajů o baterii. Není určeno pro běžné aplikace."</string>
+    <string name="permlab_internalSystemWindow">"zobrazení nepovolených oken"</string>
+    <string name="permdesc_internalSystemWindow">"Umožňuje vytvoření oken, která mají být použita interním systémem uživatelského rozhraní. Běžné aplikace toto nastavení nepoužívají."</string>
+    <string name="permlab_systemAlertWindow">"zobrazení upozornění systémové úrovně"</string>
+    <string name="permdesc_systemAlertWindow">"Umožňuje aplikaci zobrazit okna s výstrahami systému. Škodlivé aplikace mohou převzít kontrolu nad celou obrazovkou telefonu."</string>
+    <string name="permlab_setAnimationScale">"globální změny rychlosti animace"</string>
+    <string name="permdesc_setAnimationScale">"Umožňuje aplikaci kdykoli globálně změnit rychlost animace (rychlejší či pomalejší animace)."</string>
+    <string name="permlab_manageAppTokens">"správa tokenů aplikací"</string>
+    <string name="permdesc_manageAppTokens">"Umožňuje aplikaci vytvořit a spravovat své vlastní tokeny a obejít jejich obvyklé řazení typu Z. Toto nastavení by nikdy nemělo být potřeba pro běžné aplikace."</string>
+    <string name="permlab_injectEvents">"používání kláves a tlačítek"</string>
+    <string name="permdesc_injectEvents">"Umožňuje aplikaci doručit své vlastní vstupní události (stisknutí tlačítek, apod.) dalším aplikacím. Škodlivé aplikace mohou pomocí tohoto nastavení převzít kontrolu nad telefonem."</string>
+    <string name="permlab_readInputState">"zaznamenání psaného textu a prováděných činností"</string>
+    <string name="permdesc_readInputState">"Umožňuje aplikacím sledovat, které klávesy používáte, a to i při práci s jinými aplikacemi (například při zadávání hesla). Běžné aplikace by toto nastavení nikdy neměly vyžadovat."</string>
+    <string name="permlab_bindInputMethod">"vazba k metodě zadávání dat"</string>
+    <string name="permdesc_bindInputMethod">"Umožňuje držiteli vázat se na nejvyšší úroveň rozhraní pro zadávání dat. Běžné aplikace by toto nastavení nikdy neměly využívat."</string>
+    <string name="permlab_setOrientation">"změna orientace obrazovky"</string>
+    <string name="permdesc_setOrientation">"Umožňuje aplikaci kdykoli změnit orientaci obrazovky. Běžné aplikace by toto nastavení nikdy neměly využívat."</string>
+    <string name="permlab_signalPersistentProcesses">"odeslání signálů Linux aplikacím"</string>
+    <string name="permdesc_signalPersistentProcesses">"Umožňuje aplikaci vyžádat zaslání poskytnutého signálu všem trvalým procesům."</string>
+    <string name="permlab_persistentActivity">"trvalé spuštění aplikace"</string>
+    <string name="permdesc_persistentActivity">"Umožňuje aplikaci učinit své části trvalými, takže je systém nemůže použít pro jiné aplikace."</string>
+    <string name="permlab_deletePackages">"smazání aplikací"</string>
+    <string name="permdesc_deletePackages">"Umožňuje aplikaci smazat balíčky systému Android. Škodlivé aplikace mohou pomocí tohoto nastavení smazat důležité aplikace."</string>
+    <string name="permlab_clearAppUserData">"smazání dat ostatních aplikací"</string>
+    <string name="permdesc_clearAppUserData">"Umožňuje aplikaci smazat data uživatele."</string>
+    <string name="permlab_deleteCacheFiles">"smazání mezipaměti ostatních aplikací"</string>
+    <string name="permdesc_deleteCacheFiles">"Umožňuje aplikaci smazat soubory v mezipaměti."</string>
+    <string name="permlab_getPackageSize">"výpočet místa pro ukládání aplikací"</string>
+    <string name="permdesc_getPackageSize">"Umožňuje aplikaci načtení svého kódu, dat a velikostí mezipaměti"</string>
+    <string name="permlab_installPackages">"přímá instalace aplikací"</string>
+    <string name="permdesc_installPackages">"Umožňuje aplikaci nainstalovat nové či aktualizované balíčky systému Android. Škodlivé aplikace mohou pomocí tohoto nastavení přidat nové aplikace s libovolnými oprávněními."</string>
+    <string name="permlab_clearAppCache">"smazání všech dat v mezipaměti aplikace"</string>
+    <string name="permdesc_clearAppCache">"Umožňuje aplikaci uvolnit paměť telefonu smazáním souborů v adresáři mezipaměti aplikace. Přístup je velmi omezený, většinou pouze pro systémové procesy."</string>
+    <string name="permlab_readLogs">"čtení systémových souborů protokolu"</string>
+    <string name="permdesc_readLogs">"Umožňuje aplikaci číst různé systémové soubory protokolů. Toto nastavení aplikaci umožní získat obecné informace o činnostech s telefonem, ale neměly by obsahovat žádné osobní či soukromé informace."</string>
+    <string name="permlab_diagnostic">"čtení nebo zápis do prostředků funkce diag"</string>
+    <string name="permdesc_diagnostic">"Umožňuje aplikaci číst libovolné prostředky ve skupině diag, např. soubory ve složce /dev, a zapisovat do nich. Může dojít k ovlivnění stability a bezpečnosti systému. Toto nastavení by měl používat pouze výrobce či operátor pro diagnostiku hardwaru."</string>
+    <string name="permlab_changeComponentState">"povolení či zakázání komponent aplikací"</string>
+    <string name="permdesc_changeComponentState">"Umožňuje aplikaci změnit, zda je komponenta jiné aplikace povolena nebo ne. Škodlivé aplikace mohou pomocí tohoto nastavení vypnout důležité funkce telefonu. Je třeba postupovat opatrně, protože je možné způsobit nepoužitelnost, nekonzistenci či nestabilitu komponent aplikací."</string>
+    <string name="permlab_setPreferredApplications">"nastavení upřednostňovaných aplikací"</string>
+    <string name="permdesc_setPreferredApplications">"Umožňuje aplikaci změnit vaše upřednostňované aplikace. Toto nastavení může škodlivým aplikacím umožnit nepozorovaně změnit spouštěné aplikace a oklamat vaše existující aplikace tak, aby shromažďovaly vaše soukromá data."</string>
+    <string name="permlab_writeSettings">"změny globálních nastavení systému"</string>
+    <string name="permdesc_writeSettings">"Umožňuje aplikaci upravit data nastavení systému. Škodlivé aplikace mohou poškodit konfiguraci vašeho systému."</string>
+    <string name="permlab_writeSecureSettings">"změny zabezpečených nastavení systému"</string>
+    <string name="permdesc_writeSecureSettings">"Umožňuje aplikaci změnit data zabezpečených nastavení systému. Běžné aplikace toto nastavení nevyužívají."</string>
+    <string name="permlab_writeGservices">"změny mapy služeb Google"</string>
+    <string name="permdesc_writeGservices">"Umožňuje aplikaci změnit mapu služeb Google. Běžné aplikace toto nastavení nevyužívají."</string>
+    <string name="permlab_receiveBootCompleted">"automatické spuštění při startu"</string>
+    <string name="permdesc_receiveBootCompleted">"Umožňuje aplikaci spuštění ihned po spuštění systému. Toto nastavení může zpomalit spuštění telefonu a umožnit aplikaci celkově zpomalit telefon, protože bude neustále spuštěna."</string>
+    <string name="permlab_broadcastSticky">"odeslání trvalého vysílání"</string>
+    <string name="permdesc_broadcastSticky">"Umožňuje aplikaci odeslat trvalá vysílání, která přetrvávají i po skončení vysílání. Škodlivé aplikace mohou telefon zpomalit či způsobit jeho nestabilitu, protože bude používat příliš mnoho paměti."</string>
+    <string name="permlab_readContacts">"čtení dat kontaktů"</string>
+    <string name="permdesc_readContacts">"Umožňuje aplikaci načíst všechna data kontaktů (adresy) uložená ve vašem telefonu. Škodlivé aplikace poté mohou dalším lidem odeslat vaše data."</string>
+    <string name="permlab_writeContacts">"zápis dat kontaktů"</string>
+    <string name="permdesc_writeContacts">"Umožňuje aplikaci změnit kontaktní údaje (adresu) uložené v telefonu. Škodlivé aplikace mohou pomocí tohoto nastavení vymazat či pozměnit kontaktní údaje."</string>
+    <string name="permlab_writeOwnerData">"zápis informací o vlastníkovi"</string>
+    <string name="permdesc_writeOwnerData">"Umožňuje aplikaci změnit informace o vlastníkovi telefonu uložené v telefonu. Škodlivé aplikace mohou pomocí tohoto nastavení vymazat či pozměnit informace o vlastníkovi."</string>
+    <string name="permlab_readOwnerData">"čtení informací o vlastníkovi"</string>
+    <string name="permdesc_readOwnerData">"Umožňuje aplikaci číst informace o vlastníkovi telefonu uložená v telefonu. Škodlivé aplikace mohou pomocí tohoto nastavení načíst informace o vlastníkovi."</string>
+    <string name="permlab_readCalendar">"čtení dat kalendáře"</string>
+    <string name="permdesc_readCalendar">"Umožňuje aplikaci načíst všechny události kalendáře uložené ve vašem telefonu. Škodlivé aplikace poté mohou dalším lidem odeslat události z vašeho kalendáře."</string>
+    <string name="permlab_writeCalendar">"zápis dat kalendáře"</string>
+    <string name="permdesc_writeCalendar">"Umožňuje aplikaci změnit události kalendáře uložené v telefonu. Škodlivé aplikace mohou pomocí tohoto nastavení vymazat či pozměnit vaše data v kalendáři."</string>
+    <string name="permlab_accessMockLocation">"simulace zdrojů polohy pro účely testování"</string>
+    <string name="permdesc_accessMockLocation">"Vytváří simulované zdroje polohy pro účely testování. Škodlivé aplikace mohou pomocí tohoto nastavení změnit polohu či stav vrácený zdroji skutečné polohy, jako je např. jednotka GPS či poskytovatelé sítě."</string>
+    <string name="permlab_accessLocationExtraCommands">"přístup k dalším příkazům poskytovatele polohy"</string>
+    <string name="permdesc_accessLocationExtraCommands">"Umožňuje získat přístup k dalším příkazům poskytovatele polohy. Škodlivé aplikace mohou pomocí tohoto nastavení narušit funkci GPS či jiných zdrojů polohy."</string>
+    <string name="permlab_accessFineLocation">"upřesnění polohy (GPS)"</string>
+    <string name="permdesc_accessFineLocation">"Umožňuje aplikaci přístup ke zdrojům přesné polohy v telefonu, jako je například systém GPS, je-li k dispozici. Škodlivé aplikace mohou pomocí tohoto nastavení zjistit vaši polohu a mohou zvýšit spotřebu baterie."</string>
+    <string name="permlab_accessCoarseLocation">"přibližná poloha (pomocí sítě)"</string>
+    <string name="permdesc_accessCoarseLocation">"Umožňuje získat přístup ke zdrojům přibližné polohy, jako je například databáze mobilní sítě, je-li k dispozici, a určit přibližnou pozici telefonu. Škodlivé aplikace takto mohou zjistit, kde se přibližně nacházíte."</string>
+    <string name="permlab_accessSurfaceFlinger">"přístup ke službě SurfaceFlinger"</string>
+    <string name="permdesc_accessSurfaceFlinger">"Umožňuje aplikaci používat nízkoúrovňové funkce SurfaceFlinger."</string>
+    <string name="permlab_readFrameBuffer">"čtení vyrovnávací paměti snímků"</string>
+    <string name="permdesc_readFrameBuffer">"Umožňuje aplikaci načíst obsah vyrovnávací paměti snímků."</string>
+    <string name="permlab_modifyAudioSettings">"změna vašeho nastavení zvuku"</string>
+    <string name="permdesc_modifyAudioSettings">"Umožňuje aplikaci změnit globální nastavení zvuku, například hlasitost či směrování."</string>
+    <string name="permlab_recordAudio">"nahrání zvuku"</string>
+    <string name="permdesc_recordAudio">"Umožňuje aplikaci získat přístup k nahrávání zvuku."</string>
+    <string name="permlab_camera">"pořizování fotografií"</string>
+    <string name="permdesc_camera">"Umožňuje aplikaci pořizovat fotografie pomocí fotoaparátu. Toto nastavení aplikaci umožní shromažďovat fotografie toho, na co je zrovna fotoaparát namířen."</string>
+    <string name="permlab_brick">"trvalé vypnutí telefonu"</string>
+    <string name="permdesc_brick">"Umožňuje aplikaci trvale vypnout celý telefon. Toto je velmi nebezpečné nastavení."</string>
+    <string name="permlab_reboot">"vynucení restartování telefonu"</string>
+    <string name="permdesc_reboot">"Umožňuje aplikaci vynutit restartování telefonu."</string>
+    <string name="permlab_mount_unmount_filesystems">"připojení a odpojení souborových systémů"</string>
+    <string name="permdesc_mount_unmount_filesystems">"Umožňuje aplikaci připojit či odpojit souborové systémy ve vyměnitelných úložištích."</string>
+    <string name="permlab_vibrate">"ovládání vibrací"</string>
+    <string name="permdesc_vibrate">"Umožňuje aplikaci ovládat vibrace."</string>
+    <string name="permlab_flashlight">"ovládání kontrolky"</string>
+    <string name="permdesc_flashlight">"Umožňuje aplikaci ovládat kontrolku."</string>
+    <string name="permlab_hardware_test">"testování hardwaru"</string>
+    <string name="permdesc_hardware_test">"Umožňuje aplikaci ovládat různé periferie pro účely testování hardwaru."</string>
+    <string name="permlab_callPhone">"přímé volání na telefonní čísla"</string>
+    <string name="permdesc_callPhone">"Umožňuje aplikaci bez vašeho zásahu volat na telefonní čísla. Škodlivé aplikace mohou na váš telefonní účet připsat neočekávané hovory. Toto nastavení aplikaci neumožňuje volat na tísňové linky."</string>
+    <string name="permlab_callPrivileged">"přímé volání na libovolná telefonní čísla"</string>
+    <string name="permdesc_callPrivileged">"Umožňuje aplikaci bez vašeho zásahu vytočit jakékoli telefonní číslo, včetně čísel tísňového volání. Škodlivé aplikace mohou provádět zbytečná a nezákonná volání na tísňové linky."</string>
+    <string name="permlab_locationUpdates">"ovládání oznámení o aktualizaci polohy"</string>
+    <string name="permdesc_locationUpdates">"Umožňuje povolit či zakázat aktualizace polohy prostřednictvím bezdrátového připojení. Aplikace toto nastavení obvykle nepoužívají."</string>
+    <string name="permlab_checkinProperties">"přístup k vlastnostem Checkin"</string>
+    <string name="permdesc_checkinProperties">"Umožňuje čtení i zápis vlastností nahraných službou Checkin. Běžné aplikace toto nastavení obvykle nevyužívají."</string>
+    <string name="permlab_modifyPhoneState">"změny stavu telefonu"</string>
+    <string name="permdesc_modifyPhoneState">"Umožňuje aplikaci ovládat telefonní funkce zařízení. Aplikace s tímto oprávněním může přepínat sítě nebo zapnout či vypnout bezdrátové připojení telefonu bez vašeho svolení."</string>
+    <string name="permlab_readPhoneState">"zjistit stav telefonu"</string>
+    <string name="permdesc_readPhoneState">"Umožňuje aplikaci získat přístup k telefonním funkcím zařízení. Aplikace s tímto oprávněním mohou určit telefonní číslo tohoto telefonu, zda zrovna probíhá hovor, spojené telefonní číslo a podobně."</string>
+    <string name="permlab_wakeLock">"zabránění přechodu telefonu do režimu spánku"</string>
+    <string name="permdesc_wakeLock">"Umožňuje aplikaci zabránit přechodu telefonu do režimu spánku."</string>
+    <string name="permlab_devicePower">"zapnutí či vypnutí telefonu"</string>
+    <string name="permdesc_devicePower">"Umožňuje aplikaci zapnout či vypnout telefon."</string>
+    <string name="permlab_factoryTest">"spuštění v režimu továrního testu"</string>
+    <string name="permdesc_factoryTest">"Umožňuje aplikaci spuštění v režimu nízkoúrovňového testu výrobce a povolí přístup k hardwaru telefonu. K dispozici pouze, je-li telefon spuštěn v režimu testování výrobce."</string>
+    <string name="permlab_setWallpaper">"nastavení tapety"</string>
+    <string name="permdesc_setWallpaper">"Umožňuje aplikaci nastavit tapetu systému."</string>
+    <string name="permlab_setWallpaperHints">"nastavení nápovědy pro velikost tapety"</string>
+    <string name="permdesc_setWallpaperHints">"Umožňuje aplikaci nastavit nápovědu pro velikost tapety systému."</string>
+    <string name="permlab_masterClear">"obnovení továrního nastavení systému"</string>
+    <string name="permdesc_masterClear">"Umožňuje aplikaci kompletně obnovit systém do továrního nastavení a vymazat všechna data, konfiguraci a nainstalované aplikace."</string>
+    <string name="permlab_setTimeZone">"nastavení časového pásma"</string>
+    <string name="permdesc_setTimeZone">"Umožňuje aplikaci změnit časové pásmo telefonu."</string>
+    <string name="permlab_getAccounts">"odhalení známých účtů"</string>
+    <string name="permdesc_getAccounts">"Umožňuje aplikaci získat seznam účtů v telefonu."</string>
+    <string name="permlab_accessNetworkState">"zobrazení stavu sítě"</string>
+    <string name="permdesc_accessNetworkState">"Umožňuje aplikaci zobrazit stav všech sítí."</string>
+    <string name="permlab_createNetworkSockets">"plný přístup k Internetu"</string>
+    <string name="permdesc_createNetworkSockets">"Umožňuje aplikaci vytvořit síťové sokety."</string>
+    <string name="permlab_writeApnSettings">"zápis nastavení pro název přístupového bodu (APN)"</string>
+    <string name="permdesc_writeApnSettings">"Umožňuje aplikaci změnit nastavení APN, jako je například proxy či port APN."</string>
+    <string name="permlab_changeNetworkState">"změna připojení k síti"</string>
+    <string name="permdesc_changeNetworkState">"Umožňuje aplikaci změnit stav připojení k síti."</string>
+    <string name="permlab_accessWifiState">"zobrazení stavu WiFi"</string>
+    <string name="permdesc_accessWifiState">"Umožňuje aplikaci zobrazit informace o stavu připojení WiFi."</string>
+    <string name="permlab_changeWifiState">"Změnit stav WiFi"</string>
+    <string name="permdesc_changeWifiState">"Umožňuje aplikaci připojit se k přístupovým bodům WiFi či se od nich odpojit a provádět změny nakonfigurovaných sítí WiFi."</string>
+    <string name="permlab_bluetoothAdmin">"správa rozhraní Bluetooth"</string>
+    <string name="permdesc_bluetoothAdmin">"Umožňuje aplikaci konfigurovat místní telefon s rozhraním Bluetooth a vyhledávat a párovat vzdálená zařízení."</string>
+    <string name="permlab_bluetooth">"vytvoření připojení Bluetooth"</string>
+    <string name="permdesc_bluetooth">"Umožňuje aplikaci zobrazit konfiguraci místního telefonu s rozhraním Bluetooth, vytvářet připojení ke spárovaným zařízením a přijímat tato připojení."</string>
+    <string name="permlab_disableKeyguard">"vypnutí zámku kláves"</string>
+    <string name="permdesc_disableKeyguard">"Umožňuje aplikaci vypnout zámek kláves a související zabezpečení heslem. Příkladem oprávněného použití této funkce je vypnutí zámku klávesnice při příchozím hovoru a jeho opětovné zapnutí po skončení hovoru."</string>
+    <string name="permlab_readSyncSettings">"čtení nastavení synchronizace"</string>
+    <string name="permdesc_readSyncSettings">"Umožňuje aplikaci načíst nastavení synchronizace, např. zda má být povolena synchronizace kontaktů."</string>
+    <string name="permlab_writeSyncSettings">"zápis nastavení synchronizace"</string>
+    <string name="permdesc_writeSyncSettings">"Umožňuje aplikaci změnit nastavení synchronizace, např. zda má být povolena synchronizace kontaktů."</string>
+    <string name="permlab_readSyncStats">"čtení statistických údajů o synchronizaci"</string>
+    <string name="permdesc_readSyncStats">"Umožňuje aplikaci číst statistické informace o synchronizaci, např. historii proběhlých synchronizací."</string>
+    <string name="permlab_subscribedFeedsRead">"čtení zdrojů přihlášených k odběru"</string>
+    <string name="permdesc_subscribedFeedsRead">"Umožňuje aplikaci získat podrobnosti o aktuálně synchronizovaných zdrojích."</string>
+    <string name="permlab_subscribedFeedsWrite">"zápis odebíraných zdrojů"</string>
+    <string name="permdesc_subscribedFeedsWrite">"Umožňuje aplikaci upravit vaše aktuálně synchronizované zdroje. To může škodlivým aplikacím umožnit změnu vašich synchronizovaných zdrojů."</string>
+  <string-array name="phoneTypes">
+    <item>"Domů"</item>
+    <item>"Mobil"</item>
+    <item>"Práce"</item>
+    <item>"Pracovní fax"</item>
+    <item>"Fax domů"</item>
+    <item>"Pager"</item>
+    <item>"Ostatní"</item>
+    <item>"Vlastní"</item>
+  </string-array>
+  <string-array name="emailAddressTypes">
+    <item>"Domů"</item>
+    <item>"Práce"</item>
+    <item>"Ostatní"</item>
+    <item>"Vlastní"</item>
+  </string-array>
+  <string-array name="postalAddressTypes">
+    <item>"Domů"</item>
+    <item>"Práce"</item>
+    <item>"Ostatní"</item>
+    <item>"Vlastní"</item>
+  </string-array>
+  <string-array name="imAddressTypes">
+    <item>"Domů"</item>
+    <item>"Práce"</item>
+    <item>"Ostatní"</item>
+    <item>"Vlastní"</item>
+  </string-array>
+  <string-array name="organizationTypes">
+    <item>"Práce"</item>
+    <item>"Ostatní"</item>
+    <item>"Vlastní"</item>
+  </string-array>
+  <string-array name="imProtocols">
+    <item>"AIM"</item>
+    <item>"Windows Live"</item>
+    <item>"Yahoo!"</item>
+    <item>"Skype"</item>
+    <item>"QQ"</item>
+    <item>"Google Talk"</item>
+    <item>"ICQ"</item>
+    <item>"Jabber"</item>
+  </string-array>
+    <string name="keyguard_password_enter_pin_code">"Zadejte kód PIN"</string>
+    <string name="keyguard_password_wrong_pin_code">"Nesprávný kód PIN"</string>
+    <string name="keyguard_label_text">"Chcete-li telefon odemknout, stiskněte Menu a poté 0."</string>
+    <string name="emergency_call_dialog_number_for_display">"Číslo tísňové linky"</string>
+    <string name="lockscreen_carrier_default">"(Není signál)"</string>
+    <string name="lockscreen_screen_locked">"Obrazovka uzamčena."</string>
+    <string name="lockscreen_instructions_when_pattern_enabled">"Chcete-li odemknout telefon nebo provést tísňové volání, stiskněte Menu."</string>
+    <string name="lockscreen_instructions_when_pattern_disabled">"Telefon odemknete stisknutím tlačítka Menu."</string>
+    <string name="lockscreen_pattern_instructions">"Odblokujte pomocí gesta"</string>
+    <string name="lockscreen_emergency_call">"Tísňové volání"</string>
+    <string name="lockscreen_pattern_correct">"Správně!"</string>
+    <string name="lockscreen_pattern_wrong">"Zkuste to prosím znovu"</string>
+    <string name="lockscreen_plugged_in">"Nabíjení (<xliff:g id="NUMBER">%d%%</xliff:g>)"</string>
+    <string name="lockscreen_low_battery">"Připojte dobíjecí zařízení."</string>
+    <string name="lockscreen_missing_sim_message_short">"Není vložena karta SIM."</string>
+    <string name="lockscreen_missing_sim_message">"V telefonu není žádná karta SIM."</string>
+    <string name="lockscreen_missing_sim_instructions">"Prosím vložte kartu SIM."</string>
+    <string name="lockscreen_network_locked_message">"Síť je blokována"</string>
+    <string name="lockscreen_sim_puk_locked_message">"Karta SIM je zablokována pomocí kódu PUK."</string>
+    <string name="lockscreen_sim_puk_locked_instructions">"Prosím kontaktujte podporu zákazníků."</string>
+    <string name="lockscreen_sim_locked_message">"Karta SIM je zablokována."</string>
+    <string name="lockscreen_sim_unlock_progress_dialog_message">"Odblokování karty SIM..."</string>
+    <string name="lockscreen_too_many_failed_attempts_dialog_message">"<xliff:g id="NUMBER_0">%d</xliff:g>krát jste použili nesprávné gesto pro odemčení. "\n\n"Opakujte prosím akci za <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin">"<xliff:g id="NUMBER_0">%d</xliff:g>krát jste nesprávně nakreslili své gesto odemknutí. Po dalších neúspěšných pokusech (<xliff:g id="NUMBER_1">%d</xliff:g>) budete požádání o odemčení telefonu pomocí přihlášení Google."\n\n" Akci prosím opakujte za několik sekund (<xliff:g id="NUMBER_2">%d</xliff:g>)."</string>
+    <string name="lockscreen_too_many_failed_attempts_countdown">"Sekundy zbývající do dalšího pokusu: <xliff:g id="NUMBER">%d</xliff:g>."</string>
+    <string name="lockscreen_forgot_pattern_button_text">"Zapomněli jste gesto?"</string>
+    <string name="lockscreen_glogin_too_many_attempts">"Gesta: Příliš mnoho pokusů"</string>
+    <string name="lockscreen_glogin_instructions">"Chcete-li telefon odemknout,"\n"přihlaste se pomocí svého účtu Google"</string>
+    <string name="lockscreen_glogin_username_hint">"Uživatelské jméno (e-mail)"</string>
+    <string name="lockscreen_glogin_password_hint">"Heslo"</string>
+    <string name="lockscreen_glogin_submit_button">"Přihlásit se"</string>
+    <string name="lockscreen_glogin_invalid_input">"Neplatné uživatelské jméno nebo heslo."</string>
+    <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
+    <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+    <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+    <!-- no translation found for hour_ampm (7618670480400517084) -->
+    <skip />
+    <!-- no translation found for hour_cap_ampm (5117798389811605468) -->
+    <skip />
+    <string name="status_bar_clear_all_button">"Vymazat oznámení"</string>
+    <string name="status_bar_no_notifications_title">"Žádná oznámení"</string>
+    <string name="status_bar_ongoing_events_title">"Probíhající"</string>
+    <string name="status_bar_latest_events_title">"Oznámení"</string>
+    <!-- no translation found for battery_status_text_percent_format (8818848472818880005) -->
+    <skip />
+    <string name="battery_status_charging">"Nabíjení..."</string>
+    <string name="battery_low_title">"Prosím připojte dobíjecí zařízení"</string>
+    <string name="battery_low_subtitle">"Baterie je vybitá:"</string>
+    <string name="battery_low_percent_format">"zbývá méně než <xliff:g id="NUMBER">%d%%</xliff:g>."</string>
+    <string name="factorytest_failed">"Test továrního nastavení se nezdařil"</string>
+    <string name="factorytest_not_system">"Test FACTORY_TEST lze provést pouze u balíčků nainstalovaných ve složce /system/app."</string>
+    <string name="factorytest_no_action">"Nebyl nalezen žádný balíček umožňující test FACTORY_TEST."</string>
+    <string name="factorytest_reboot">"Restartovat"</string>
+    <string name="save_password_label">"Potvrdit"</string>
+    <string name="save_password_message">"Chcete, aby si prohlížeč zapamatoval toto heslo?"</string>
+    <string name="save_password_notnow">"Nyní ne"</string>
+    <string name="save_password_remember">"Zapamatovat"</string>
+    <string name="save_password_never">"Nikdy"</string>
+    <string name="open_permission_deny">"Nemáte povolení otevřít tuto stránku."</string>
+    <string name="text_copied">"Text byl zkopírován do schránky."</string>
+    <string name="more_item_label">"Více"</string>
+    <string name="prepend_shortcut_label">"Menu+"</string>
+    <string name="menu_space_shortcut_label">"mezerník"</string>
+    <string name="menu_enter_shortcut_label">"enter"</string>
+    <string name="menu_delete_shortcut_label">"smazat"</string>
+    <string name="search_go">"Hledat"</string>
+    <string name="today">"Dnes"</string>
+    <string name="yesterday">"Včera"</string>
+    <string name="tomorrow">"Zítra"</string>
+    <string name="oneMonthDurationPast">"před 1 měsícem"</string>
+    <string name="beforeOneMonthDurationPast">"Déle než před 1 měsícem"</string>
+  <plurals name="num_seconds_ago">
+    <item quantity="one">"před 1 sekundou"</item>
+    <item quantity="other">"před <xliff:g id="COUNT">%d</xliff:g> sek."</item>
+  </plurals>
+  <plurals name="num_minutes_ago">
+    <item quantity="one">"před 1 minutou"</item>
+    <item quantity="other">"před <xliff:g id="COUNT">%d</xliff:g> min."</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one">"před 1 hodinou"</item>
+    <item quantity="other">"před <xliff:g id="COUNT">%d</xliff:g> hod."</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one">"včera"</item>
+    <item quantity="other">"před <xliff:g id="COUNT">%d</xliff:g> dny"</item>
+  </plurals>
+  <plurals name="in_num_seconds">
+    <item quantity="one">"za 1 sekundu"</item>
+    <item quantity="other">"za <xliff:g id="COUNT">%d</xliff:g> s"</item>
+  </plurals>
+  <plurals name="in_num_minutes">
+    <item quantity="one">"za 1 minutu"</item>
+    <item quantity="other">"za <xliff:g id="COUNT">%d</xliff:g> min."</item>
+  </plurals>
+  <plurals name="in_num_hours">
+    <item quantity="one">"za 1 hodinu"</item>
+    <item quantity="other">"za <xliff:g id="COUNT">%d</xliff:g> hod."</item>
+  </plurals>
+  <plurals name="in_num_days">
+    <item quantity="one">"zítra"</item>
+    <item quantity="other">"zbývající počet dní: <xliff:g id="COUNT">%d</xliff:g>"</item>
+  </plurals>
+    <!-- no translation found for abbrev_num_seconds_ago:one (1849036840200069118) -->
+    <!-- no translation found for abbrev_num_seconds_ago:other (3699169366650930415) -->
+    <!-- no translation found for abbrev_num_minutes_ago:one (6361490147113871545) -->
+    <!-- no translation found for abbrev_num_minutes_ago:other (851164968597150710) -->
+    <!-- no translation found for abbrev_num_hours_ago:one (4796212039724722116) -->
+    <!-- no translation found for abbrev_num_hours_ago:other (6889970745748538901) -->
+    <!-- no translation found for abbrev_num_days_ago:one (8463161711492680309) -->
+    <!-- no translation found for abbrev_num_days_ago:other (3453342639616481191) -->
+    <!-- no translation found for abbrev_in_num_seconds:one (5842225370795066299) -->
+    <!-- no translation found for abbrev_in_num_seconds:other (5495880108825805108) -->
+    <!-- no translation found for abbrev_in_num_minutes:one (562786149928284878) -->
+    <!-- no translation found for abbrev_in_num_minutes:other (4216113292706568726) -->
+    <!-- no translation found for abbrev_in_num_hours:one (3274708118124045246) -->
+    <!-- no translation found for abbrev_in_num_hours:other (3705373766798013406) -->
+    <!-- no translation found for abbrev_in_num_days:one (2178576254385739855) -->
+    <!-- no translation found for abbrev_in_num_days:other (2973062968038355991) -->
+    <string name="preposition_for_date">"%s"</string>
+    <string name="preposition_for_time">"%s"</string>
+    <string name="preposition_for_year">"v roce %s"</string>
+    <string name="day">"den"</string>
+    <string name="days">"d."</string>
+    <string name="hour">"hodina"</string>
+    <string name="hours">"hod."</string>
+    <string name="minute">"min."</string>
+    <string name="minutes">"min."</string>
+    <string name="second">"s"</string>
+    <string name="seconds">"s"</string>
+    <string name="week">"týden"</string>
+    <string name="weeks">"týd."</string>
+    <string name="year">"rokem"</string>
+    <string name="years">"lety"</string>
+    <string name="sunday">"neděle"</string>
+    <string name="monday">"pondělí"</string>
+    <string name="tuesday">"úterý"</string>
+    <string name="wednesday">"středa"</string>
+    <string name="thursday">"čtvrtek"</string>
+    <string name="friday">"pátek"</string>
+    <string name="saturday">"sobota"</string>
+    <string name="every_weekday">"Každý pracovní den (Po – Pá)"</string>
+    <string name="daily">"Denně"</string>
+    <string name="weekly">"Každý týden v <xliff:g id="DAY">%s</xliff:g>"</string>
+    <string name="monthly">"Měsíčně"</string>
+    <string name="yearly">"Ročně"</string>
+    <string name="VideoView_error_title">"Video nelze přehrát"</string>
+    <string name="VideoView_error_text_unknown">"Toto video bohužel nelze přehrát."</string>
+    <string name="VideoView_error_button">"OK"</string>
+    <string name="am">"dop."</string>
+    <string name="pm">"odp."</string>
+    <string name="numeric_date">"<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
+    <string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string>
+    <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
+    <string name="date1_date2">"<xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>"</string>
+    <string name="time1_time2">"<xliff:g id="TIME1">%1$s</xliff:g> – <xliff:g id="TIME2">%2$s</xliff:g>"</string>
+    <string name="time_wday_date">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>, <xliff:g id="DATE">%3$s</xliff:g>"</string>
+    <string name="wday_date">"<xliff:g id="WEEKDAY">%2$s</xliff:g>, <xliff:g id="DATE">%3$s</xliff:g>"</string>
+    <string name="time_date">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="DATE">%3$s</xliff:g>"</string>
+    <!-- no translation found for date_time (6104442718633642836) -->
+    <skip />
+    <!-- no translation found for relative_time (1818557177829411417) -->
+    <skip />
+    <string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string>
+    <string name="full_date_month_first">"<xliff:g id="MONTH">MMMM</xliff:g> <xliff:g id="DAY">dd</xliff:g>, <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="full_date_day_first">"<xliff:g id="DAY">dd</xliff:g>. <xliff:g id="MONTH">MMMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="medium_date_month_first">"<xliff:g id="DAY">dd</xliff:g>. <xliff:g id="MONTH">MMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="medium_date_day_first">"<xliff:g id="DAY">dd</xliff:g>. <xliff:g id="MONTH">MMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="twelve_hour_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">a</xliff:g>"</string>
+    <string name="twenty_four_hour_time_format">"<xliff:g id="HOUR">H</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g>"</string>
+    <string name="noon">"poledne"</string>
+    <string name="Noon">"Poledne"</string>
+    <string name="midnight">"půlnoc"</string>
+    <string name="Midnight">"Půlnoc"</string>
+    <!-- no translation found for month_day (5565829181417740906) -->
+    <skip />
+    <!-- no translation found for month (7026169712234774086) -->
+    <skip />
+    <string name="month_day_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <!-- no translation found for month_year (9219019380312413367) -->
+    <skip />
+    <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
+    <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="DAY">%-d</xliff:g>. <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <string name="same_year_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
+    <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
+    <string name="same_year_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR">%9$s</xliff:g>"</string>
+    <string name="same_year_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR">%9$s</xliff:g>"</string>
+    <string name="same_year_md1_time1_md2_time2">"<xliff:g id="DAY1">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_year_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_year_mdy1_time1_mdy2_time2">"<xliff:g id="DAY1">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g>. – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>."</string>
+    <string name="numeric_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
+    <string name="numeric_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g>. <xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>. <xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="numeric_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="numeric_md1_time1_md2_time2">"<xliff:g id="DAY1">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g>., <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>., <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g>. – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g>"</string>
+    <string name="same_month_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
+    <string name="same_month_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g>. – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="same_month_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="same_month_md1_time1_md2_time2">"<xliff:g id="DAY1">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g>. <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <!-- no translation found for abbrev_month_year (3856424847226891943) -->
+    <skip />
+    <!-- no translation found for abbrev_month_day (5028815883653985933) -->
+    <skip />
+    <!-- no translation found for abbrev_month (3131032032850777433) -->
+    <skip />
+    <string name="day_of_week_long_sunday">"neděle"</string>
+    <string name="day_of_week_long_monday">"pondělí"</string>
+    <string name="day_of_week_long_tuesday">"úterý"</string>
+    <string name="day_of_week_long_wednesday">"středa"</string>
+    <string name="day_of_week_long_thursday">"čtvrtek"</string>
+    <string name="day_of_week_long_friday">"pátek"</string>
+    <string name="day_of_week_long_saturday">"sobota"</string>
+    <string name="day_of_week_medium_sunday">"Ne"</string>
+    <string name="day_of_week_medium_monday">"Po"</string>
+    <string name="day_of_week_medium_tuesday">"Út"</string>
+    <string name="day_of_week_medium_wednesday">"St"</string>
+    <string name="day_of_week_medium_thursday">"Čt"</string>
+    <string name="day_of_week_medium_friday">"Pá"</string>
+    <string name="day_of_week_medium_saturday">"So"</string>
+    <string name="day_of_week_short_sunday">"Ne"</string>
+    <string name="day_of_week_short_monday">"Po"</string>
+    <string name="day_of_week_short_tuesday">"Út"</string>
+    <string name="day_of_week_short_wednesday">"St"</string>
+    <string name="day_of_week_short_thursday">"Čt"</string>
+    <string name="day_of_week_short_friday">"Pá"</string>
+    <string name="day_of_week_short_saturday">"So"</string>
+    <string name="day_of_week_shorter_sunday">"Ne"</string>
+    <string name="day_of_week_shorter_monday">"Po"</string>
+    <string name="day_of_week_shorter_tuesday">"Út"</string>
+    <string name="day_of_week_shorter_wednesday">"St"</string>
+    <string name="day_of_week_shorter_thursday">"Čt"</string>
+    <string name="day_of_week_shorter_friday">"Pá"</string>
+    <string name="day_of_week_shorter_saturday">"So"</string>
+    <string name="day_of_week_shortest_sunday">"Ne"</string>
+    <string name="day_of_week_shortest_monday">"Po"</string>
+    <string name="day_of_week_shortest_tuesday">"Čt"</string>
+    <string name="day_of_week_shortest_wednesday">"St"</string>
+    <string name="day_of_week_shortest_thursday">"Čt"</string>
+    <string name="day_of_week_shortest_friday">"Pá"</string>
+    <string name="day_of_week_shortest_saturday">"So"</string>
+    <string name="month_long_january">"leden"</string>
+    <string name="month_long_february">"únor"</string>
+    <string name="month_long_march">"březen"</string>
+    <string name="month_long_april">"duben"</string>
+    <string name="month_long_may">"květen"</string>
+    <string name="month_long_june">"červen"</string>
+    <string name="month_long_july">"červenec"</string>
+    <string name="month_long_august">"srpen"</string>
+    <string name="month_long_september">"září"</string>
+    <string name="month_long_october">"říjen"</string>
+    <string name="month_long_november">"listopad"</string>
+    <string name="month_long_december">"prosinec"</string>
+    <string name="month_medium_january">"leden"</string>
+    <string name="month_medium_february">"únor"</string>
+    <string name="month_medium_march">"březen"</string>
+    <string name="month_medium_april">"duben"</string>
+    <string name="month_medium_may">"květen"</string>
+    <string name="month_medium_june">"červen"</string>
+    <string name="month_medium_july">"červenec"</string>
+    <string name="month_medium_august">"srpen"</string>
+    <string name="month_medium_september">"září"</string>
+    <string name="month_medium_october">"říjen"</string>
+    <string name="month_medium_november">"listopad"</string>
+    <string name="month_medium_december">"prosinec"</string>
+    <string name="month_shortest_january">"1."</string>
+    <string name="month_shortest_february">"2."</string>
+    <string name="month_shortest_march">"Po"</string>
+    <string name="month_shortest_april">"4."</string>
+    <string name="month_shortest_may">"5."</string>
+    <string name="month_shortest_june">"6."</string>
+    <string name="month_shortest_july">"7."</string>
+    <string name="month_shortest_august">"8."</string>
+    <string name="month_shortest_september">"9."</string>
+    <string name="month_shortest_october">"10."</string>
+    <string name="month_shortest_november">"11."</string>
+    <string name="month_shortest_december">"12."</string>
+    <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+    <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
+    <string name="selectAll">"Vybrat vše"</string>
+    <string name="selectText">"Označit text"</string>
+    <string name="stopSelectingText">"Zastavit označování textu"</string>
+    <string name="cut">"Vyjmout"</string>
+    <string name="cutAll">"Vyjmout vše"</string>
+    <string name="copy">"Kopírovat"</string>
+    <string name="copyAll">"Kopírovat vše"</string>
+    <string name="paste">"Vložit"</string>
+    <string name="copyUrl">"Kopírovat adresu URL"</string>
+    <string name="inputMethod">"Metoda zadávání dat"</string>
+    <string name="editTextMenuTitle">"Úpravy textu"</string>
+    <string name="low_internal_storage_view_title">"Málo paměti"</string>
+    <string name="low_internal_storage_view_text">"V telefonu zbývá málo místa pro ukládání dat."</string>
+    <string name="ok">"OK"</string>
+    <string name="cancel">"Zrušit"</string>
+    <string name="yes">"OK"</string>
+    <string name="no">"Zrušit"</string>
+    <string name="capital_on">"ZAPNUTO"</string>
+    <string name="capital_off">"VYPNOUT"</string>
+    <string name="whichApplication">"Dokončit akci pomocí aplikace"</string>
+    <string name="alwaysUse">"Použít jako výchozí nastavení pro tuto činnost."</string>
+    <string name="clearDefaultHintMsg">"Vymažte výchozí hodnoty v Nastavení plochy &gt; Aplikace &gt; Správa aplikací."</string>
+    <string name="chooseActivity">"Vyberte akci"</string>
+    <string name="noApplications">"Tuto činnost nemohou provádět žádné aplikace."</string>
+    <string name="aerr_title">"Omlouváme se"</string>
+    <string name="aerr_application">"Aplikace <xliff:g id="APPLICATION">%1$s</xliff:g> (proces <xliff:g id="PROCESS">%2$s</xliff:g>) byla neočekávaně ukončena. Zkuste to znovu."</string>
+    <string name="aerr_process">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> byl neočekávaně ukončen. Opakujte prosím akci."</string>
+    <string name="anr_title">"Omlouváme se"</string>
+    <string name="anr_activity_application">"Činnost <xliff:g id="ACTIVITY">%1$s</xliff:g> (v aplikaci <xliff:g id="APPLICATION">%2$s</xliff:g>) neodpovídá."</string>
+    <string name="anr_activity_process">"Činnost <xliff:g id="ACTIVITY">%1$s</xliff:g> (v procesu <xliff:g id="PROCESS">%2$s</xliff:g>) neodpovídá."</string>
+    <string name="anr_application_process">"Aplikace <xliff:g id="APPLICATION">%1$s</xliff:g> (v procesu <xliff:g id="PROCESS">%2$s</xliff:g>) neodpovídá."</string>
+    <string name="anr_process">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> neodpovídá."</string>
+    <string name="force_close">"Ukončit aplikaci"</string>
+    <string name="wait">"Počkat"</string>
+    <string name="debug">"Ladit"</string>
+    <string name="sendText">"Vyberte činnost s textem"</string>
+    <string name="volume_ringtone">"Hlasitost vyzvánění"</string>
+    <string name="volume_music">"Hlasitost médií"</string>
+    <string name="volume_music_hint_playing_through_bluetooth">"Přehrávání pomocí rozhraní Bluetooth"</string>
+    <string name="volume_call">"Hlasitost hovoru"</string>
+    <string name="volume_call_hint_playing_through_bluetooth">"Přehrávání pomocí rozhraní Bluetooth"</string>
+    <string name="volume_alarm">"Hlasitost upozornění a budíku"</string>
+    <string name="volume_notification">"Hlasitost oznámení"</string>
+    <string name="volume_unknown">"Hlasitost"</string>
+    <string name="ringtone_default">"Výchozí vyzváněcí tón"</string>
+    <string name="ringtone_default_with_actual">"Výchozí vyzváněcí tón (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+    <string name="ringtone_silent">"Ticho"</string>
+    <string name="ringtone_picker_title">"Vyzváněcí tóny"</string>
+    <string name="ringtone_unknown">"Neznámý vyzváněcí tón"</string>
+  <plurals name="wifi_available">
+    <item quantity="one">"Je k dispozici síť WiFi."</item>
+    <item quantity="other">"Jsou k dispozici sítě WiFi."</item>
+  </plurals>
+  <plurals name="wifi_available_detailed">
+    <item quantity="one">"Je k dispozici veřejná síť WiFi"</item>
+    <item quantity="other">"Jsou k dispozici veřejné sítě WiFi"</item>
+  </plurals>
+    <string name="select_character">"Vkládání znaků"</string>
+    <string name="sms_control_default_app_name">"Neznámá aplikace"</string>
+    <string name="sms_control_title">"Odesílání zpráv SMS"</string>
+    <string name="sms_control_message">"Je odesílán velký počet zpráv SMS. Vyberte OK, chcete-li pokračovat, nebo Zrušit, chcete-li odesílání ukončit."</string>
+    <string name="sms_control_yes">"OK"</string>
+    <string name="sms_control_no">"Zrušit"</string>
+    <string name="date_time_set">"Nastavit"</string>
+    <string name="default_permission_group">"Výchozí"</string>
+    <string name="no_permissions">"Nejsou vyžadována žádná oprávnění"</string>
+    <string name="perms_hide"><b>"Skrýt"</b></string>
+    <string name="perms_show_all"><b>"Zobrazit vše"</b></string>
+    <string name="googlewebcontenthelper_loading">"Načítání..."</string>
+    <string name="usb_storage_title">"USB připojeno"</string>
+    <string name="usb_storage_message">"Připojili jste svůj telefon k počítači pomocí USB. Vyberte možnost Připojit, chcete-li zkopírovat soubory mezi vaším počítačem a kartou SD v telefonu."</string>
+    <string name="usb_storage_button_mount">"Připojit"</string>
+    <string name="usb_storage_button_unmount">"Nepřipojovat"</string>
+    <string name="usb_storage_error_message">"Při používání vaší karty SD jako úložiště USB došlo k problému."</string>
+    <string name="usb_storage_notification_title">"USB připojeno"</string>
+    <string name="usb_storage_notification_message">"Vyberte, chcete-li kopírovat soubory do nebo z počítače."</string>
+    <string name="select_input_method">"Výběr metody zadávání dat"</string>
+    <string name="fast_scroll_alphabet">"AÁBCČDĎEÉĚFGHCHIÍJKLMNŇOÓPQRŘSŠTŤUÚVWXYÝZŽ"</string>
+    <string name="fast_scroll_numeric_alphabet">"0123456789AÁBCČDĎEÉĚFGHCHIÍJKLMNŇOÓPQRŘSŠTŤUÚVWXYÝZŽ"</string>
+    <string name="candidates_style"><font fgcolor="#ff000000" bgcolor="#ff8080ff"><u>"kandidáti"</u>"u&gt;"</font></string>
+</resources>
index 4b0419c..0b2c7a7 100644 (file)
@@ -25,8 +25,7 @@
     <string name="badPuk">"Der von Ihnen eingegebene PUK ist nicht korrekt."</string>
     <string name="mismatchPin">"Die von Ihnen eingegebenen PIN-Nummern stimmen nicht überein."</string>
     <string name="invalidPin">"Geben Sie eine PIN ein, die 4 bis 8 Zahlen enthält."</string>
-    <!-- no translation found for needPuk (919668385956251611) -->
-    <skip />
+    <string name="needPuk">"Ihre SIM-Karte ist mit einem PUK gesperrt. Geben Sie zum Entsperren den PUK-Code ein."</string>
     <string name="needPuk2">"Geben Sie zum Entsperren der SIM-Karte den PUK2 ein."</string>
     <string name="ClipMmi">"Anrufer-ID für eingehenden Anruf"</string>
     <string name="ClirMmi">"Anrufer-ID für abgehenden Anruf"</string>
     <string name="permdesc_runSetActivityWatcher">"Ermöglicht der Anwendung, den Start von Systemaktivitäten zu überwachen und zu steuern. Schädliche Anwendungen können so das gesamte System beeinträchtigen. Diese Berechtigung wird nur zu Entwicklungszwecken und nie für die normale Telefonnutzung benötigt."</string>
     <string name="permlab_broadcastPackageRemoved">"Broadcast ohne Paket senden"</string>
     <string name="permdesc_broadcastPackageRemoved">"Ermöglicht einer Anwendung, eine Benachrichtigung zur Entfernung eines Anwendungspakets zu senden. Schädliche Anwendungen können so laufende Anwendungen beenden."</string>
-    <!-- no translation found for permlab_broadcastSmsReceived (5689095009030336593) -->
-    <skip />
-    <!-- no translation found for permdesc_broadcastSmsReceived (9122419277306740155) -->
-    <skip />
-    <!-- no translation found for permlab_broadcastWapPush (3145347413028582371) -->
-    <skip />
-    <!-- no translation found for permdesc_broadcastWapPush (3955303669461378091) -->
-    <skip />
+    <string name="permlab_broadcastSmsReceived">"per SMS empfangenen Broadcast senden"</string>
+    <string name="permdesc_broadcastSmsReceived">"Ermöglicht einer Anwendung, eine Benachrichtigung zu senden, dass eine Kurzmitteilung empfangen wurde. Schädliche Anwendungen könnten diese Option verwenden, um den Eingang von Kurzmitteilungen zu erzwingen."</string>
+    <string name="permlab_broadcastWapPush">"von WAP-PUSH empfangenen Broadcast senden"</string>
+    <string name="permdesc_broadcastWapPush">"Ermöglicht einer Anwendung, eine Benachrichtigung zu senden, dass eine WAP PUSH-Nachricht empfangen wurde. Schädliche Anwendungen könnten diese Option verwenden, um den Erhalt von MMS-Mitteilungen zu erzwingen, oder um unbemerkt den Inhalt einer beliebigen Webseite durch schädliche Inhalte zu ersetzen."</string>
     <string name="permlab_setProcessLimit">"Anzahl der laufenden Prozesse beschränken"</string>
     <string name="permdesc_setProcessLimit">"Ermöglicht einer Anwendung, die maximale Anzahl an laufenden Prozessen zu steuern. Wird nicht für normale Anwendungen benötigt."</string>
     <string name="permlab_setAlwaysFinish">"alle Anwendungen im Hintergrund schließen"</string>
     <string name="permdesc_injectEvents">"Ermöglicht einer Anwendung, ihre eigenen Eingabeaktionen (Drücken von Tasten etc.) an andere Anwendungen zu liefern.  Schädliche Anwendungen können so die Kontrolle über Ihr Telefon übernehmen."</string>
     <string name="permlab_readInputState">"Tastatureingaben und Aktionen aufzeichnen"</string>
     <string name="permdesc_readInputState">"Ermöglicht Anwendungen, die von Ihnen gedrückten Tasten zu überwachen (etwa die Eingabe eines Passworts). Dies gilt auch für die Interaktion mit anderen Anwendungen. Sollte für normale Anwendungen nicht benötigt werden."</string>
+    <string name="permlab_bindInputMethod">"An eine Eingabemethode binden"</string>
+    <string name="permdesc_bindInputMethod">"Ermöglicht dem Halter, sich an die Oberfläche einer Eingabemethode auf oberster Ebene zu binden. Sollte nie für normale Anwendungen benötigt werden."</string>
     <string name="permlab_setOrientation">"Bildschirmausrichtung ändern"</string>
     <string name="permdesc_setOrientation">"Ermöglicht der Anwendung, die Bildschirmdrehung jederzeit zu ändern. Sollte nicht für normale Anwendungen benötigt werden."</string>
     <string name="permlab_signalPersistentProcesses">"Linux-Signale an Anwendungen senden"</string>
     <string name="permlab_diagnostic">"Lese-/Schreibberechtigung für zu Diagnosegruppe gehörige Elemente"</string>
     <string name="permdesc_diagnostic">"Ermöglicht einer Anwendung, alle Elemente in der Diagnosegruppe zu lesen und zu bearbeiten, etwa Dateien in \"/dev\". Dies könnte eine potenzielle Gefährdung für die Stabilität und Sicherheit des Systems darstellen und sollte NUR für Hardware-spezifische Diagnosen des Herstellers oder Netzbetreibers verwendet werden."</string>
     <string name="permlab_changeComponentState">"Anwendungskomponenten aktivieren oder deaktivieren"</string>
-    <!-- no translation found for permdesc_changeComponentState (4569107043246700630) -->
-    <skip />
+    <string name="permdesc_changeComponentState">"Ermöglicht einer Anwendung, die Komponente einer anderen Anwendung nach Belieben zu aktivieren oder zu deaktivieren. Schädliche Anwendungen können so wichtige Funktionen des Telefons deaktivieren. Bei der Erteilung von Berechtigungen ist daher Vorsicht geboten, da die Anwendungskomponenten unbrauchbar, inkonsistent und unstabil werden können."</string>
     <string name="permlab_setPreferredApplications">"Bevorzugte Einstellungen festlegen"</string>
     <string name="permdesc_setPreferredApplications">"Ermöglicht einer Anwendung, Ihre bevorzugten Einstellungen zu ändern. Schädliche Anwendungen können so laufende Anwendungen ohne Ihr Wissen ändern, damit die vorhandenen Anwendungen private Daten von Ihnen sammeln."</string>
     <string name="permlab_writeSettings">"Allgemeine Systemeinstellungen ändern"</string>
     <string name="permdesc_writeSettings">"Ermöglicht einer Anwendung, die Einstellungsdaten des Systems zu ändern. Schädliche Anwendungen können so die Systemkonfiguration beschädigen."</string>
-    <!-- no translation found for permlab_writeSecureSettings (204676251876718288) -->
-    <skip />
-    <!-- no translation found for permdesc_writeSecureSettings (4116616249170428132) -->
-    <skip />
+    <string name="permlab_writeSecureSettings">"Sicherheitseinstellungen für das System ändern"</string>
+    <string name="permdesc_writeSecureSettings">"Ermöglicht einer Anwendung, die Daten der Sicherheitseinstellungen des Systems zu ändern. Nicht für normale Anwendungen vorgesehen."</string>
     <string name="permlab_writeGservices">"Google Services Map ändern"</string>
     <string name="permdesc_writeGservices">"Ermöglicht einer Anwendung, Änderungen an der Google Services Map vorzunehmen. Nicht für normale Anwendungen vorgesehen."</string>
     <string name="permlab_receiveBootCompleted">"Automatisch nach dem Booten starten"</string>
     <string name="permdesc_subscribedFeedsRead">"Ermöglicht einer Anwendung, Details zu den zurzeit synchronisierten Feeds abzurufen."</string>
     <string name="permlab_subscribedFeedsWrite">"Abonnierte Feeds schreiben"</string>
     <string name="permdesc_subscribedFeedsWrite">"Ermöglicht einer Anwendung, Änderungen an den kürzlich synchronisierten Feeds vorzunehmen. Schädliche Anwendungen könnten so Ihre synchronisierten Feeds ändern."</string>
-    <!-- no translation found for phoneTypes:7 (9192514806975898961) -->
-    <!-- no translation found for emailAddressTypes:3 (2374913952870110618) -->
-    <!-- no translation found for postalAddressTypes:3 (4932682847595299369) -->
-    <!-- no translation found for imAddressTypes:3 (3145118944639869809) -->
-    <!-- no translation found for organizationTypes:2 (3455047468583965104) -->
+  <string-array name="phoneTypes">
+    <item>"Privat"</item>
+    <item>"Mobil"</item>
+    <item>"Beruflich"</item>
+    <item>"Beruflich (Fax)"</item>
+    <item>"Faxnummer (privat)"</item>
+    <item>"Pager"</item>
+    <item>"Andere"</item>
+    <item>"Benutzerdefiniert"</item>
+  </string-array>
+  <string-array name="emailAddressTypes">
+    <item>"Privat"</item>
+    <item>"Beruflich"</item>
+    <item>"Andere"</item>
+    <item>"Benutzerdefiniert"</item>
+  </string-array>
+  <string-array name="postalAddressTypes">
+    <item>"Privat"</item>
+    <item>"Beruflich"</item>
+    <item>"Andere"</item>
+    <item>"Benutzerdefiniert"</item>
+  </string-array>
+  <string-array name="imAddressTypes">
+    <item>"Privat"</item>
+    <item>"Beruflich"</item>
+    <item>"Andere"</item>
+    <item>"Benutzerdefiniert"</item>
+  </string-array>
+  <string-array name="organizationTypes">
+    <item>"Beruflich"</item>
+    <item>"Andere"</item>
+    <item>"Benutzerdefiniert"</item>
+  </string-array>
   <string-array name="imProtocols">
     <item>"AIM"</item>
     <item>"Windows Live"</item>
     <item>"ICQ"</item>
     <item>"Jabber"</item>
   </string-array>
-    <!-- no translation found for keyguard_password_enter_pin_code (3731488827218876115) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_code">"PIN-Code eingeben"</string>
     <string name="keyguard_password_wrong_pin_code">"Falscher PIN-Code!"</string>
     <string name="keyguard_label_text">"Drücken Sie zum Entsperren auf \"Menü\" und dann auf \"0\"."</string>
     <string name="emergency_call_dialog_number_for_display">"Notrufnummer"</string>
     <string name="lockscreen_carrier_default">"(kein Dienst)"</string>
-    <!-- no translation found for lockscreen_screen_locked (7288443074806832904) -->
-    <skip />
+    <string name="lockscreen_screen_locked">"Display gesperrt."</string>
     <string name="lockscreen_instructions_when_pattern_enabled">"Drücken Sie auf die \"Menü\", um das Telefon zu entsperren oder einen Notruf zu tätigen."</string>
     <string name="lockscreen_instructions_when_pattern_disabled">"Drücken Sie zum Entsperren auf \"Menü\"."</string>
-    <!-- no translation found for lockscreen_pattern_instructions (7478703254964810302) -->
-    <skip />
+    <string name="lockscreen_pattern_instructions">"Schema für Entsperrung zeichnen"</string>
     <string name="lockscreen_emergency_call">"Notruf"</string>
     <string name="lockscreen_pattern_correct">"Korrekt!"</string>
-    <!-- no translation found for lockscreen_pattern_wrong (4817583279053112312) -->
-    <skip />
+    <string name="lockscreen_pattern_wrong">"Tut uns leid. Versuchen Sie es noch einmal."</string>
     <string name="lockscreen_plugged_in">"Wird aufgeladen (<xliff:g id="NUMBER">%d%%</xliff:g>)"</string>
     <string name="lockscreen_low_battery">"Stecken Sie Ihr Ladegerät ein."</string>
     <string name="lockscreen_missing_sim_message_short">"Keine SIM-Karte."</string>
     <string name="lockscreen_too_many_failed_attempts_countdown">"Versuchen Sie es in <xliff:g id="NUMBER">%d</xliff:g> Sekunden erneut."</string>
     <string name="lockscreen_forgot_pattern_button_text">"Muster vergessen?"</string>
     <string name="lockscreen_glogin_too_many_attempts">"Zu viele Versuche!"</string>
-    <!-- no translation found for lockscreen_glogin_instructions (7400120254204758548) -->
-    <skip />
+    <string name="lockscreen_glogin_instructions">"Melden Sie sich zum Entsperren"\n"mit Ihrem Google-Konto an."</string>
     <string name="lockscreen_glogin_username_hint">"Nutzername (E-Mail)"</string>
     <string name="lockscreen_glogin_password_hint">"Passwort"</string>
     <string name="lockscreen_glogin_submit_button">"Anmelden"</string>
     <string name="lockscreen_glogin_invalid_input">"Ungültiger  Nutzername oder ungültiges Passwort."</string>
     <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
-    <!-- no translation found for hour_minute_ampm (7044207493989843593) -->
-    <skip />
-    <!-- no translation found for hour_minute_cap_ampm (5778825208801303756) -->
-    <skip />
+    <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+    <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <!-- no translation found for hour_ampm (7618670480400517084) -->
     <skip />
     <!-- no translation found for hour_cap_ampm (5117798389811605468) -->
     <string name="yesterday">"Gestern"</string>
     <string name="tomorrow">"Morgen"</string>
     <string name="oneMonthDurationPast">"Vor 1 Monat"</string>
-    <!-- no translation found for beforeOneMonthDurationPast (909134546836499826) -->
-    <skip />
+    <string name="beforeOneMonthDurationPast">"Vor mehr als 1 Monat"</string>
   <plurals name="num_seconds_ago">
     <item quantity="one">"Vor 1 Sekunde"</item>
     <item quantity="other">"Vor <xliff:g id="COUNT">%d</xliff:g> Sekunden"</item>
     <item quantity="one">"morgen"</item>
     <item quantity="other">"in <xliff:g id="COUNT">%d</xliff:g> Tagen"</item>
   </plurals>
+    <!-- no translation found for abbrev_num_seconds_ago:one (1849036840200069118) -->
+    <!-- no translation found for abbrev_num_seconds_ago:other (3699169366650930415) -->
+    <!-- no translation found for abbrev_num_minutes_ago:one (6361490147113871545) -->
+    <!-- no translation found for abbrev_num_minutes_ago:other (851164968597150710) -->
+    <!-- no translation found for abbrev_num_hours_ago:one (4796212039724722116) -->
+    <!-- no translation found for abbrev_num_hours_ago:other (6889970745748538901) -->
+    <!-- no translation found for abbrev_num_days_ago:one (8463161711492680309) -->
+    <!-- no translation found for abbrev_num_days_ago:other (3453342639616481191) -->
+    <!-- no translation found for abbrev_in_num_seconds:one (5842225370795066299) -->
+    <!-- no translation found for abbrev_in_num_seconds:other (5495880108825805108) -->
+    <!-- no translation found for abbrev_in_num_minutes:one (562786149928284878) -->
+    <!-- no translation found for abbrev_in_num_minutes:other (4216113292706568726) -->
+    <!-- no translation found for abbrev_in_num_hours:one (3274708118124045246) -->
+    <!-- no translation found for abbrev_in_num_hours:other (3705373766798013406) -->
+    <!-- no translation found for abbrev_in_num_days:one (2178576254385739855) -->
+    <!-- no translation found for abbrev_in_num_days:other (2973062968038355991) -->
     <string name="preposition_for_date">"am %s"</string>
     <string name="preposition_for_time">"am %s"</string>
     <string name="preposition_for_year">"in %s"</string>
     <string name="time_wday_date">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>, <xliff:g id="DATE">%3$s</xliff:g>"</string>
     <string name="wday_date">"<xliff:g id="WEEKDAY">%2$s</xliff:g>, <xliff:g id="DATE">%3$s</xliff:g>"</string>
     <string name="time_date">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="DATE">%3$s</xliff:g>"</string>
-    <string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string>
-    <!-- no translation found for full_date_month_first (4336173217988750514) -->
+    <!-- no translation found for date_time (6104442718633642836) -->
     <skip />
-    <string name="full_date_day_first">"<xliff:g id="DAY">dd</xliff:g>. <xliff:g id="MONTH">MMMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string>
-    <!-- no translation found for medium_date_month_first (4631100332959851900) -->
+    <!-- no translation found for relative_time (1818557177829411417) -->
     <skip />
+    <string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string>
+    <string name="full_date_month_first">"<xliff:g id="DAY">dd</xliff:g>. <xliff:g id="MONTH">MMMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="full_date_day_first">"<xliff:g id="DAY">dd</xliff:g>. <xliff:g id="MONTH">MMMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="medium_date_month_first">"<xliff:g id="DAY">dd</xliff:g>. <xliff:g id="MONTH">MMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string>
     <string name="medium_date_day_first">"<xliff:g id="DAY">dd</xliff:g>. <xliff:g id="MONTH">MMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string>
-    <!-- no translation found for twelve_hour_time_format (8739508068310928118) -->
-    <skip />
-    <!-- no translation found for twenty_four_hour_time_format (2267729602804604858) -->
-    <skip />
+    <string name="twelve_hour_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">a</xliff:g>"</string>
+    <string name="twenty_four_hour_time_format">"<xliff:g id="HOUR">H</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g>"</string>
     <string name="noon">"Mittag"</string>
     <string name="Noon">"Mittag"</string>
     <string name="midnight">"Mitternacht"</string>
     <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
     <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
     <string name="selectAll">"Alles auswählen"</string>
+    <string name="selectText">"Text auswählen"</string>
+    <string name="stopSelectingText">"Textauswahl beenden"</string>
     <string name="cut">"Ausschneiden"</string>
     <string name="cutAll">"Alles ausschneiden"</string>
     <string name="copy">"Kopieren"</string>
     <string name="copyAll">"Alles kopieren"</string>
     <string name="paste">"Einfügen"</string>
     <string name="copyUrl">"URL kopieren"</string>
-    <!-- no translation found for inputMethod (7673923508389094672) -->
-    <skip />
-    <!-- no translation found for editTextMenuTitle (1672989176958581452) -->
-    <skip />
+    <string name="inputMethod">"Eingabemethode"</string>
+    <string name="editTextMenuTitle">"Text bearbeiten"</string>
     <string name="low_internal_storage_view_title">"Geringer Speicher"</string>
     <string name="low_internal_storage_view_text">"Kaum noch freier Telefonspeicher verfügbar."</string>
     <string name="ok">"OK"</string>
     <string name="debug">"Fehler suchen"</string>
     <string name="sendText">"Aktion für Text auswählen"</string>
     <string name="volume_ringtone">"Klingeltonlautstärke"</string>
-    <string name="volume_music">"Lautstärke"</string>
+    <string name="volume_music">"Medienlautstärke"</string>
+    <string name="volume_music_hint_playing_through_bluetooth">"Wiedergabe durch Bluetooth"</string>
     <string name="volume_call">"Lautstärke bei eingehendem Anruf"</string>
+    <string name="volume_call_hint_playing_through_bluetooth">"Wiedergabe durch Bluetooth"</string>
     <string name="volume_alarm">"Lautstärke für Alarm"</string>
+    <string name="volume_notification">"Benachrichtigungslautstärke"</string>
     <string name="volume_unknown">"Lautstärke"</string>
     <string name="ringtone_default">"Standard-Klingelton"</string>
     <string name="ringtone_default_with_actual">"Standard-Klingelton (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
     <string name="ringtone_silent">"Lautlos"</string>
-    <!-- no translation found for ringtone_picker_title (3515143939175119094) -->
-    <skip />
+    <string name="ringtone_picker_title">"Klingeltöne"</string>
     <string name="ringtone_unknown">"Unbekannter Klingelton"</string>
   <plurals name="wifi_available">
     <item quantity="one">"WLAN-Netzwerk verfügbar"</item>
     <item quantity="one">"Verfügbares WLAN-Netzwerk öffnen"</item>
     <item quantity="other">"Verfügbare WLAN-Netzwerke öffnen"</item>
   </plurals>
-    <!-- no translation found for select_character (3365550120617701745) -->
-    <skip />
+    <string name="select_character">"Zeichen einfügen"</string>
     <string name="sms_control_default_app_name">"Unbekannte Anwendung"</string>
     <string name="sms_control_title">"Kurznachrichten werden gesendet"</string>
     <string name="sms_control_message">"Es werden eine große Anzahl an Kurznachrichten versendet. Wählen Sie \"OK\", um fortzufahren, oder drücken Sie auf \"Abbrechen\", um den Sendevorgang zu beenden."</string>
     <string name="usb_storage_error_message">"Bei der Verwendung Ihrer SD-Karte als USB-Speicher ist ein Problem aufgetreten."</string>
     <string name="usb_storage_notification_title">"USB-Verbindung"</string>
     <string name="usb_storage_notification_message">"Wählen Sie die Dateien aus, die von Ihrem oder auf Ihren Computer kopiert werden sollen."</string>
-    <!-- no translation found for select_input_method (2086499663193509436) -->
-    <skip />
-    <!-- no translation found for fast_scroll_alphabet (5433275485499039199) -->
-    <skip />
-    <!-- no translation found for fast_scroll_numeric_alphabet (4030170524595123610) -->
-    <skip />
-    <!-- no translation found for candidates_style (5248064431114273041) -->
-    <skip />
+    <string name="select_input_method">"Eingabemethode auswählen"</string>
+    <string name="fast_scroll_alphabet">"ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="fast_scroll_numeric_alphabet">"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="candidates_style"><font fgcolor="#ff000000" bgcolor="#ff8080ff"><u>"Kandidaten"</u>"u&gt;"</font></string>
 </resources>
diff --git a/core/res/res/values-es/arrays.xml b/core/res/res/values-es/arrays.xml
new file mode 100644 (file)
index 0000000..f9c904b
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
new file mode 100644 (file)
index 0000000..6727d5e
--- /dev/null
@@ -0,0 +1,724 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="byteShort">"B"</string>
+    <string name="kilobyteShort">"KB"</string>
+    <string name="megabyteShort">"MB"</string>
+    <string name="gigabyteShort">"GB"</string>
+    <string name="terabyteShort">"TB"</string>
+    <string name="petabyteShort">"PB"</string>
+    <string name="untitled">"&lt;sin título&gt;"</string>
+    <string name="ellipsis">"…"</string>
+    <string name="emptyPhoneNumber">"(Sin número de teléfono)"</string>
+    <string name="unknownName">"Desconocido"</string>
+    <string name="defaultVoiceMailAlphaTag">"Buzón de voz"</string>
+    <string name="defaultMsisdnAlphaTag">"MSISDN1"</string>
+    <string name="mmiError">"Se ha producido un problema de conexión o el código MMI no es válido."</string>
+    <string name="serviceEnabled">"El servicio se ha habilitado."</string>
+    <string name="serviceEnabledFor">"Se ha habilitado el servicio para:"</string>
+    <string name="serviceDisabled">"El servicio se ha inhabilitado."</string>
+    <string name="serviceRegistered">"El registro se ha realizado correctamente."</string>
+    <string name="serviceErased">"El elemento se ha borrado correctamente."</string>
+    <string name="passwordIncorrect">"Contraseña incorrecta"</string>
+    <string name="mmiComplete">"MMI completo"</string>
+    <string name="badPin">"El PIN antiguo que has introducido no es correcto."</string>
+    <string name="badPuk">"El código PUK que has introducido no es correcto."</string>
+    <string name="mismatchPin">"Los códigos PIN introducidos no coinciden."</string>
+    <string name="invalidPin">"Introduce un código PIN con una longitud comprendida entre cuatro y ocho dígitos."</string>
+    <string name="needPuk">"La tarjeta SIM está bloqueada con el código PUK. Introduce el código PUK para desbloquearla."</string>
+    <string name="needPuk2">"Introduce el código PUK2 para desbloquear la tarjeta SIM."</string>
+    <string name="ClipMmi">"ID de emisor de llamada entrante"</string>
+    <string name="ClirMmi">"ID de emisor de llamada saliente"</string>
+    <string name="CfMmi">"Desvío de llamada"</string>
+    <string name="CwMmi">"Llamada en espera"</string>
+    <string name="BaMmi">"Bloqueo de llamada"</string>
+    <string name="PwdMmi">"Cambio de contraseña"</string>
+    <string name="PinMmi">"Cambio de PIN"</string>
+    <string name="CLIRDefaultOnNextCallOn">"El ID de emisor presenta el valor predeterminado de restringido. Siguiente llamada: Restringido"</string>
+    <string name="CLIRDefaultOnNextCallOff">"El ID de emisor presenta el valor predeterminado de restringido. Siguiente llamada: No restringido"</string>
+    <string name="CLIRDefaultOffNextCallOn">"El ID de emisor presenta el valor predeterminado de no restringido. Siguiente llamada: Restringido"</string>
+    <string name="CLIRDefaultOffNextCallOff">"El ID de emisor presenta el valor predeterminado de no restringido. Siguiente llamada: No restringido"</string>
+    <string name="serviceNotProvisioned">"El servicio no se suministra."</string>
+    <string name="CLIRPermanent">"El ID del emisor no se puede modificar."</string>
+    <string name="serviceClassVoice">"Voz"</string>
+    <string name="serviceClassData">"Datos"</string>
+    <string name="serviceClassFAX">"FAX"</string>
+    <string name="serviceClassSMS">"SMS"</string>
+    <string name="serviceClassDataAsync">"Asíncronos"</string>
+    <string name="serviceClassDataSync">"Sincronización"</string>
+    <string name="serviceClassPacket">"Paquete"</string>
+    <string name="serviceClassPAD">"PAD"</string>
+    <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: No desviada"</string>
+    <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+    <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> transcurridos <xliff:g id="TIME_DELAY">{2}</xliff:g> segundos"</string>
+    <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: No desviada"</string>
+    <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: No desviada"</string>
+    <string name="httpErrorOk">"Aceptar"</string>
+    <string name="httpError">"La página web contiene un error."</string>
+    <string name="httpErrorLookup">"No se ha podido encontrar la URL."</string>
+    <string name="httpErrorUnsupportedAuthScheme">"No se admite el esquema de autenticación del sitio."</string>
+    <string name="httpErrorAuth">"La autenticación no se ha realizado correctamente."</string>
+    <string name="httpErrorProxyAuth">"La autenticación mediante el servidor proxy no se ha realizado correctamente."</string>
+    <string name="httpErrorConnect">"La conexión al servidor no se ha realizado correctamente."</string>
+    <string name="httpErrorIO">"El servidor no ha podido establecer la comunicación. Vuelve a intentarlo más tarde."</string>
+    <string name="httpErrorTimeout">"Se ha agotado el tiempo de espera de conexión al servidor."</string>
+    <string name="httpErrorRedirectLoop">"La página contiene demasiados redireccionamientos de servidor."</string>
+    <string name="httpErrorUnsupportedScheme">"Protocolo no admitido"</string>
+    <string name="httpErrorFailedSslHandshake">"No se ha podido establecer una conexión segura."</string>
+    <string name="httpErrorBadUrl">"La página no se ha podido abrir porque la URL no es válida."</string>
+    <string name="httpErrorFile">"No se ha podido acceder al archivo."</string>
+    <string name="httpErrorFileNotFound">"No se ha encontrado el archivo solicitado."</string>
+    <string name="httpErrorTooManyRequests">"Se están procesando demasiadas solicitudes. Vuelve a intentarlo más tarde."</string>
+    <string name="contentServiceSync">"Sincronización"</string>
+    <string name="contentServiceSyncNotificationTitle">"Sincronización"</string>
+    <string name="contentServiceTooManyDeletesNotificationDesc">"Demasiadas eliminaciones de <xliff:g id="CONTENT_TYPE">%s</xliff:g>"</string>
+    <string name="low_memory">"Se ha agotado el espacio de almacenamiento del teléfono. Elimina algunos archivos para liberar espacio."</string>
+    <string name="me">"Yo"</string>
+    <string name="power_dialog">"Opciones del teléfono"</string>
+    <string name="silent_mode">"Modo silencio"</string>
+    <string name="turn_on_radio">"Activar conexión inalámbrica"</string>
+    <string name="turn_off_radio">"Desactivar función inalámbrica"</string>
+    <string name="screen_lock">"Bloqueo de pantalla"</string>
+    <string name="power_off">"Apagar"</string>
+    <string name="shutdown_progress">"Apagando..."</string>
+    <string name="shutdown_confirm">"El teléfono se apagará."</string>
+    <string name="no_recent_tasks">"No hay aplicaciones recientes"</string>
+    <string name="global_actions">"Opciones del teléfono"</string>
+    <string name="global_action_lock">"Bloqueo de pantalla"</string>
+    <string name="global_action_power_off">"Apagar"</string>
+    <string name="global_action_toggle_silent_mode">"Modo silencio"</string>
+    <string name="global_action_silent_mode_on_status">"El sonido está desactivado."</string>
+    <string name="global_action_silent_mode_off_status">"El sonido está activado."</string>
+    <string name="safeMode">"Modo seguro"</string>
+    <string name="permgrouplab_costMoney">"Servicios por los que tienes que pagar"</string>
+    <string name="permgroupdesc_costMoney">"Permite que las aplicaciones realicen acciones por las que puede que tengas que pagar."</string>
+    <string name="permgrouplab_messages">"Tus mensajes"</string>
+    <string name="permgroupdesc_messages">"Leer y escribir SMS, mensajes de correo electrónico y otros mensajes"</string>
+    <string name="permgrouplab_personalInfo">"Tu información personal"</string>
+    <string name="permgroupdesc_personalInfo">"Acceso directo al calendario y a los contactos almacenados en el teléfono"</string>
+    <string name="permgrouplab_location">"Tu ubicación"</string>
+    <string name="permgroupdesc_location">"Controlar su ubicación física"</string>
+    <string name="permgrouplab_network">"Comunicación de red"</string>
+    <string name="permgroupdesc_network">"Permite que las aplicaciones accedan a distintas funciones de red."</string>
+    <string name="permgrouplab_accounts">"Tus cuentas de Google"</string>
+    <string name="permgroupdesc_accounts">"Acceder a las cuentas de Google disponibles"</string>
+    <string name="permgrouplab_hardwareControls">"Controles de hardware"</string>
+    <string name="permgroupdesc_hardwareControls">"Acceso directo al hardware del móvil"</string>
+    <string name="permgrouplab_phoneCalls">"Llamadas de teléfono"</string>
+    <string name="permgroupdesc_phoneCalls">"Controlar, registrar y procesar llamadas telefónicas"</string>
+    <string name="permgrouplab_systemTools">"Herramientas del sistema"</string>
+    <string name="permgroupdesc_systemTools">"Acceso de nivel inferior y control del sistema"</string>
+    <string name="permgrouplab_developmentTools">"Herramientas de desarrollo"</string>
+    <string name="permgroupdesc_developmentTools">"Funciones necesarias sólo para desarrolladores de aplicaciones"</string>
+    <string name="permlab_statusBar">"inhabilitar o modificar la barra de estado"</string>
+    <string name="permdesc_statusBar">"Permite que las aplicaciones inhabiliten la barra de estado, o añadan y eliminen iconos del sistema."</string>
+    <string name="permlab_expandStatusBar">"expandir/contraer la barra de estado"</string>
+    <string name="permdesc_expandStatusBar">"Permite que la aplicación expanda y contraiga la barra de estado."</string>
+    <string name="permlab_processOutgoingCalls">"interceptar llamadas salientes"</string>
+    <string name="permdesc_processOutgoingCalls">"Permite que la aplicación procese llamadas salientes y cambie el número que se va a marcar. Las aplicaciones malintencionadas pueden controlar, redirigir o impedir las llamadas salientes."</string>
+    <string name="permlab_receiveSms">"recibir SMS"</string>
+    <string name="permdesc_receiveSms">"Permite que la aplicación reciba y procese mensajes SMS. Las aplicaciones malintencionadas pueden controlar los mensajes o eliminarlos sin mostrarlos al usuario."</string>
+    <string name="permlab_receiveMms">"recibir MMS"</string>
+    <string name="permdesc_receiveMms">"Permite que la aplicación reciba y procese mensajes MMS. Las aplicaciones malintencionadas pueden controlar los mensajes o eliminarlos sin mostrarlos al usuario."</string>
+    <string name="permlab_sendSms">"enviar mensajes SMS"</string>
+    <string name="permdesc_sendSms">"Permite que la aplicación envíe mensajes SMS. Es posible que tengas que pagar si las aplicaciones malintencionadas envían mensajes sin tu confirmación."</string>
+    <string name="permlab_readSms">"leer SMS o MMS"</string>
+    <string name="permdesc_readSms">"Permite que la aplicación lea mensajes SMS almacenados en el teléfono o en la tarjeta SIM. Las aplicaciones malintencionadas pueden leer los mensajes confidenciales."</string>
+    <string name="permlab_writeSms">"editar SMS o MMS"</string>
+    <string name="permdesc_writeSms">"Permite que la aplicación escriba en mensajes SMS almacenados en el teléfono o en la tarjeta SIM. Las aplicaciones malintencionadas pueden borrar los mensajes."</string>
+    <string name="permlab_receiveWapPush">"recibir WAP"</string>
+    <string name="permdesc_receiveWapPush">"Permite que la aplicación reciba y procese mensajes WAP. Las aplicaciones malintencionadas pueden controlar los mensajes o eliminarlos sin mostrarlos al usuario."</string>
+    <string name="permlab_getTasks">"recuperar aplicaciones en ejecución"</string>
+    <string name="permdesc_getTasks">"Permite que la aplicación recupere información sobre tareas que se están ejecutando en este momento o que se han ejecutado recientemente. Puede permitir que las aplicaciones malintencionadas vean información privada sobre otras aplicaciones."</string>
+    <string name="permlab_reorderTasks">"reorganizar aplicaciones en ejecución"</string>
+    <string name="permdesc_reorderTasks">"Permite que una aplicación mueva tareas a segundo plano y a primer plano. Las aplicaciones malintencionadas pueden aparecer en primer plano sin su control."</string>
+    <string name="permlab_setDebugApp">"habilitar depuración de aplicación"</string>
+    <string name="permdesc_setDebugApp">"Permite que una aplicación active la depuración de otra aplicación. Las aplicaciones malintencionadas pueden utilizar este permiso para desactivar otras aplicaciones."</string>
+    <string name="permlab_changeConfiguration">"cambiar la configuración de la interfaz de usuario"</string>
+    <string name="permdesc_changeConfiguration">"Permite que una aplicación cambie la configuración actual como, por ejemplo, la configuración regional o el tamaño de fuente general."</string>
+    <string name="permlab_restartPackages">"reiniciar otras aplicaciones"</string>
+    <string name="permdesc_restartPackages">"Permite que una aplicación reinicie de forma forzosa otras aplicaciones."</string>
+    <string name="permlab_setProcessForeground">"impedir su interrupción"</string>
+    <string name="permdesc_setProcessForeground">"Permite que una aplicación ejecute cualquier proceso en segundo plano, de forma que no se pueda interrumpir. No debería ser necesario nunca para las aplicaciones normales."</string>
+    <string name="permlab_forceBack">"forzar el cierre de la aplicación"</string>
+    <string name="permdesc_forceBack">"Permite que una aplicación fuerce a cualquier actividad en segundo plano a cerrarse y volver a la pantalla anterior. No debería ser necesario nunca para las aplicaciones normales."</string>
+    <string name="permlab_dump">"recuperar estado interno del sistema"</string>
+    <string name="permdesc_dump">"Permite que la aplicación recupere el estado interno del sistema. Las aplicaciones malintencionadas pueden recuperar una amplia variedad de información protegida y privada que normalmente no deberían necesitar."</string>
+    <string name="permlab_addSystemService">"publicar servicios de nivel inferior"</string>
+    <string name="permdesc_addSystemService">"Permite que la aplicación publique sus propios servicios de sistema de nivel inferior. Las aplicaciones malintencionadas pueden hacerse con el control del sistema, y robar o dañar los datos contenidos en él."</string>
+    <string name="permlab_runSetActivityWatcher">"supervisar y controlar la ejecución de todas las aplicaciones"</string>
+    <string name="permdesc_runSetActivityWatcher">"Permite que una aplicación supervise y controle la ejecución de las actividades por parte del sistema. Las aplicaciones malintencionadas pueden vulnerar la seguridad del sistema. Este permiso sólo es necesario para tareas de desarrollo, nunca para el uso habitual del teléfono."</string>
+    <string name="permlab_broadcastPackageRemoved">"enviar emisión eliminada de paquete"</string>
+    <string name="permdesc_broadcastPackageRemoved">"Permite que una aplicación emita una notificación de que se ha eliminado un paquete de aplicación. Las aplicaciones malintencionadas pueden utilizar este permiso para interrumpir la ejecución de cualquier otra aplicación."</string>
+    <string name="permlab_broadcastSmsReceived">"enviar una emisión recibida mediante SMS"</string>
+    <string name="permdesc_broadcastSmsReceived">"Permite que una aplicación emita una notificación de que se ha recibido un mensaje SMS. Las aplicaciones malintencionadas  pueden utilizar este permiso para falsificar mensajes SMS entrantes."</string>
+    <string name="permlab_broadcastWapPush">"enviar emisión recibida mediante mensaje WAP PUSH"</string>
+    <string name="permdesc_broadcastWapPush">"Permite que una aplicación emita una notificación de que se ha recibido un mensaje WAP PUSH. Las aplicaciones malintencionadas pueden utilizar este permiso para falsificar la recepción de un mensaje MMS o para reemplazar de forma silenciosa el contenido de cualquier página web con variantes malintencionadas."</string>
+    <string name="permlab_setProcessLimit">"limitar el número de procesos en ejecución"</string>
+    <string name="permdesc_setProcessLimit">"Permite que una aplicación controle el número máximo de procesos que se ejecutarán. No es necesario nunca para las aplicaciones normales."</string>
+    <string name="permlab_setAlwaysFinish">"hacer que se cierren todas las aplicaciones en segundo plano"</string>
+    <string name="permdesc_setAlwaysFinish">"Permite que una aplicación controle si las actividades finalizan siempre en cuanto pasan a segundo plano. No es necesario nunca para las aplicaciones normales."</string>
+    <string name="permlab_fotaUpdate">"instalar actualizaciones del sistema de forma automática"</string>
+    <string name="permdesc_fotaUpdate">"Permite que una aplicación reciba notificaciones sobre actualizaciones pendientes del sistema e inicie su instalación. Las aplicaciones malintencionadas pueden utilizar este permiso para provocar daños en el sistema con actualizaciones no autorizadas o interferir de forma general en el proceso de actualización."</string>
+    <string name="permlab_batteryStats">"modificar estadísticas de la batería"</string>
+    <string name="permdesc_batteryStats">"Permite la modificación de estadísticas recopiladas sobre la batería. No está destinado al uso por parte de aplicaciones normales."</string>
+    <string name="permlab_internalSystemWindow">"mostrar ventanas no autorizadas"</string>
+    <string name="permdesc_internalSystemWindow">"Permite la creación de ventanas destinadas al uso por parte de la interfaz de usuario interna del sistema. No está destinado al uso por parte de aplicaciones normales."</string>
+    <string name="permlab_systemAlertWindow">"mostrar alertas de nivel del sistema"</string>
+    <string name="permdesc_systemAlertWindow">"Permite que una aplicación muestre ventanas de alerta del sistema. Las aplicaciones malintencionadas pueden controlar toda la pantalla del teléfono."</string>
+    <string name="permlab_setAnimationScale">"modificar velocidad de animación global"</string>
+    <string name="permdesc_setAnimationScale">"Permite que una aplicación cambie la velocidad de animación global (animaciones más rápidas o más lentas) en cualquier momento."</string>
+    <string name="permlab_manageAppTokens">"administrar tokens de aplicación"</string>
+    <string name="permdesc_manageAppTokens">"Permite que las aplicaciones creen y administren sus propios tokens, ignorando su orden z normal. Nunca debería ser necesario para las aplicaciones normales."</string>
+    <string name="permlab_injectEvents">"pulsar teclas y botones de control"</string>
+    <string name="permdesc_injectEvents">"Permite que la aplicación proporcione sus propios eventos de entrada (pulsación de teclas, etc.) a otras aplicaciones. Las aplicaciones malintencionadas pueden utilizar este permiso para controlar el teléfono."</string>
+    <string name="permlab_readInputState">"registrar lo que se escribe y las acciones que se realizan"</string>
+    <string name="permdesc_readInputState">"Permite que las aplicaciones observen las teclas que pulsas incluso cuando interactúas con otra aplicación (como, por ejemplo, al introducir una contraseña). No debería ser necesario nunca para las aplicaciones normales."</string>
+    <string name="permlab_bindInputMethod">"enlazar con un método de introducción de texto"</string>
+    <string name="permdesc_bindInputMethod">"Permite enlazar con la interfaz de nivel superior de un método de introducción de texto. No debe ser necesario para las aplicaciones normales."</string>
+    <string name="permlab_setOrientation">"cambiar orientación de la pantalla"</string>
+    <string name="permdesc_setOrientation">"Permite que una aplicación cambie la rotación de la pantalla en cualquier momento. No debería ser necesario nunca para las aplicaciones normales."</string>
+    <string name="permlab_signalPersistentProcesses">"enviar señales Linux a aplicaciones"</string>
+    <string name="permdesc_signalPersistentProcesses">"Permite que la aplicación solicite que la señal suministrada se envíe a todos los procesos persistentes."</string>
+    <string name="permlab_persistentActivity">"hacer que la aplicación se ejecute siempre"</string>
+    <string name="permdesc_persistentActivity">"Permite que una aplicación vuelva persistentes algunas de sus partes, de forma que el sistema no la pueda utilizar para otras aplicaciones."</string>
+    <string name="permlab_deletePackages">"eliminar aplicaciones"</string>
+    <string name="permdesc_deletePackages">"Permite que una aplicación elimine paquetes Android. Las aplicaciones malintencionadas pueden utilizar este permiso para eliminar aplicaciones importantes."</string>
+    <string name="permlab_clearAppUserData">"eliminar los datos de otras aplicaciones"</string>
+    <string name="permdesc_clearAppUserData">"Permite que una aplicación borre los datos de usuario."</string>
+    <string name="permlab_deleteCacheFiles">"eliminar las cachés de otras aplicaciones"</string>
+    <string name="permdesc_deleteCacheFiles">"Permite que una aplicación elimine archivos de caché."</string>
+    <string name="permlab_getPackageSize">"medir el espacio de almacenamiento de la aplicación"</string>
+    <string name="permdesc_getPackageSize">"Permite que la aplicación recupere su código, sus datos y los tamaños de caché."</string>
+    <string name="permlab_installPackages">"instalar aplicaciones directamente"</string>
+    <string name="permdesc_installPackages">"Permite que una aplicación instale paquetes Android nuevos o actualizados. Las aplicaciones malintencionadas pueden utilizar este permiso para añadir aplicaciones nuevas con permisos arbitrariamente potentes."</string>
+    <string name="permlab_clearAppCache">"eliminar todos los datos de caché de la aplicación"</string>
+    <string name="permdesc_clearAppCache">"Permite que una aplicación libere espacio de almacenamiento en el teléfono mediante la eliminación de archivos en el directorio de caché de la aplicación. El acceso al proceso del sistema suele estar muy restringido."</string>
+    <string name="permlab_readLogs">"leer archivos de registro del sistema"</string>
+    <string name="permdesc_readLogs">"Permite que una aplicación lea los distintos archivos de registro del sistema. Con este permiso, la aplicación puede ver información general sobre las acciones que realiza el usuario con el teléfono, pero los registros no deberían contener información personal o privada."</string>
+    <string name="permlab_diagnostic">"leer/escribir en los recursos propiedad del grupo de diagnóstico"</string>
+    <string name="permdesc_diagnostic">"Permite que una aplicación lea y escriba en cualquier recurso propiedad del grupo de diagnóstico como, por ejemplo, archivos in/dev. Este permiso podría afectar a la seguridad y estabilidad del sistema. SÓLO se debe utilizar para diagnósticos específicos de hardware realizados por el fabricante o el operador."</string>
+    <string name="permlab_changeComponentState">"habilitar o inhabilitar componentes de la aplicación"</string>
+    <string name="permdesc_changeComponentState">"Permite que una aplicación cambie si un componente de otra aplicación está habilitado o inhabilitado. Las aplicaciones malintencionadas pueden utilizar este permiso para inhabilitar funciones importantes del teléfono. El permiso se debe utilizar con precaución, ya que es posible que los componentes se vuelvan inutilizables, inconsistentes o inestables."</string>
+    <string name="permlab_setPreferredApplications">"establecer aplicaciones preferidas"</string>
+    <string name="permdesc_setPreferredApplications">"Permite que una aplicación modifique las aplicaciones preferidas del usuario. De esta forma, las aplicaciones malintencionadas pueden cambiar de forma silenciosa las aplicaciones que se están ejecutando, falsificando las aplicaciones existentes para recopilar datos privados del usuario."</string>
+    <string name="permlab_writeSettings">"modificar la configuración global del sistema"</string>
+    <string name="permdesc_writeSettings">"Permite que una aplicación modifique los datos de configuración del sistema. Las aplicaciones malintencionadas pueden dañar la configuración del sistema."</string>
+    <string name="permlab_writeSecureSettings">"modificar la configuración segura del sistema"</string>
+    <string name="permdesc_writeSecureSettings">"Permite que una aplicación modifique los datos de configuración segura del sistema. No está destinado al uso por parte de aplicaciones normales."</string>
+    <string name="permlab_writeGservices">"modificar la asignación de servicios de Google"</string>
+    <string name="permdesc_writeGservices">"Permite que una aplicación modifique la asignación de servicios de Google. No está destinado al uso por parte de aplicaciones normales."</string>
+    <string name="permlab_receiveBootCompleted">"ejecutar automáticamente al iniciar"</string>
+    <string name="permdesc_receiveBootCompleted">"Permite que una aplicación se ejecute automáticamente en cuanto se haya terminado de iniciar el sistema. Esto puede provocar que el teléfono tarde más en iniciarse y permite que la aplicación ralentice el funcionamiento global del teléfono al ejecutarse continuamente."</string>
+    <string name="permlab_broadcastSticky">"enviar emisión persistente"</string>
+    <string name="permdesc_broadcastSticky">"Permite que una aplicación envíe emisiones persistentes, que permanecen en el teléfono una vez que la emisión finaliza. Las aplicaciones malintencionadas pueden ralentizar el teléfono o volverlo inestable al hacer que emplee demasiada memoria."</string>
+    <string name="permlab_readContacts">"leer los datos de contacto"</string>
+    <string name="permdesc_readContacts">"Permite que una aplicación lea todos los datos de contacto (direcciones) almacenados en el teléfono. Las aplicaciones malintencionadas pueden utilizar este permiso para enviar tus datos a otras personas."</string>
+    <string name="permlab_writeContacts">"escribir datos de contacto"</string>
+    <string name="permdesc_writeContacts">"Permite que una aplicación modifique los datos de contacto (direcciones) almacenados en el teléfono. Las aplicaciones malintencionadas pueden utilizar este permiso para borrar o modificar tus datos de contacto."</string>
+    <string name="permlab_writeOwnerData">"escribir datos de propietario"</string>
+    <string name="permdesc_writeOwnerData">"Permite que una aplicación modifique los datos del propietario del teléfono almacenados en el teléfono. Las aplicaciones malintencionadas pueden utilizar este permiso para borrar o modificar los datos del propietario."</string>
+    <string name="permlab_readOwnerData">"leer datos del propietario"</string>
+    <string name="permdesc_readOwnerData">"Permite que una aplicación lea los datos del propietario del teléfono almacenados en el teléfono. Las aplicaciones malintencionadas pueden utilizar este permiso para leer los datos del propietario del teléfono."</string>
+    <string name="permlab_readCalendar">"leer datos de calendario"</string>
+    <string name="permdesc_readCalendar">"Permite que una aplicación lea todos los eventos de calendario almacenados en el teléfono. Las aplicaciones malintencionadas pueden utilizar este permiso para enviar tus eventos de calendario a otras personas."</string>
+    <string name="permlab_writeCalendar">"escribir datos de calendario"</string>
+    <string name="permdesc_writeCalendar">"Permite que una aplicación modifique los eventos de calendario almacenados en el teléfono. Las aplicaciones malintencionadas pueden utilizar este permiso para borrar o modificar tus datos de calendario."</string>
+    <string name="permlab_accessMockLocation">"simular fuentes de ubicación para prueba"</string>
+    <string name="permdesc_accessMockLocation">"Crear fuentes de origen simuladas para realizar pruebas. Las aplicaciones malintencionadas pueden utilizar este permiso para sobrescribir la ubicación o el estado devueltos por orígenes de ubicación reales, tales como los proveedores de red o GPS."</string>
+    <string name="permlab_accessLocationExtraCommands">"acceder a comandos de proveedor de ubicación adicional"</string>
+    <string name="permdesc_accessLocationExtraCommands">"Acceder a comandos de proveedor de ubicación adicional. Las aplicaciones malintencionadas podrían utilizar este permiso para interferir en el funcionamiento del sistema GPS o de otras fuentes de ubicación."</string>
+    <string name="permlab_accessFineLocation">"precisar la ubicación (GPS)"</string>
+    <string name="permdesc_accessFineLocation">"Permite precisar las fuentes de ubicación como, por ejemplo, el sistema de posicionamiento global, en el teléfono, en los casos en que estén disponibles. Las aplicaciones malintencionadas pueden utilizar este permiso para determinar dónde se encuentra en usuario y pueden consumir batería adicional."</string>
+    <string name="permlab_accessCoarseLocation">"ubicación común (basada en red)"</string>
+    <string name="permdesc_accessCoarseLocation">"Acceder a fuentes de ubicación comunes como, por ejemplo, la base de datos de red de un teléfono móvil, para determinar una ubicación telefónica aproximada, en los casos en que esté disponible. Las aplicaciones malintencionadas pueden utilizar este permiso para determinar dónde te encuentras aproximadamente."</string>
+    <string name="permlab_accessSurfaceFlinger">"acceder a SurfaceFlinger"</string>
+    <string name="permdesc_accessSurfaceFlinger">"Permite que la aplicación utilice funciones de SurfaceFlinger de nivel inferior."</string>
+    <string name="permlab_readFrameBuffer">"leer memoria de almacenamiento intermedio"</string>
+    <string name="permdesc_readFrameBuffer">"Permite que la aplicación que se va a utilizar lea el contenido de la memoria de almacenamiento intermedio."</string>
+    <string name="permlab_modifyAudioSettings">"cambiar la configuración de audio"</string>
+    <string name="permdesc_modifyAudioSettings">"Permite que la aplicación modifique la configuración de audio global como, por ejemplo, el volumen y la salida."</string>
+    <string name="permlab_recordAudio">"grabar sonido"</string>
+    <string name="permdesc_recordAudio">"Permite que la aplicación acceda a la ruta de grabación de audio."</string>
+    <string name="permlab_camera">"realizar fotografías"</string>
+    <string name="permdesc_camera">"Permite que la aplicación realice fotografías con la cámara. De esta forma, la aplicación puede recopilar en cualquier momento las imágenes que ve la cámara."</string>
+    <string name="permlab_brick">"inhabilitar el teléfono de forma permanente"</string>
+    <string name="permdesc_brick">"Permite que la aplicación inhabilite todas las funciones del teléfono de forma permanente. Este permiso es muy peligroso."</string>
+    <string name="permlab_reboot">"forzar reinicio del teléfono"</string>
+    <string name="permdesc_reboot">"Permite que la aplicación fuerce al teléfono a reiniciarse."</string>
+    <string name="permlab_mount_unmount_filesystems">"montar y desmontar sistemas de archivos"</string>
+    <string name="permdesc_mount_unmount_filesystems">"Permite que las aplicaciones monten y desmonten sistemas de archivos para un almacenamiento extraíble."</string>
+    <string name="permlab_vibrate">"controlar vibración"</string>
+    <string name="permdesc_vibrate">"Permite que la aplicación controle la función de vibración."</string>
+    <string name="permlab_flashlight">"controlar linterna"</string>
+    <string name="permdesc_flashlight">"Permite que la aplicación controle la función de linterna."</string>
+    <string name="permlab_hardware_test">"probar hardware"</string>
+    <string name="permdesc_hardware_test">"Permite que la aplicación controle distintos periféricos con fines de prueba del hardware."</string>
+    <string name="permlab_callPhone">"llamar directamente a números de teléfono"</string>
+    <string name="permdesc_callPhone">"Permite que la aplicación llame a números de teléfono sin la intervención del usuario. Las aplicaciones malintencionadas pueden originar llamadas inesperadas en la factura telefónica. Ten en cuenta que con este permiso la aplicación no puede realizar llamadas a números de emergencia."</string>
+    <string name="permlab_callPrivileged">"llamar directamente a cualquier número de teléfono"</string>
+    <string name="permdesc_callPrivileged">"Permite que la aplicación llame a cualquier número de teléfono, incluidos los números de emergencia, sin que el usuario intervenga. Las aplicaciones malintencionadas pueden realizar llamadas innecesarias e ilícitas a los servicios de emergencias."</string>
+    <string name="permlab_locationUpdates">"controlar las notificaciones de actualización de la ubicación"</string>
+    <string name="permdesc_locationUpdates">"Permite habilitar/inhabilitar las notificaciones de actualización de la ubicación de la radio. No está destinado al uso por parte de aplicaciones normales."</string>
+    <string name="permlab_checkinProperties">"acceder a propiedades de registro"</string>
+    <string name="permdesc_checkinProperties">"Permite el acceso de lectura/escritura a las propiedades cargadas por el servicio de registro. No está destinado al uso por parte de aplicaciones normales."</string>
+    <string name="permlab_modifyPhoneState">"modificar estado del teléfono"</string>
+    <string name="permdesc_modifyPhoneState">"Permite que la aplicación controle las funciones de teléfono del dispositivo. Una aplicación con este permiso puede cambiar redes, activar y desactivar la radio, etc., sin necesidad de notificar al usuario."</string>
+    <string name="permlab_readPhoneState">"leer el estado del teléfono"</string>
+    <string name="permdesc_readPhoneState">"Permite que la aplicación acceda a las funciones de teléfono del dispositivo. Una aplicación con este permiso puede determinar el número de teléfono de este teléfono, si una llamada está activa, el número al que está vinculado esa llamada, etc."</string>
+    <string name="permlab_wakeLock">"impedir que el teléfono entre en modo de suspensión"</string>
+    <string name="permdesc_wakeLock">"Permite que una aplicación impida que el teléfono entre en modo de suspensión."</string>
+    <string name="permlab_devicePower">"encender o apagar el teléfono"</string>
+    <string name="permdesc_devicePower">"Permite que la aplicación active o desactive el teléfono."</string>
+    <string name="permlab_factoryTest">"ejecutar en modo de prueba de fábrica"</string>
+    <string name="permdesc_factoryTest">"Ejecutar como prueba de fabricante de nivel inferior, permitiendo un acceso íntegro al hardware del teléfono. Sólo está disponible cuando un teléfono se está ejecutando en modo de prueba."</string>
+    <string name="permlab_setWallpaper">"establecer fondo de pantalla"</string>
+    <string name="permdesc_setWallpaper">"Permite que la aplicación establezca el fondo de pantalla del sistema."</string>
+    <string name="permlab_setWallpaperHints">"establecer el tamaño del fondo de pantalla"</string>
+    <string name="permdesc_setWallpaperHints">"Permite que la aplicación establezca el tamaño del fondo de pantalla del sistema."</string>
+    <string name="permlab_masterClear">"restablecer el sistema a los valores predeterminados de fábrica"</string>
+    <string name="permdesc_masterClear">"Permite que una aplicación restablezca por completo el sistema a su configuración de fábrica, borrando todos los datos, la configuración y las aplicaciones instaladas."</string>
+    <string name="permlab_setTimeZone">"establecer zona horaria"</string>
+    <string name="permdesc_setTimeZone">"Permite que una aplicación cambie la zona horaria del teléfono."</string>
+    <string name="permlab_getAccounts">"ver cuentas reconocidas"</string>
+    <string name="permdesc_getAccounts">"Permite que una aplicación obtenga una lista de cuentas reconocidas por el teléfono."</string>
+    <string name="permlab_accessNetworkState">"ver estado de la red"</string>
+    <string name="permdesc_accessNetworkState">"Permite que una aplicación vea el estado de todas las redes."</string>
+    <string name="permlab_createNetworkSockets">"acceso íntegro a Internet"</string>
+    <string name="permdesc_createNetworkSockets">"Permite que una aplicación cree sockets de red."</string>
+    <string name="permlab_writeApnSettings">"escribir la configuración de nombre de punto de acceso"</string>
+    <string name="permdesc_writeApnSettings">"Permite que una aplicación modifique los valores de configuración de un APN como, por ejemplo, el proxy y el puerto de cualquier APN."</string>
+    <string name="permlab_changeNetworkState">"cambiar la conectividad de red"</string>
+    <string name="permdesc_changeNetworkState">"Permite que una aplicación cambie la conectividad de red de estado."</string>
+    <string name="permlab_accessWifiState">"ver estado de la conectividad Wi-Fi"</string>
+    <string name="permdesc_accessWifiState">"Permite que una aplicación vea la información sobre el estado de la conectividad Wi-Fi."</string>
+    <string name="permlab_changeWifiState">"cambiar estado de Wi-Fi"</string>
+    <string name="permdesc_changeWifiState">"Permite que una aplicación se conecte a puntos de acceso Wi-Fi y se desconecte de ellos, y realice modificaciones en las redes Wi-Fi configuradas."</string>
+    <string name="permlab_bluetoothAdmin">"administración de Bluetooth"</string>
+    <string name="permdesc_bluetoothAdmin">"Permite que una aplicación configure el teléfono Bluetooth local, y vea dispositivos remotos y sincronice el teléfono con ellos."</string>
+    <string name="permlab_bluetooth">"crear conexiones de Bluetooth"</string>
+    <string name="permdesc_bluetooth">"Permite que una aplicación vea la configuración del teléfono Bluetooth local, y cree y acepte conexiones con los dispositivos sincronizados."</string>
+    <string name="permlab_disableKeyguard">"inhabilitar bloqueo del teclado"</string>
+    <string name="permdesc_disableKeyguard">"Permite que una aplicación inhabilite el bloqueo del teclado y cualquier protección con contraseña asociada. Un ejemplo legítimo de este permiso es la inhabilitación por parte del teléfono del bloqueo del teclado cuando recibe una llamada telefónica entrante y su posterior habilitación cuando finaliza la llamada."</string>
+    <string name="permlab_readSyncSettings">"leer la configuración de sincronización"</string>
+    <string name="permdesc_readSyncSettings">"Permite que una aplicación lea la configuración de sincronización como, por ejemplo, si la sincronización está habilitada para el menú \"Contactos\"."</string>
+    <string name="permlab_writeSyncSettings">"escribir configuración de sincronización"</string>
+    <string name="permdesc_writeSyncSettings">"Permite que una aplicación modifique la configuración de sincronización como, por ejemplo, si la sincronización está habilitada para el menú \"Contactos\"."</string>
+    <string name="permlab_readSyncStats">"leer estadísticas de sincronización"</string>
+    <string name="permdesc_readSyncStats">"Permite que una aplicación lea las estadísticas de sincronización como, por ejemplo, el historial de sincronizaciones que se han realizado."</string>
+    <string name="permlab_subscribedFeedsRead">"leer feeds a los que está suscrito el usuario"</string>
+    <string name="permdesc_subscribedFeedsRead">"Permite que una aplicación obtenga detalles sobre los feeds sincronizados en este momento."</string>
+    <string name="permlab_subscribedFeedsWrite">"escribir feeds a los que está suscrito el usuario"</string>
+    <string name="permdesc_subscribedFeedsWrite">"Permite que una aplicación modifique los feeds sincronizados actualmente. Este permiso podría provocar que una aplicación malintencionada cambie los feeds sincronizados."</string>
+  <string-array name="phoneTypes">
+    <item>"Casa"</item>
+    <item>"Móvil"</item>
+    <item>"Trabajo"</item>
+    <item>"Fax del trabajo"</item>
+    <item>"Fax de casa"</item>
+    <item>"Buscapersonas"</item>
+    <item>"Otro"</item>
+    <item>"Personalizar"</item>
+  </string-array>
+  <string-array name="emailAddressTypes">
+    <item>"Casa"</item>
+    <item>"Trabajo"</item>
+    <item>"Otra"</item>
+    <item>"Personalizar"</item>
+  </string-array>
+  <string-array name="postalAddressTypes">
+    <item>"Casa"</item>
+    <item>"Trabajo"</item>
+    <item>"Otra"</item>
+    <item>"Personalizar"</item>
+  </string-array>
+  <string-array name="imAddressTypes">
+    <item>"Casa"</item>
+    <item>"Trabajo"</item>
+    <item>"Otro"</item>
+    <item>"Personalizar"</item>
+  </string-array>
+  <string-array name="organizationTypes">
+    <item>"Trabajo"</item>
+    <item>"Otra"</item>
+    <item>"Personalizar"</item>
+  </string-array>
+  <string-array name="imProtocols">
+    <item>"AIM"</item>
+    <item>"Windows Live"</item>
+    <item>"Yahoo!"</item>
+    <item>"Skype"</item>
+    <item>"QQ"</item>
+    <item>"Google Talk"</item>
+    <item>"ICQ"</item>
+    <item>"Jabber"</item>
+  </string-array>
+    <string name="keyguard_password_enter_pin_code">"Introduce el código PIN"</string>
+    <string name="keyguard_password_wrong_pin_code">"El código PIN es incorrecto."</string>
+    <string name="keyguard_label_text">"Para desbloquear el teléfono, pulsa \"Menú\" y, a continuación, pulsa 0."</string>
+    <string name="emergency_call_dialog_number_for_display">"Número de emergencia"</string>
+    <string name="lockscreen_carrier_default">"(Sin servicio)"</string>
+    <string name="lockscreen_screen_locked">"Pantalla bloqueada."</string>
+    <string name="lockscreen_instructions_when_pattern_enabled">"Pulsa \"Menú\" para desbloquear el teléfono o realizar una llamada de emergencia."</string>
+    <string name="lockscreen_instructions_when_pattern_disabled">"Pulsa \"Menú\" para desbloquear el teléfono."</string>
+    <string name="lockscreen_pattern_instructions">"Crear patrón para desbloquear"</string>
+    <string name="lockscreen_emergency_call">"Llamada de emergencia"</string>
+    <string name="lockscreen_pattern_correct">"Correcto"</string>
+    <string name="lockscreen_pattern_wrong">"Inténtalo de nuevo"</string>
+    <string name="lockscreen_plugged_in">"Cargando (<xliff:g id="NUMBER">%d%%</xliff:g>)..."</string>
+    <string name="lockscreen_low_battery">"Conecta el cargador"</string>
+    <string name="lockscreen_missing_sim_message_short">"No hay ninguna tarjeta SIM."</string>
+    <string name="lockscreen_missing_sim_message">"No se ha insertado ninguna tarjeta SIM en el teléfono."</string>
+    <string name="lockscreen_missing_sim_instructions">"Inserta una tarjeta SIM."</string>
+    <string name="lockscreen_network_locked_message">"Bloqueada para la red"</string>
+    <string name="lockscreen_sim_puk_locked_message">"La tarjeta SIM está bloqueada con el código PUK."</string>
+    <string name="lockscreen_sim_puk_locked_instructions">"Ponte en contacto con el servicio de atención al cliente."</string>
+    <string name="lockscreen_sim_locked_message">"La tarjeta SIM está bloqueada."</string>
+    <string name="lockscreen_sim_unlock_progress_dialog_message">"Desbloqueando tarjeta SIM..."</string>
+    <string name="lockscreen_too_many_failed_attempts_dialog_message">"Has realizado <xliff:g id="NUMBER_0">%d</xliff:g> intentos fallidos de creación de un patrón de desbloqueo. "\n\n"Inténtalo de nuevo dentro de <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin">"Has realizado <xliff:g id="NUMBER_0">%d</xliff:g> intentos fallidos de creación del patrón de desbloqueo. Si realizas <xliff:g id="NUMBER_1">%d</xliff:g> intentos fallidos más, se te pedirá que desbloquees el teléfono con tus credenciales de acceso de Google."\n\n" Espera <xliff:g id="NUMBER_2">%d</xliff:g> segundos e inténtalo de nuevo."</string>
+    <string name="lockscreen_too_many_failed_attempts_countdown">"Espera <xliff:g id="NUMBER">%d</xliff:g> segundos y vuelve a intentarlo."</string>
+    <string name="lockscreen_forgot_pattern_button_text">"¿Has olvidado el patrón?"</string>
+    <string name="lockscreen_glogin_too_many_attempts">"Se han realizado demasiados intentos incorrectos de creación del patrón."</string>
+    <string name="lockscreen_glogin_instructions">"Para desbloquear el teléfono,"\n"accede a tu cuenta de Google"</string>
+    <string name="lockscreen_glogin_username_hint">"Nombre de usuario (correo electrónico)"</string>
+    <string name="lockscreen_glogin_password_hint">"Contraseña"</string>
+    <string name="lockscreen_glogin_submit_button">"Acceder"</string>
+    <string name="lockscreen_glogin_invalid_input">"Nombre de usuario o contraseña no válido"</string>
+    <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
+    <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+    <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+    <!-- no translation found for hour_ampm (7618670480400517084) -->
+    <skip />
+    <!-- no translation found for hour_cap_ampm (5117798389811605468) -->
+    <skip />
+    <string name="status_bar_clear_all_button">"Cerrar notificaciones"</string>
+    <string name="status_bar_no_notifications_title">"Ninguna notificación"</string>
+    <string name="status_bar_ongoing_events_title">"Entrante"</string>
+    <string name="status_bar_latest_events_title">"Notificaciones"</string>
+    <!-- no translation found for battery_status_text_percent_format (8818848472818880005) -->
+    <skip />
+    <string name="battery_status_charging">"Cargando..."</string>
+    <string name="battery_low_title">"Conecta el cargador"</string>
+    <string name="battery_low_subtitle">"Se está agotando la batería:"</string>
+    <string name="battery_low_percent_format">"menos de <xliff:g id="NUMBER">%d%%</xliff:g> disponible."</string>
+    <string name="factorytest_failed">"Fallo en la prueba de fábrica"</string>
+    <string name="factorytest_not_system">"La acción FACTORY_TEST sólo es compatible con los paquetes instalados en /system/app."</string>
+    <string name="factorytest_no_action">"No se ha encontrado ningún paquete que proporcione la acción FACTORY_TEST."</string>
+    <string name="factorytest_reboot">"Reiniciar"</string>
+    <string name="save_password_label">"Confirmar"</string>
+    <string name="save_password_message">"¿Deseas que el navegador recuerde esta contraseña?"</string>
+    <string name="save_password_notnow">"Ahora no"</string>
+    <string name="save_password_remember">"Recordar"</string>
+    <string name="save_password_never">"Nunca"</string>
+    <string name="open_permission_deny">"No dispones de permiso para abrir esta página."</string>
+    <string name="text_copied">"Texto copiado al portapapeles."</string>
+    <string name="more_item_label">"Más"</string>
+    <string name="prepend_shortcut_label">"\"Menú\"+"</string>
+    <string name="menu_space_shortcut_label">"espacio"</string>
+    <string name="menu_enter_shortcut_label">"intro"</string>
+    <string name="menu_delete_shortcut_label">"suprimir"</string>
+    <string name="search_go">"Buscar"</string>
+    <string name="today">"Hoy"</string>
+    <string name="yesterday">"Ayer"</string>
+    <string name="tomorrow">"Mañana"</string>
+    <string name="oneMonthDurationPast">"Hace un mes"</string>
+    <string name="beforeOneMonthDurationPast">"Hace más de un mes"</string>
+  <plurals name="num_seconds_ago">
+    <item quantity="one">"Hace 1 segundo"</item>
+    <item quantity="other">"Hace <xliff:g id="COUNT">%d</xliff:g> segundos"</item>
+  </plurals>
+  <plurals name="num_minutes_ago">
+    <item quantity="one">"Hace 1 minuto"</item>
+    <item quantity="other">"Hace <xliff:g id="COUNT">%d</xliff:g> minutos"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one">"Hace 1 hora"</item>
+    <item quantity="other">"Hace <xliff:g id="COUNT">%d</xliff:g> horas"</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one">"ayer"</item>
+    <item quantity="other">"Hace <xliff:g id="COUNT">%d</xliff:g> días"</item>
+  </plurals>
+  <plurals name="in_num_seconds">
+    <item quantity="one">"dentro de 1 segundo"</item>
+    <item quantity="other">"dentro de <xliff:g id="COUNT">%d</xliff:g> segundos"</item>
+  </plurals>
+  <plurals name="in_num_minutes">
+    <item quantity="one">"dentro de 1 minuto"</item>
+    <item quantity="other">"dentro de <xliff:g id="COUNT">%d</xliff:g> minutos"</item>
+  </plurals>
+  <plurals name="in_num_hours">
+    <item quantity="one">"dentro de 1 hora"</item>
+    <item quantity="other">"dentro de <xliff:g id="COUNT">%d</xliff:g>  horas"</item>
+  </plurals>
+  <plurals name="in_num_days">
+    <item quantity="one">"mañana"</item>
+    <item quantity="other">"dentro de <xliff:g id="COUNT">%d</xliff:g> días"</item>
+  </plurals>
+    <!-- no translation found for abbrev_num_seconds_ago:one (1849036840200069118) -->
+    <!-- no translation found for abbrev_num_seconds_ago:other (3699169366650930415) -->
+    <!-- no translation found for abbrev_num_minutes_ago:one (6361490147113871545) -->
+    <!-- no translation found for abbrev_num_minutes_ago:other (851164968597150710) -->
+    <!-- no translation found for abbrev_num_hours_ago:one (4796212039724722116) -->
+    <!-- no translation found for abbrev_num_hours_ago:other (6889970745748538901) -->
+    <!-- no translation found for abbrev_num_days_ago:one (8463161711492680309) -->
+    <!-- no translation found for abbrev_num_days_ago:other (3453342639616481191) -->
+    <!-- no translation found for abbrev_in_num_seconds:one (5842225370795066299) -->
+    <!-- no translation found for abbrev_in_num_seconds:other (5495880108825805108) -->
+    <!-- no translation found for abbrev_in_num_minutes:one (562786149928284878) -->
+    <!-- no translation found for abbrev_in_num_minutes:other (4216113292706568726) -->
+    <!-- no translation found for abbrev_in_num_hours:one (3274708118124045246) -->
+    <!-- no translation found for abbrev_in_num_hours:other (3705373766798013406) -->
+    <!-- no translation found for abbrev_in_num_days:one (2178576254385739855) -->
+    <!-- no translation found for abbrev_in_num_days:other (2973062968038355991) -->
+    <string name="preposition_for_date">"el %s"</string>
+    <string name="preposition_for_time">"a las %s"</string>
+    <string name="preposition_for_year">"en %s"</string>
+    <string name="day">"día"</string>
+    <string name="days">"días"</string>
+    <string name="hour">"hora"</string>
+    <string name="hours">"horas"</string>
+    <string name="minute">"min"</string>
+    <string name="minutes">"minutos"</string>
+    <string name="second">"segundos"</string>
+    <string name="seconds">"segundos"</string>
+    <string name="week">"semana"</string>
+    <string name="weeks">"semanas"</string>
+    <string name="year">"año"</string>
+    <string name="years">"años"</string>
+    <string name="sunday">"Domingo"</string>
+    <string name="monday">"Lunes"</string>
+    <string name="tuesday">"Martes"</string>
+    <string name="wednesday">"Miércoles"</string>
+    <string name="thursday">"Jueves"</string>
+    <string name="friday">"Viernes"</string>
+    <string name="saturday">"Sábado"</string>
+    <string name="every_weekday">"Todos los días laborables (Lun-Vie)"</string>
+    <string name="daily">"Diariamente"</string>
+    <string name="weekly">"Semanalmente, el <xliff:g id="DAY">%s</xliff:g>"</string>
+    <string name="monthly">"Mensualmente"</string>
+    <string name="yearly">"Anualmente"</string>
+    <string name="VideoView_error_title">"No se puede reproducir el vídeo."</string>
+    <string name="VideoView_error_text_unknown">"Este vídeo no se puede reproducir."</string>
+    <string name="VideoView_error_button">"Aceptar"</string>
+    <string name="am">"a.m."</string>
+    <string name="pm">"p.m."</string>
+    <string name="numeric_date">"<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
+    <string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string>
+    <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
+    <string name="date1_date2">"<xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>"</string>
+    <string name="time1_time2">"<xliff:g id="TIME1">%1$s</xliff:g> – <xliff:g id="TIME2">%2$s</xliff:g>"</string>
+    <string name="time_wday_date">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>, <xliff:g id="DATE">%3$s</xliff:g>"</string>
+    <string name="wday_date">"<xliff:g id="WEEKDAY">%2$s</xliff:g>, <xliff:g id="DATE">%3$s</xliff:g>"</string>
+    <string name="time_date">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="DATE">%3$s</xliff:g>"</string>
+    <!-- no translation found for date_time (6104442718633642836) -->
+    <skip />
+    <!-- no translation found for relative_time (1818557177829411417) -->
+    <skip />
+    <string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string>
+    <string name="full_date_month_first">"<xliff:g id="DAY">dd</xliff:g> de <xliff:g id="MONTH">MMMM</xliff:g> de <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="full_date_day_first">"<xliff:g id="MONTH">MMMM</xliff:g> de <xliff:g id="DAY">dd</xliff:g> de <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="medium_date_month_first">"<xliff:g id="DAY">dd</xliff:g> de <xliff:g id="MONTH">MMM</xliff:g> de <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="medium_date_day_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMM</xliff:g>, <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="twelve_hour_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">a</xliff:g>"</string>
+    <string name="twenty_four_hour_time_format">"<xliff:g id="HOUR">H</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g>"</string>
+    <string name="noon">"mediodía"</string>
+    <string name="Noon">"Mediodía"</string>
+    <string name="midnight">"medianoche"</string>
+    <string name="Midnight">"Medianoche"</string>
+    <!-- no translation found for month_day (5565829181417740906) -->
+    <skip />
+    <!-- no translation found for month (7026169712234774086) -->
+    <skip />
+    <string name="month_day_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <!-- no translation found for month_year (9219019380312413367) -->
+    <skip />
+    <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
+    <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <string name="same_year_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>"</string>
+    <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>"</string>
+    <string name="same_year_mdy1_mdy2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR">%9$s</xliff:g>"</string>
+    <string name="same_year_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="YEAR">%9$s</xliff:g>"</string>
+    <string name="same_year_md1_time1_md2_time2">"<xliff:g id="DAY1">%3$s</xliff:g> de <xliff:g id="MONTH1">%2$s</xliff:g> de <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> de <xliff:g id="MONTH2">%7$s</xliff:g> de <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_year_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_year_mdy1_time1_mdy2_time2">"<xliff:g id="DAY1">%3$s</xliff:g> de <xliff:g id="MONTH1">%2$s</xliff:g> de <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> –  <xliff:g id="DAY2">%8$s</xliff:g> de <xliff:g id="MONTH2">%7$s</xliff:g> de <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>"</string>
+    <string name="numeric_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>"</string>
+    <string name="numeric_mdy1_mdy2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="numeric_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="numeric_md1_time1_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>"</string>
+    <string name="same_month_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>"</string>
+    <string name="same_month_mdy1_mdy2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="same_month_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> de <xliff:g id="MONTH1">%2$s</xliff:g> de <xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> de <xliff:g id="MONTH2">%7$s</xliff:g> de <xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="same_month_md1_time1_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g> de <xliff:g id="MONTH">%b</xliff:g> de <xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <!-- no translation found for abbrev_month_year (3856424847226891943) -->
+    <skip />
+    <!-- no translation found for abbrev_month_day (5028815883653985933) -->
+    <skip />
+    <!-- no translation found for abbrev_month (3131032032850777433) -->
+    <skip />
+    <string name="day_of_week_long_sunday">"Domingo"</string>
+    <string name="day_of_week_long_monday">"Lunes"</string>
+    <string name="day_of_week_long_tuesday">"Martes"</string>
+    <string name="day_of_week_long_wednesday">"Miércoles"</string>
+    <string name="day_of_week_long_thursday">"Jueves"</string>
+    <string name="day_of_week_long_friday">"Viernes"</string>
+    <string name="day_of_week_long_saturday">"Sábado"</string>
+    <string name="day_of_week_medium_sunday">"Dom"</string>
+    <string name="day_of_week_medium_monday">"Lun"</string>
+    <string name="day_of_week_medium_tuesday">"Mar"</string>
+    <string name="day_of_week_medium_wednesday">"Mié"</string>
+    <string name="day_of_week_medium_thursday">"Jue"</string>
+    <string name="day_of_week_medium_friday">"Vie"</string>
+    <string name="day_of_week_medium_saturday">"Sáb"</string>
+    <string name="day_of_week_short_sunday">"Do"</string>
+    <string name="day_of_week_short_monday">"Lu"</string>
+    <string name="day_of_week_short_tuesday">"Ma"</string>
+    <string name="day_of_week_short_wednesday">"Mi"</string>
+    <string name="day_of_week_short_thursday">"Ju"</string>
+    <string name="day_of_week_short_friday">"Vi"</string>
+    <string name="day_of_week_short_saturday">"Sá"</string>
+    <string name="day_of_week_shorter_sunday">"Do"</string>
+    <string name="day_of_week_shorter_monday">"L"</string>
+    <string name="day_of_week_shorter_tuesday">"Ma"</string>
+    <string name="day_of_week_shorter_wednesday">"Mi"</string>
+    <string name="day_of_week_shorter_thursday">"Ju"</string>
+    <string name="day_of_week_shorter_friday">"V"</string>
+    <string name="day_of_week_shorter_saturday">"S"</string>
+    <string name="day_of_week_shortest_sunday">"D"</string>
+    <string name="day_of_week_shortest_monday">"Mz"</string>
+    <string name="day_of_week_shortest_tuesday">"M"</string>
+    <string name="day_of_week_shortest_wednesday">"Mi"</string>
+    <string name="day_of_week_shortest_thursday">"M"</string>
+    <string name="day_of_week_shortest_friday">"V"</string>
+    <string name="day_of_week_shortest_saturday">"D"</string>
+    <string name="month_long_january">"Enero"</string>
+    <string name="month_long_february">"Febrero"</string>
+    <string name="month_long_march">"Marzo"</string>
+    <string name="month_long_april">"Abril"</string>
+    <string name="month_long_may">"Mayo"</string>
+    <string name="month_long_june">"Junio"</string>
+    <string name="month_long_july">"Julio"</string>
+    <string name="month_long_august">"Agosto"</string>
+    <string name="month_long_september">"Septiembre"</string>
+    <string name="month_long_october">"Octubre"</string>
+    <string name="month_long_november">"Noviembre"</string>
+    <string name="month_long_december">"Diciembre"</string>
+    <string name="month_medium_january">"Ene"</string>
+    <string name="month_medium_february">"Feb"</string>
+    <string name="month_medium_march">"Mar"</string>
+    <string name="month_medium_april">"Abr"</string>
+    <string name="month_medium_may">"May"</string>
+    <string name="month_medium_june">"Jun"</string>
+    <string name="month_medium_july">"Jul"</string>
+    <string name="month_medium_august">"Ago"</string>
+    <string name="month_medium_september">"Sep"</string>
+    <string name="month_medium_october">"Oct"</string>
+    <string name="month_medium_november">"Nov"</string>
+    <string name="month_medium_december">"Dic"</string>
+    <string name="month_shortest_january">"E"</string>
+    <string name="month_shortest_february">"V"</string>
+    <string name="month_shortest_march">"Mz"</string>
+    <string name="month_shortest_april">"A"</string>
+    <string name="month_shortest_may">"My"</string>
+    <string name="month_shortest_june">"J"</string>
+    <string name="month_shortest_july">"E"</string>
+    <string name="month_shortest_august">"Ag"</string>
+    <string name="month_shortest_september">"S"</string>
+    <string name="month_shortest_october">"O"</string>
+    <string name="month_shortest_november">"N"</string>
+    <string name="month_shortest_december">"D"</string>
+    <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+    <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
+    <string name="selectAll">"Seleccionar todo"</string>
+    <string name="selectText">"Seleccionar texto"</string>
+    <string name="stopSelectingText">"Detener selección de texto"</string>
+    <string name="cut">"Cortar"</string>
+    <string name="cutAll">"Cortar todo"</string>
+    <string name="copy">"Copiar"</string>
+    <string name="copyAll">"Copiar todo"</string>
+    <string name="paste">"Pegar"</string>
+    <string name="copyUrl">"Copiar URL"</string>
+    <string name="inputMethod">"Método de introducción de texto"</string>
+    <string name="editTextMenuTitle">"Editar texto"</string>
+    <string name="low_internal_storage_view_title">"Poco espacio"</string>
+    <string name="low_internal_storage_view_text">"Se está agotando el espacio de almacenamiento del teléfono."</string>
+    <string name="ok">"Aceptar"</string>
+    <string name="cancel">"Cancelar"</string>
+    <string name="yes">"Aceptar"</string>
+    <string name="no">"Cancelar"</string>
+    <string name="capital_on">"Activado"</string>
+    <string name="capital_off">"Desconectado"</string>
+    <string name="whichApplication">"Completar acción utilizando"</string>
+    <string name="alwaysUse">"Utilizar de forma predeterminada para esta acción"</string>
+    <string name="clearDefaultHintMsg">"Borrar valores predeterminados en \"Página principal &gt; menú de configuración &gt; Aplicaciones &gt; Administrar aplicaciones\"."</string>
+    <string name="chooseActivity">"Seleccionar una acción"</string>
+    <string name="noApplications">"Ninguna aplicación puede realizar esta acción."</string>
+    <string name="aerr_title">"Lo sentimos."</string>
+    <string name="aerr_application">"La aplicación <xliff:g id="APPLICATION">%1$s</xliff:g> (proceso <xliff:g id="PROCESS">%2$s</xliff:g>) se ha interrumpido inesperadamente. Inténtalo de nuevo."</string>
+    <string name="aerr_process">"El proceso <xliff:g id="PROCESS">%1$s</xliff:g> se ha interrumpido inesperadamente. Inténtalo de nuevo."</string>
+    <string name="anr_title">"Lo sentimos."</string>
+    <string name="anr_activity_application">"La actividad <xliff:g id="ACTIVITY">%1$s</xliff:g> (<xliff:g id="APPLICATION">%2$s</xliff:g> en aplicación) no está respondiendo."</string>
+    <string name="anr_activity_process">"La actividad <xliff:g id="ACTIVITY">%1$s</xliff:g> (<xliff:g id="PROCESS">%2$s</xliff:g> en curso) no está respondiendo."</string>
+    <string name="anr_application_process">"La aplicación <xliff:g id="APPLICATION">%1$s</xliff:g> (<xliff:g id="PROCESS">%2$s</xliff:g> en curso) no está respondiendo."</string>
+    <string name="anr_process">"El proceso <xliff:g id="PROCESS">%1$s</xliff:g> no está respondiendo."</string>
+    <string name="force_close">"Forzar cierre"</string>
+    <string name="wait">"Esperar"</string>
+    <string name="debug">"Depurar"</string>
+    <string name="sendText">"Seleccionar una acción para el texto"</string>
+    <string name="volume_ringtone">"Volumen del timbre"</string>
+    <string name="volume_music">"Volumen multimedia"</string>
+    <string name="volume_music_hint_playing_through_bluetooth">"Reproduciendo a través de Bluetooth"</string>
+    <string name="volume_call">"Volumen de la llamada"</string>
+    <string name="volume_call_hint_playing_through_bluetooth">"Reproduciendo a través de Bluetooth"</string>
+    <string name="volume_alarm">"Volumen de alarma"</string>
+    <string name="volume_notification">"Volumen de notificaciones"</string>
+    <string name="volume_unknown">"Volumen"</string>
+    <string name="ringtone_default">"Tono predeterminado"</string>
+    <string name="ringtone_default_with_actual">"Tono predeterminado (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+    <string name="ringtone_silent">"Silencio"</string>
+    <string name="ringtone_picker_title">"Tonos"</string>
+    <string name="ringtone_unknown">"Tono desconocido"</string>
+  <plurals name="wifi_available">
+    <item quantity="one">"Red Wi-Fi disponible"</item>
+    <item quantity="other">"Redes Wi-Fi disponibles"</item>
+  </plurals>
+  <plurals name="wifi_available_detailed">
+    <item quantity="one">"Red Wi-Fi abierta disponible"</item>
+    <item quantity="other">"Redes Wi-Fi abiertas disponibles"</item>
+  </plurals>
+    <string name="select_character">"Insertar carácter"</string>
+    <string name="sms_control_default_app_name">"Aplicación desconocida"</string>
+    <string name="sms_control_title">"Enviando mensajes SMS..."</string>
+    <string name="sms_control_message">"Se ha enviado un número elevado de mensajes SMS. Selecciona \"Aceptar\" para continuar o \"Cancelar\" para interrumpir el envío."</string>
+    <string name="sms_control_yes">"Aceptar"</string>
+    <string name="sms_control_no">"Cancelar"</string>
+    <string name="date_time_set">"Establecer"</string>
+    <string name="default_permission_group">"Predeterminado"</string>
+    <string name="no_permissions">"No es necesario ningún permiso"</string>
+    <string name="perms_hide"><b>"Ocultar"</b></string>
+    <string name="perms_show_all"><b>"Mostrar todos"</b></string>
+    <string name="googlewebcontenthelper_loading">"Cargando..."</string>
+    <string name="usb_storage_title">"Conectado por USB"</string>
+    <string name="usb_storage_message">"Has conectado el teléfono al equipo mediante USB. Selecciona \"Montar\" si deseas copiar archivos entre el equipo y la tarjeta SD del teléfono."</string>
+    <string name="usb_storage_button_mount">"Montar"</string>
+    <string name="usb_storage_button_unmount">"No montar"</string>
+    <string name="usb_storage_error_message">"Se ha producido un problema al intentar utilizar la tarjeta SD para el almacenamiento USB."</string>
+    <string name="usb_storage_notification_title">"Conectado por USB"</string>
+    <string name="usb_storage_notification_message">"Seleccionar para copiar archivos al/desde el equipo"</string>
+    <string name="select_input_method">"Seleccionar método de introducción de texto"</string>
+    <string name="fast_scroll_alphabet">"ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="fast_scroll_numeric_alphabet">"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="candidates_style"><font fgcolor="#ff000000" bgcolor="#ff8080ff"><u>"candidatos"</u>"u&gt;"</font></string>
+</resources>
index 4f21761..600bc2c 100644 (file)
@@ -15,7 +15,7 @@
     <string name="defaultMsisdnAlphaTag">"MSISDN1"</string>
     <string name="mmiError">"Problème de connexion ou code MMI non valide."</string>
     <string name="serviceEnabled">"Le service a été activé."</string>
-    <string name="serviceEnabledFor">"Ce service a été activé pour :"</string>
+    <string name="serviceEnabledFor">"Ce service a été activé pour :"</string>
     <string name="serviceDisabled">"Ce service a été désactivé."</string>
     <string name="serviceRegistered">"Enregistrement réussi."</string>
     <string name="serviceErased">"Effacement réussi."</string>
     <string name="badPuk">"Le code PUK saisi est incorrect."</string>
     <string name="mismatchPin">"Les codes PIN saisis ne correspondent pas."</string>
     <string name="invalidPin">"Saisissez un code PIN comptant 4 à 8 chiffres."</string>
-    <!-- no translation found for needPuk (919668385956251611) -->
-    <skip />
+    <string name="needPuk">"Votre carte SIM est verrouillée par code PUK. Saisissez le code PUK pour la déverrouiller."</string>
     <string name="needPuk2">"Saisissez le code PUK2 pour débloquer la carte SIM."</string>
-    <string name="ClipMmi">"Identifiant des appels entrants"</string>
-    <string name="ClirMmi">"Identifiant des appels sortants"</string>
+    <string name="ClipMmi">"Identifiant d\'appelant entrant"</string>
+    <string name="ClirMmi">"Identifiant d\'appelant sortant"</string>
     <string name="CfMmi">"Transfert d\'appel"</string>
     <string name="CwMmi">"Appel en attente"</string>
     <string name="BaMmi">"Interdiction d\'appel"</string>
     <string name="PwdMmi">"Modification du mot de passe"</string>
     <string name="PinMmi">"Modification du code PIN"</string>
-    <string name="CLIRDefaultOnNextCallOn">"Par défaut, les identifiants d\'appel sont restreints. Appel suivant : restreint"</string>
-    <string name="CLIRDefaultOnNextCallOff">"Par défaut, les identifiants d\'appel sont restreints. Appel suivant : non restreint"</string>
-    <string name="CLIRDefaultOffNextCallOn">"Par défaut, les identifiants d\'appel ne sont pas restreints. Appel suivant : restreint"</string>
-    <string name="CLIRDefaultOffNextCallOff">"Par défaut, les identifiants d\'appel ne sont pas restreints. Appel suivant : non restreint"</string>
+    <string name="CLIRDefaultOnNextCallOn">"Par défaut, les identifiants d\'appelant sont restreints. Appel suivant : restreint"</string>
+    <string name="CLIRDefaultOnNextCallOff">"Par défaut, les identifiants d\'appelant sont restreints. Appel suivant : non restreint"</string>
+    <string name="CLIRDefaultOffNextCallOn">"Par défaut, les identifiants d\'appelant ne sont pas restreints. Appel suivant : restreint"</string>
+    <string name="CLIRDefaultOffNextCallOff">"Par défaut, les identifiants d\'appelant ne sont pas restreints. Appel suivant : non restreint"</string>
     <string name="serviceNotProvisioned">"Ce service n\'est pas pris en charge."</string>
-    <string name="CLIRPermanent">"Le paramètre Identifiant d\'appel ne peut pas être modifié."</string>
+    <string name="CLIRPermanent">"Le paramètre Identifiant d\'appelant ne peut pas être modifié."</string>
     <string name="serviceClassVoice">"Voix"</string>
     <string name="serviceClassData">"Données"</string>
     <string name="serviceClassFAX">"Télécopie"</string>
     <string name="serviceClassSMS">"SMS"</string>
     <string name="serviceClassDataAsync">"Asynchronisées"</string>
-    <string name="serviceClassDataSync">"Synchronisées"</string>
+    <string name="serviceClassDataSync">"Synchroniser"</string>
     <string name="serviceClassPacket">"Paquet"</string>
     <string name="serviceClassPAD">"PAD"</string>
-    <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : non transféré"</string>
-    <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
-    <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : <xliff:g id="DIALING_NUMBER">{1}</xliff:g> au bout de <xliff:g id="TIME_DELAY">{2}</xliff:g> secondes"</string>
-    <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : non transféré"</string>
-    <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : non transféré"</string>
+    <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : non transféré"</string>
+    <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+    <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : <xliff:g id="DIALING_NUMBER">{1}</xliff:g> au bout de <xliff:g id="TIME_DELAY">{2}</xliff:g> secondes"</string>
+    <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : non transféré"</string>
+    <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : non transféré"</string>
     <string name="httpErrorOk">"OK"</string>
-    <string name="httpError">"La page Internet contient une erreur."</string>
-    <string name="httpErrorLookup">"L\'URL n\'a pas pu être trouvée."</string>
-    <string name="httpErrorUnsupportedAuthScheme">"Le processus d\'authentification du site n\'est pas pris en charge."</string>
+    <string name="httpError">"La page Web contient une erreur."</string>
+    <string name="httpErrorLookup">"URL introuvable."</string>
+    <string name="httpErrorUnsupportedAuthScheme">"Le modèle d\'authentification du site n\'est pas pris en charge."</string>
     <string name="httpErrorAuth">"Échec de l\'authentification."</string>
     <string name="httpErrorProxyAuth">"Échec de l\'authentification par un serveur proxy."</string>
     <string name="httpErrorConnect">"Échec de la connexion au serveur."</string>
-    <string name="httpErrorIO">"Échec de la communication avec le serveur. Merci de réessayer ultérieurement."</string>
+    <string name="httpErrorIO">"Échec de la communication avec le serveur. Veuillez réessayer ultérieurement."</string>
     <string name="httpErrorTimeout">"Délai de connexion au serveur dépassé."</string>
     <string name="httpErrorRedirectLoop">"Cette page contient trop de redirections de serveurs."</string>
     <string name="httpErrorUnsupportedScheme">"Ce protocole n\'est pas pris en charge."</string>
     <string name="httpErrorFailedSslHandshake">"Aucune connexion sécurisée n\'a pu être établie."</string>
-    <string name="httpErrorBadUrl">"Cette page n\'a pas pu être ouverte car l\'URL n\'est pas valide."</string>
+    <string name="httpErrorBadUrl">"Impossible d\'ouvrir cette page. L\'URL n\'est pas correcte."</string>
     <string name="httpErrorFile">"Impossible d\'accéder au fichier."</string>
-    <string name="httpErrorFileNotFound">"Le fichier demandé n\'a pas été trouvé."</string>
-    <string name="httpErrorTooManyRequests">"Trop de requêtes sont en cours de traitement. Merci de réessayer ultérieurement."</string>
-    <string name="contentServiceSync">"Synchronisation"</string>
+    <string name="httpErrorFileNotFound">"Le fichier demandé est introuvable."</string>
+    <string name="httpErrorTooManyRequests">"Trop de requêtes sont en cours de traitement. Veuillez réessayer ultérieurement."</string>
+    <string name="contentServiceSync">"Synchroniser"</string>
     <string name="contentServiceSyncNotificationTitle">"Synchroniser"</string>
-    <string name="contentServiceTooManyDeletesNotificationDesc">"Trop de contenus effacés (<xliff:g id="CONTENT_TYPE">%s</xliff:g>)."</string>
-    <string name="low_memory">"La mémoire du téléphone est pleine ! Effacez des fichiers pour libérer de l\'espace."</string>
+    <string name="contentServiceTooManyDeletesNotificationDesc">"Trop de contenus supprimés (<xliff:g id="CONTENT_TYPE">%s</xliff:g>)."</string>
+    <string name="low_memory">"La mémoire du téléphone est pleine ! Supprimez des fichiers pour libérer de l\'espace."</string>
     <string name="me">"Moi"</string>
     <string name="power_dialog">"Options du téléphone"</string>
     <string name="silent_mode">"Mode silencieux"</string>
@@ -81,9 +80,9 @@
     <string name="turn_off_radio">"Désactiver le mode sans fil"</string>
     <string name="screen_lock">"Verrouillage de l\'écran"</string>
     <string name="power_off">"Éteindre"</string>
-    <string name="shutdown_progress">"Le téléphone s\'éteint..."</string>
-    <string name="shutdown_confirm">"Votre téléphone s\'éteindra."</string>
-    <string name="no_recent_tasks">"Aucune application récente."</string>
+    <string name="shutdown_progress">"Arrêt en cours..."</string>
+    <string name="shutdown_confirm">"Votre téléphone va s\'éteindra."</string>
+    <string name="no_recent_tasks">"Aucune application récente"</string>
     <string name="global_actions">"Options du téléphone"</string>
     <string name="global_action_lock">"Verrouillage de l\'écran"</string>
     <string name="global_action_power_off">"Éteindre"</string>
     <string name="global_action_silent_mode_off_status">"Le son est activé."</string>
     <string name="safeMode">"Mode sécurisé"</string>
     <string name="permgrouplab_costMoney">"Services payants"</string>
-    <string name="permgroupdesc_costMoney">"Permettre aux applications d\'effectuer des opérations payantes."</string>
+    <string name="permgroupdesc_costMoney">"Permet aux applications d\'effectuer des opérations payantes."</string>
     <string name="permgrouplab_messages">"Vos messages"</string>
-    <string name="permgroupdesc_messages">"Lire et rédiger des SMS, e-mails et autres messages."</string>
+    <string name="permgroupdesc_messages">"Permet de lire et rédiger vos SMS, e-mails et autres messages."</string>
     <string name="permgrouplab_personalInfo">"Vos informations personnelles"</string>
     <string name="permgroupdesc_personalInfo">"Accédez directement aux contacts et au calendrier enregistrés sur votre téléphone."</string>
     <string name="permgrouplab_location">"Votre position géographique"</string>
     <string name="permgroupdesc_location">"Suivre votre position géographique"</string>
     <string name="permgrouplab_network">"Communications réseau"</string>
-    <string name="permgroupdesc_network">"Permettre à des applications d\'accéder à différentes fonctionnalités réseau."</string>
+    <string name="permgroupdesc_network">"Permet à des applications d\'accéder à différentes fonctionnalités du réseau."</string>
     <string name="permgrouplab_accounts">"Vos comptes Google"</string>
     <string name="permgroupdesc_accounts">"Accédez aux comptes Google disponibles."</string>
     <string name="permgrouplab_hardwareControls">"Contrôles du matériel"</string>
-    <string name="permgroupdesc_hardwareControls">"Accéder directement au matériel de l\'appareil."</string>
+    <string name="permgroupdesc_hardwareControls">"Permet d\'accéder directement au matériel de l\'appareil."</string>
     <string name="permgrouplab_phoneCalls">"Appels"</string>
     <string name="permgroupdesc_phoneCalls">"Suivre, enregistrer et traiter les appels téléphoniques"</string>
     <string name="permgrouplab_systemTools">"Outils système"</string>
-    <string name="permgroupdesc_systemTools">"Accès de faible niveau et contrôle du système."</string>
+    <string name="permgroupdesc_systemTools">"Accès et contrôle de faible niveau du système."</string>
     <string name="permgrouplab_developmentTools">"Outils de développement"</string>
     <string name="permgroupdesc_developmentTools">"Ces fonctionnalités sont réservées aux développeurs d\'applications."</string>
-    <string name="permlab_statusBar">"désactiver ou modifier la barre d\'état"</string>
-    <string name="permdesc_statusBar">"Permettre à une application de désactiver la barre d\'état ou d\'ajouter/supprimer des icônes du système."</string>
-    <string name="permlab_expandStatusBar">"agrandir/réduire la barre d\'état"</string>
-    <string name="permdesc_expandStatusBar">"Permettre à l\'application de réduire ou d\'agrandir la barre d\'état."</string>
-    <string name="permlab_processOutgoingCalls">"intercepter les appels sortants"</string>
-    <string name="permdesc_processOutgoingCalls">"Permettre à l\'application de traiter des appels en cours et de modifier le numéro à composer. Des applications malveillantes peuvent suivre, rediriger ou empêcher des appels sortants."</string>
-    <string name="permlab_receiveSms">"recevoir SMS"</string>
-    <string name="permdesc_receiveSms">"Permettre à une application de recevoir et traiter des messages SMS. Des applications malveillantes peuvent suivre vos messages ou les effacer sans que vous en ayez pris connaissance."</string>
+    <string name="permlab_statusBar">"Désactiver ou modifier la barre d\'état"</string>
+    <string name="permdesc_statusBar">"Permet à une application de désactiver la barre d\'état ou d\'ajouter/supprimer des icônes système."</string>
+    <string name="permlab_expandStatusBar">"Agrandir/réduire la barre d\'état"</string>
+    <string name="permdesc_expandStatusBar">"Permet à l\'application de réduire ou d\'agrandir la barre d\'état."</string>
+    <string name="permlab_processOutgoingCalls">"Intercepter les appels sortants"</string>
+    <string name="permdesc_processOutgoingCalls">"Permet à l\'application de traiter des appels en cours et de modifier le numéro à composer. Des applications malveillantes peuvent suivre, rediriger ou empêcher des appels sortants."</string>
+    <string name="permlab_receiveSms">"Recevoir SMS"</string>
+    <string name="permdesc_receiveSms">"Permet à une application de recevoir et traiter des messages SMS. Des applications malveillantes peuvent surveiller vos messages ou les effacer sans que vous en ayez pris connaissance."</string>
     <string name="permlab_receiveMms">"recevoir des MMS"</string>
-    <string name="permdesc_receiveMms">"Permettre à une application de recevoir et traiter des messages MMS. Des applications malveillantes peuvent utiliser cette fonctionnalité pour suivre vos messages ou les effacer sans que vous en ayez pris connaissance."</string>
-    <string name="permlab_sendSms">"envoyer des messages SMS"</string>
-    <string name="permdesc_sendSms">"Permettre aux applications d\'envoyer des messages SMS. Des applications malveillantes peuvent entraîner des frais en envoyant des messages sans vous demander confirmation."</string>
-    <string name="permlab_readSms">"lire les SMS ou MMS"</string>
-    <string name="permdesc_readSms">"Permettre à l\'application de lire les messages SMS enregistrés dans la mémoire de votre téléphone ou sur votre carte SD. Des applications malveillantes peuvent lire vos messages confidentiels."</string>
-    <string name="permlab_writeSms">"modifier un SMS ou un MMS"</string>
-    <string name="permdesc_writeSms">"Permettre à une application de manipuler des messages SMS enregistrés sur votre téléphone ou sur votre carte SIM. Des applications malveillantes peuvent ainsi supprimer vos messages."</string>
-    <string name="permlab_receiveWapPush">"recevoir WAP"</string>
-    <string name="permdesc_receiveWapPush">"Permettre à l\'application de recevoir et de traiter des messages WAP. Des applications malveillantes peuvent ainsi suivre vos messages ou les effacer sans que vous en ayez pris connaissance."</string>
-    <string name="permlab_getTasks">"récupérer les applications en cours d\'exécution"</string>
-    <string name="permdesc_getTasks">"Permettre à l\'application de récupérer des informations sur des tâches en cours d\'exécution ou récemment utilisées. Des applications malveillantes peuvent ainsi obtenir des informations d\'ordre privé concernant d\'autres applications."</string>
-    <string name="permlab_reorderTasks">"trier les applications en cours d\'exécution"</string>
-    <string name="permdesc_reorderTasks">"Permettre à une application de placer des tâches au premier plan ou en arrière-plan. Des applications malveillantes peuvent se placer inopinément au premier plan sans votre autorisation."</string>
-    <string name="permlab_setDebugApp">"activer le débogage de l\'application"</string>
-    <string name="permdesc_setDebugApp">"Permettre à une application d\'activer le mode de débogage d\'une autre application. Des applications malveillantes peuvent utiliser cette fonctionnalité pour interrompre d\'autres applications de façon inopinée."</string>
-    <string name="permlab_changeConfiguration">"modifier les paramètres de l\'IU"</string>
-    <string name="permdesc_changeConfiguration">"Permettre à une application de modifier la configuration actuelle (par ex. : la taille de la police générale ou des paramètres locaux)."</string>
-    <string name="permlab_restartPackages">"relancer d\'autres applications"</string>
-    <string name="permdesc_restartPackages">"Permettre à une application de forcer le lancement d\'autres applications."</string>
-    <string name="permlab_setProcessForeground">"empêcher l\'interruption"</string>
-    <string name="permdesc_setProcessForeground">"Permettre à une application de placer tout processus au premier plan afin qu\'il ne puisse pas être interrompu. Les applications normales ne devraient jamais nécessiter cette fonctionnalité."</string>
-    <string name="permlab_forceBack">"obliger l\'application à se fermer"</string>
-    <string name="permdesc_forceBack">"Permettre à une application de forcer une autre application au premier plan à se fermer et à passer en arrière-plan. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité."</string>
-    <string name="permlab_dump">"récupérer l\'état interne du système"</string>
-    <string name="permdesc_dump">"Permettre à l\'application de récupérer l\'état interne du système. Des applications malveillantes peuvent obtenir de nombreuses informations personnelles et sécurisées auxquelles elles ne devraient pas avoir accès."</string>
-    <string name="permlab_addSystemService">"éditer des services à faible niveau"</string>
-    <string name="permdesc_addSystemService">"Permettre à l\'application d\'éditer ses propres services de système de faible niveau. Des applications malveillantes peuvent prendre le contrôle du système et voler ou corrompre les données qu\'il contient."</string>
-    <string name="permlab_runSetActivityWatcher">"suivre et contrôler tout lancement d\'application"</string>
-    <string name="permdesc_runSetActivityWatcher">"Permettre à une application de suivre et de contrôler la façon dont le système lance des activités. Des applications malveillantes peuvent entièrement déstabiliser le système. Cette autorisation est uniquement nécessaire au développement et non pour l\'utilisation normale du téléphone."</string>
-    <string name="permlab_broadcastPackageRemoved">"envoyer une diffusion de paquet supprimé"</string>
-    <string name="permdesc_broadcastPackageRemoved">"Permettre à une application de diffuser une notification lorsqu\'un paquet d\'application a été supprimé. Des applications malveillantes peuvent utiliser cette fonctionnalité pour interrompre d\'autres applications en cours d\'exécution."</string>
-    <string name="permlab_broadcastSmsReceived">"envoyer une diffusion de SMS reçu"</string>
-    <string name="permdesc_broadcastSmsReceived">"Permettre à une application de diffuser une notification lors de la réception d\'un message SMS. Des applications malveillantes peuvent utiliser cette fonctionnalité pour falsifier des messages SMS entrants."</string>
-    <string name="permlab_broadcastWapPush">"envoyer une diffusion de réception de WAP PUSH"</string>
-    <string name="permdesc_broadcastWapPush">"Permettre à une application d\'envoyer une notification lorsqu\'un message WAP PUSH a été reçu. Des applications malveillantes peuvent utiliser cette fonctionnalité pour créer de faux accusés de réception de MMS ou remplacer le contenu de toute page Internet par des données malveillantes."</string>
-    <string name="permlab_setProcessLimit">"limiter le nombre de processus en cours d\'exécution"</string>
-    <string name="permdesc_setProcessLimit">"Permettre à une application de contrôler le nombre de processus maximal exécutés en même temps. Les applications normales n\'ont jamais recours à cette fonctionnalité."</string>
-    <string name="permlab_setAlwaysFinish">"fermer toutes les applications en tâche de fond"</string>
-    <string name="permdesc_setAlwaysFinish">"Permettre à une application de vérifier si des activités sont systématiquement interrompues lorsqu\'elles sont placées en tâche de fond. Cette fonctionnalité n\'est jamais utilisée par les applications normales."</string>
-    <string name="permlab_fotaUpdate">"installer automatiquement les mises à jour système"</string>
-    <string name="permdesc_fotaUpdate">"Permettre à une application de recevoir des notifications concernant des mises à jour système imminentes et de lancer leur installation. Des applications malveillantes peuvent utiliser cette fonctionnalité pour corrompre le système avec des mises à jour non autorisées ou plus généralement, pour interférer avec le processus de mise à jour."</string>
-    <string name="permlab_batteryStats">"modifier les statistiques de la batterie"</string>
-    <string name="permdesc_batteryStats">"Autoriser la modification des statistiques de la batterie. Cette fonctionnalité ne concerne pas les applications normales."</string>
-    <string name="permlab_internalSystemWindow">"afficher les fenêtres non autorisées"</string>
-    <string name="permdesc_internalSystemWindow">"Permettre de créer des fenêtres conçues pour l\'interface utilisateur du système interne. Les applications normales n\'utilisent pas cette fonctionnalité."</string>
-    <string name="permlab_systemAlertWindow">"afficher les alertes au niveau du système"</string>
-    <string name="permdesc_systemAlertWindow">"Permettre à une application d\'afficher des fenêtres d\'alerte système. Des applications malveillantes peuvent masquer la totalité de l\'écran du téléphone."</string>
-    <string name="permlab_setAnimationScale">"modifier la vitesse générale des animations"</string>
-    <string name="permdesc_setAnimationScale">"Permettre à une application de modifier à tout moment la vitesse globale des animations (pour les rendre plus lentes ou plus rapides)."</string>
-    <string name="permlab_manageAppTokens">"gérer les repères des applications"</string>
-    <string name="permdesc_manageAppTokens">"Permettre à des applications de créer et gérer leurs propres repères en contournant leur axe de profondeur normal. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité."</string>
-    <string name="permlab_injectEvents">"appuyer sur des touches ou contrôler des commandes"</string>
-    <string name="permdesc_injectEvents">"Permettre à une application de fournir ces propres commandes (touches enfoncées, etc.) à d\'autres applications. Des applications malveillantes peuvent utiliser cette fonctionnalité pour prendre le contrôle de votre téléphone."</string>
-    <string name="permlab_readInputState">"enregistrer le texte saisi et les actions effectuées"</string>
-    <string name="permdesc_readInputState">"Permettre à des applications d\'identifier les touches sur lesquelles vous appuyez même lorsque vous utilisez une autre application (lors de la saisie d\'un mot de passe, par exemple). Les applications normales ne devraient jamais avoir recours à cette fonctionnalité."</string>
-    <!-- no translation found for permlab_bindInputMethod (3360064620230515776) -->
-    <skip />
-    <!-- no translation found for permdesc_bindInputMethod (3734838321027317228) -->
-    <skip />
-    <string name="permlab_setOrientation">"modifier l\'orientation de l\'écran"</string>
-    <string name="permdesc_setOrientation">"Permettre à une application de modifier la rotation de l\'écran à tout moment. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité."</string>
-    <string name="permlab_signalPersistentProcesses">"envoyer des signaux Linux aux applications"</string>
-    <string name="permdesc_signalPersistentProcesses">"Permettre à une application de demander que le signal fourni soit envoyé à tous les processus persistants."</string>
-    <string name="permlab_persistentActivity">"exécuter l\'application en continu"</string>
-    <string name="permdesc_persistentActivity">"Permettre à une application de perdurer en partie afin que le système ne puisse pas l\'utiliser pour d\'autres applications."</string>
-    <string name="permlab_deletePackages">"effacer des applications"</string>
-    <string name="permdesc_deletePackages">"Permettre à une application d\'effacer des paquets de données Android. Des applications malveillantes peuvent utiliser cette fonctionnalité pour effacer des applications importantes."</string>
-    <string name="permlab_clearAppUserData">"effacer les données d\'autres applications"</string>
-    <string name="permdesc_clearAppUserData">"Permettre à une application d\'effacer les données de l\'utilisateur."</string>
-    <string name="permlab_deleteCacheFiles">"effacer le cache d\'autres applications"</string>
-    <string name="permdesc_deleteCacheFiles">"Permettre à une application d\'effacer des fichiers du cache."</string>
-    <string name="permlab_getPackageSize">"évaluer l\'espace de stockage de l\'application"</string>
-    <string name="permdesc_getPackageSize">"Permettre à une application de récupérer la taille de son code, de ses données et de son cache."</string>
-    <string name="permlab_installPackages">"installer directement les applications"</string>
-    <string name="permdesc_installPackages">"Permettre à une application d\'installer des nouveaux paquets de données ou des mises à jour Android. Des applications malveillantes peuvent utiliser cette fonctionnalité pour ajouter de nouvelles applications disposant d\'autorisations anormalement élevées."</string>
-    <string name="permlab_clearAppCache">"effacer les données du cache de toutes les applications"</string>
-    <string name="permdesc_clearAppCache">"Permettre à une application de libérer de l\'espace dans la mémoire du téléphone en supprimant des fichiers du cache des applications. Cet accès, en général très limité, est réservé aux processus système."</string>
-    <string name="permlab_readLogs">"lire les fichiers journaux du système"</string>
-    <string name="permdesc_readLogs">"Permettre à une application de lire les différents fichiers journaux du système afin d\'obtenir des informations générales sur la façon dont vous utilisez votre téléphone, mais sans récupérer des informations d\'ordre personnel ou privé."</string>
-    <string name="permlab_diagnostic">"lire/écrire dans les ressources appartenant au diag"</string>
-    <string name="permdesc_diagnostic">"Permettre à une application de lire et écrire toute ressource appartenant au groupe diag (par exemple, les fichiers in/dev). Ceci peut affecter la stabilité et la sécurité du système. Cette fonctionnalité est UNIQUEMENT réservée aux diagnostics matériels effectués par le fabricant ou l\'opérateur."</string>
-    <string name="permlab_changeComponentState">"activer ou désactiver des éléments de l\'application"</string>
-    <!-- no translation found for permdesc_changeComponentState (4569107043246700630) -->
-    <skip />
-    <string name="permlab_setPreferredApplications">"définir les applications préférées"</string>
-    <string name="permdesc_setPreferredApplications">"Permettre à une application de modifier vos applications préférées. Des applications malveillantes peuvent utiliser cette fonctionnalité pour modifier discrètement les applications en cours d\'exécution, en imitant vos applications existantes afin de récupérer des données personnelles vous concernant."</string>
-    <string name="permlab_writeSettings">"modifier les paramètres système généraux"</string>
-    <string name="permdesc_writeSettings">"Permettre à une application de modifier les données des paramètres du système. Des applications malveillantes peuvent utiliser cette fonctionnalité pour corrompre la configuration de votre système."</string>
-    <!-- no translation found for permlab_writeSecureSettings (204676251876718288) -->
-    <skip />
-    <!-- no translation found for permdesc_writeSecureSettings (4116616249170428132) -->
-    <skip />
-    <string name="permlab_writeGservices">"modifier la carte des services Google"</string>
-    <string name="permdesc_writeGservices">"Permettre à une application de modifier la carte des services Google. Cette fonctionnalité n\'est pas conçue pour les applications normales."</string>
-    <string name="permlab_receiveBootCompleted">"lancer automatiquement au démarrage"</string>
-    <string name="permdesc_receiveBootCompleted">"Permettre à une application de se lancer dès la fin du démarrage du système. Ceci peut rallonger le temps nécessaire au téléphone pour démarrer. L\'application étant alors constamment en cours d\'exécution, le fonctionnement général du téléphone peut s\'en trouver ralenti."</string>
-    <string name="permlab_broadcastSticky">"envoyer une diffusion persistante"</string>
-    <string name="permdesc_broadcastSticky">"Permettre à une application d\'envoyer des diffusions \"persistantes\", qui perdurent après la fin de la diffusion. Des applications malveillantes peuvent ainsi ralentir le téléphone ou le rendre instable en l\'obligeant à utiliser trop de mémoire."</string>
-    <string name="permlab_readContacts">"lire les données des contacts"</string>
-    <string name="permdesc_readContacts">"Permettre à une application de lire toutes les données des contacts (adresses) enregistrées sur votre téléphone. Des applications malveillantes peuvent utiliser cette fonctionnalité pour envoyer vos données à d\'autres personnes."</string>
-    <string name="permlab_writeContacts">"écrire les données du contact"</string>
-    <string name="permdesc_writeContacts">"Permettre à une application de modifier toutes les données de contacts (adresses) enregistrées sur le téléphone. Des applications malveillantes peuvent utiliser cette fonctionnalité pour effacer ou modifier vos données."</string>
-    <string name="permlab_writeOwnerData">"écrire les données du propriétaire"</string>
-    <string name="permdesc_writeOwnerData">"Permettre à une application de modifier les données du propriétaire du téléphone enregistrées sur votre appareil. Des applications malveillantes peuvent utiliser cette fonctionnalité pour effacer ou modifier ces données."</string>
-    <string name="permlab_readOwnerData">"lire des données du propriétaire"</string>
-    <string name="permdesc_readOwnerData">"Permettre à une application de lire les données du propriétaire du téléphone enregistrées sur votre appareil. Des applications malveillantes peuvent utiliser cette fonctionnalité pour lire ces données."</string>
-    <string name="permlab_readCalendar">"lire les données du calendrier"</string>
-    <string name="permdesc_readCalendar">"Permettre à une application de lire tous les événements du calendrier enregistré sur le téléphone. Des applications malveillantes peuvent utiliser cette fonctionnalité pour envoyer les événements de votre calendrier à d\'autres personnes."</string>
-    <string name="permlab_writeCalendar">"écrire les données du calendrier"</string>
-    <string name="permdesc_writeCalendar">"Permettre à une application de modifier les événements du calendrier enregistré sur votre téléphone. Des applications malveillantes peuvent utiliser cette fonctionnalité pour effacer ou modifier les données de votre calendrier."</string>
-    <string name="permlab_accessMockLocation">"créer de fausses sources géographiques à des fins de test"</string>
-    <string name="permdesc_accessMockLocation">"Créer des fausses sources de position géographique à des fins de test. Des applications malveillantes peuvent utiliser cette fonctionnalité pour contourner la position géographique et/ou l\'état fournis par des sources réelles comme le GPS ou les fournisseurs d\'accès."</string>
-    <string name="permlab_accessLocationExtraCommands">"accéder à des commandes de fournisseur de position géographique supplémentaires"</string>
-    <string name="permdesc_accessLocationExtraCommands">"Accéder à des commandes de fournisseur de position géographique supplémentaires. Des applications malveillantes peuvent utiliser cette fonctionnalité pour interférer avec l\'utilisation du GPS ou d\'autres sources de positionnement géographique."</string>
-    <string name="permlab_accessFineLocation">"position géographique précise (GPS)"</string>
-    <string name="permdesc_accessFineLocation">"Accéder à des sources de positionnement géographique précises comme le Global Positioning System (GPS) sur le téléphone, lorsque ces services sont disponibles. Des applications malveillantes peuvent utiliser cette fonctionnalité pour déterminer l\'endroit où vous vous trouvez et puiser davantage dans les réserves de la batterie."</string>
-    <string name="permlab_accessCoarseLocation">"position géographique approximative (selon le réseau)"</string>
+    <string name="permdesc_receiveMms">"Permet à une application de recevoir et traiter des messages MMS. Des applications malveillantes peuvent utiliser cette fonctionnalité pour surveiller vos messages ou les effacer sans que vous en ayez pris connaissance."</string>
+    <string name="permlab_sendSms">"Envoyer des messages SMS"</string>
+    <string name="permdesc_sendSms">"Permet aux applications d\'envoyer des messages SMS. Des applications malveillantes peuvent entraîner des frais en envoyant des messages sans vous en demander la confirmation."</string>
+    <string name="permlab_readSms">"Lire les SMS ou MMS"</string>
+    <string name="permdesc_readSms">"Permet à l\'application de lire les messages SMS enregistrés dans la mémoire de votre téléphone ou sur votre carte SD. Des applications malveillantes peuvent lire vos messages confidentiels."</string>
+    <string name="permlab_writeSms">"Modifier un SMS ou un MMS"</string>
+    <string name="permdesc_writeSms">"Permet à une application d\'éditer des messages SMS enregistrés sur votre téléphone ou sur votre carte SIM. Des applications malveillantes peuvent ainsi supprimer vos messages."</string>
+    <string name="permlab_receiveWapPush">"Recevoir WAP"</string>
+    <string name="permdesc_receiveWapPush">"Permet à l\'application de recevoir et de traiter des messages WAP. Des applications malveillantes peuvent ainsi surveiller vos messages ou les effacer sans que vous en ayez pris connaissance."</string>
+    <string name="permlab_getTasks">"Récupérer les applications en cours d\'exécution"</string>
+    <string name="permdesc_getTasks">"Permet à l\'application de récupérer des informations sur des tâches en cours d\'exécution ou récemment utilisées. Des applications malveillantes peuvent ainsi obtenir des informations d\'ordre privé concernant d\'autres applications."</string>
+    <string name="permlab_reorderTasks">"Réorganiser les applications en cours d\'exécution"</string>
+    <string name="permdesc_reorderTasks">"Permet à une application de placer des tâches au premier plan ou en arrière-plan. Des applications malveillantes peuvent se placer inopinément au premier plan sans votre autorisation."</string>
+    <string name="permlab_setDebugApp">"Activer le débogage de l\'application"</string>
+    <string name="permdesc_setDebugApp">"Permet à une application d\'activer le mode de débogage d\'une autre application. Des applications malveillantes peuvent utiliser cette fonctionnalité pour interrompre d\'autres applications de façon inopinée."</string>
+    <string name="permlab_changeConfiguration">"Modifier les paramètres de l\'IU"</string>
+    <string name="permdesc_changeConfiguration">"Permet à une application de modifier la configuration actuelle (par ex. : la taille de la police générale ou des paramètres régionaux)."</string>
+    <string name="permlab_restartPackages">"Relancer d\'autres applications"</string>
+    <string name="permdesc_restartPackages">"Permet à une application de forcer le lancement d\'autres applications."</string>
+    <string name="permlab_setProcessForeground">"Empêcher l\'interruption"</string>
+    <string name="permdesc_setProcessForeground">"Permet à une application d\'exécuter tout processus au premier plan afin qu\'il ne puisse pas être interrompu. Les applications normales ne devraient jamais nécessiter cette fonctionnalité."</string>
+    <string name="permlab_forceBack">"Obliger l\'application à se fermer"</string>
+    <string name="permdesc_forceBack">"Permet à une application de forcer une autre application exécutée au premier plan à se fermer et à passer en arrière-plan. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité."</string>
+    <string name="permlab_dump">"Récupérer l\'état interne du système"</string>
+    <string name="permdesc_dump">"Permet à l\'application de récupérer l\'état interne du système. Des applications malveillantes peuvent obtenir de nombreuses informations personnelles et sécurisées auxquelles elles ne devraient pas avoir accès."</string>
+    <string name="permlab_addSystemService">"Éditer des services à faible niveau"</string>
+    <string name="permdesc_addSystemService">"Permet à l\'application de publier ses propres services de système de niveau inférieur. Des applications malveillantes peuvent prendre le contrôle du système et voler ou corrompre les données qu\'il contient."</string>
+    <string name="permlab_runSetActivityWatcher">"Surveiller et contrôler tout lancement d\'application"</string>
+    <string name="permdesc_runSetActivityWatcher">"Permet à une application de suivre et de contrôler la façon dont le système lance des activités. Des applications malveillantes peuvent entièrement déstabiliser le système. Cette autorisation est uniquement nécessaire au développement et non pour l\'utilisation normale du téléphone."</string>
+    <string name="permlab_broadcastPackageRemoved">"Envoyer une diffusion sans paquet"</string>
+    <string name="permdesc_broadcastPackageRemoved">"Permet à une application de diffuser une notification lorsqu\'un paquet d\'application a été supprimé. Des applications malveillantes peuvent utiliser cette fonctionnalité pour interrompre d\'autres applications en cours d\'exécution."</string>
+    <string name="permlab_broadcastSmsReceived">"Envoyer une diffusion reçue par SMS"</string>
+    <string name="permdesc_broadcastSmsReceived">"Permet à une application de diffuser une notification lors de la réception d\'un message SMS. Des applications malveillantes peuvent utiliser cette fonctionnalité pour falsifier des messages SMS entrants."</string>
+    <string name="permlab_broadcastWapPush">"Envoyer une diffusion de réception de WAP PUSH"</string>
+    <string name="permdesc_broadcastWapPush">"Permet à une application d\'envoyer une notification lors de la réception d\'un message WAP PUSH. Des applications malveillantes peuvent utiliser cette fonctionnalité pour créer de faux accusés de réception de MMS ou remplacer le contenu de toute page Internet par des données malveillantes."</string>
+    <string name="permlab_setProcessLimit">"Limiter le nombre de processus en cours d\'exécution"</string>
+    <string name="permdesc_setProcessLimit">"Permet à une application de contrôler le nombre de processus maximal exécutés en même temps. Les applications normales n\'ont jamais recours à cette fonctionnalité."</string>
+    <string name="permlab_setAlwaysFinish">"Fermer toutes les applications en tâche de fond"</string>
+    <string name="permdesc_setAlwaysFinish">"Permet à une application de vérifier si des activités sont systématiquement interrompues lorsqu\'elles sont placées en tâche de fond. Cette fonctionnalité n\'est jamais utilisée par les applications normales."</string>
+    <string name="permlab_fotaUpdate">"Installer automatiquement les mises à jour du système"</string>
+    <string name="permdesc_fotaUpdate">"Permet à une application de recevoir des notifications concernant des mises à jour système en cours et de lancer leur installation. Des applications malveillantes peuvent utiliser cette fonctionnalité pour corrompre le système avec des mises à jour non autorisées ou plus généralement, pour interférer avec le processus de mise à jour."</string>
+    <string name="permlab_batteryStats">"Modifier les statistiques de la batterie"</string>
+    <string name="permdesc_batteryStats">"Autoriser la modification des statistiques de la batterie. Les applications normales n\'utilisent pas cette fonctionnalité."</string>
+    <string name="permlab_internalSystemWindow">"Afficher les fenêtres non autorisées"</string>
+    <string name="permdesc_internalSystemWindow">"Permet de créer des fenêtres conçues pour l\'interface utilisateur du système interne. Les applications normales n\'utilisent pas cette fonctionnalité."</string>
+    <string name="permlab_systemAlertWindow">"Afficher les alertes au niveau du système"</string>
+    <string name="permdesc_systemAlertWindow">"Permet à une application d\'afficher des fenêtres d\'alerte système. Des applications malveillantes peuvent masquer la totalité de l\'écran du téléphone."</string>
+    <string name="permlab_setAnimationScale">"Modifier la vitesse générale des animations"</string>
+    <string name="permdesc_setAnimationScale">"Permet à une application de modifier à tout moment la vitesse globale des animations (pour les rendre plus lentes ou plus rapides)."</string>
+    <string name="permlab_manageAppTokens">"Gérer les repères des applications"</string>
+    <string name="permdesc_manageAppTokens">"Permet à des applications de créer et gérer leurs propres jetons en ignorant leur ordre de plan normal. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité."</string>
+    <string name="permlab_injectEvents">"Appuyer sur des touches ou contrôler des commandes"</string>
+    <string name="permdesc_injectEvents">"Permet à une application de fournir ses propres commandes (touches enfoncées, etc.) à d\'autres applications. Des applications malveillantes peuvent utiliser cette fonctionnalité pour prendre le contrôle de votre téléphone."</string>
+    <string name="permlab_readInputState">"Enregistrer le texte saisi et les actions effectuées"</string>
+    <string name="permdesc_readInputState">"Permet à des applications d\'identifier les touches sur lesquelles vous appuyez même lorsque vous utilisez une autre application (lors de la saisie d\'un mot de passe, par exemple). Les applications normales ne devraient jamais avoir recours à cette fonctionnalité."</string>
+    <string name="permlab_bindInputMethod">"connecter à un mode de saisie"</string>
+    <string name="permdesc_bindInputMethod">"Permet au support de se connecter à l\'interface de plus haut niveau d\'un mode de saisie. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité."</string>
+    <string name="permlab_setOrientation">"Changer l\'orientation de l\'écran"</string>
+    <string name="permdesc_setOrientation">"Permet à une application de modifier la rotation de l\'écran à tout moment. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité."</string>
+    <string name="permlab_signalPersistentProcesses">"Envoyer des signaux Linux aux applications"</string>
+    <string name="permdesc_signalPersistentProcesses">"Permet à une application de demander que le signal fourni soit envoyé à tous les processus persistants."</string>
+    <string name="permlab_persistentActivity">"Exécuter l\'application en continu"</string>
+    <string name="permdesc_persistentActivity">"Permet à une application de perdurer en partie afin que le système ne puisse pas l\'utiliser pour d\'autres applications."</string>
+    <string name="permlab_deletePackages">"Supprimer des applications"</string>
+    <string name="permdesc_deletePackages">"Permet à une application de supprimer des paquets de données Android. Des applications malveillantes peuvent utiliser cette fonctionnalité pour supprimer des applications importantes."</string>
+    <string name="permlab_clearAppUserData">"Supprimer les données d\'autres applications"</string>
+    <string name="permdesc_clearAppUserData">"Permet à une application d\'effacer les données de l\'utilisateur."</string>
+    <string name="permlab_deleteCacheFiles">"Supprimer le cache d\'autres applications"</string>
+    <string name="permdesc_deleteCacheFiles">"Permet à une application de supprimer des fichiers du cache."</string>
+    <string name="permlab_getPackageSize">"Évaluer l\'espace de stockage de l\'application"</string>
+    <string name="permdesc_getPackageSize">"Permet à une application de récupérer la taille de son code, de ses données et de son cache."</string>
+    <string name="permlab_installPackages">"Installer directement les applications"</string>
+    <string name="permdesc_installPackages">"Permet à une application d\'installer des nouveaux paquets de données ou des mises à jour Android. Des applications malveillantes peuvent utiliser cette fonctionnalité pour ajouter de nouvelles applications disposant d\'autorisations anormalement élevées."</string>
+    <string name="permlab_clearAppCache">"Effacer les données du cache de toutes les applications"</string>
+    <string name="permdesc_clearAppCache">"Permet à une application de libérer de l\'espace dans la mémoire du téléphone en supprimant des fichiers du répertoire du cache des applications. Cet accès est en général limité aux processus système."</string>
+    <string name="permlab_readLogs">"Lire les fichiers journaux du système"</string>
+    <string name="permdesc_readLogs">"Permet à une application de lire les différents fichiers journaux du système afin d\'obtenir des informations générales sur la façon dont vous utilisez votre téléphone,  sans pour autant récupérer des informations d\'ordre personnel ou privé."</string>
+    <string name="permlab_diagnostic">"Lire/écrire dans les ressources appartenant aux diagnostics"</string>
+    <string name="permdesc_diagnostic">"Permet à une application de lire et d\'éditer toute ressource appartenant au groupe de diagnostics (par exemple, les fichiers in/dev). Ceci peut affecter la stabilité et la sécurité du système. Cette fonctionnalité est UNIQUEMENT réservée aux diagnostics matériels effectués par le fabricant ou l\'opérateur."</string>
+    <string name="permlab_changeComponentState">"Activer ou désactiver des éléments de l\'application"</string>
+    <string name="permdesc_changeComponentState">"Permet à une application de modifier l\'état d\'activation/désactivation d\'un élément d\'une autre application. Des applications malveillantes peuvent utiliser cette fonctionnalité pour désactiver des options importantes du téléphone. Soyez prudent en utilisant cette autorisation, car il est possible que certains éléments deviennent instables, incohérents ou inutilisables."</string>
+    <string name="permlab_setPreferredApplications">"Définir les applications préférées"</string>
+    <string name="permdesc_setPreferredApplications">"Permet à une application de modifier vos applications préférées. Des applications malveillantes peuvent utiliser cette fonctionnalité pour modifier discrètement les applications en cours d\'exécution, en imitant vos applications existantes afin de récupérer des données personnelles vous concernant."</string>
+    <string name="permlab_writeSettings">"Modifier les paramètres généraux du système"</string>
+    <string name="permdesc_writeSettings">"Permet à une application de modifier les données des paramètres du système. Des applications malveillantes peuvent utiliser cette fonctionnalité pour corrompre la configuration de votre système."</string>
+    <string name="permlab_writeSecureSettings">"Modifier les paramètres de sécurité du système"</string>
+    <string name="permdesc_writeSecureSettings">"Permet à une application de modifier les données des paramètres de sécurité du système. Les applications normales n\'utilisent pas cette fonctionnalité."</string>
+    <string name="permlab_writeGservices">"Modifier la carte des services Google"</string>
+    <string name="permdesc_writeGservices">"Permet à une application de modifier la carte des services Google. Les applications normales n\'utilisent pas cette fonctionnalité."</string>
+    <string name="permlab_receiveBootCompleted">"Lancer automatiquement au démarrage"</string>
+    <string name="permdesc_receiveBootCompleted">"Permet à une application de se lancer dès la fin du démarrage du système. Ceci peut rallonger le temps de démarrage requis par le téléphone. L\'application étant alors constamment en cours d\'exécution, le fonctionnement général du téléphone risque d\'être ralenti."</string>
+    <string name="permlab_broadcastSticky">"Envoyer une diffusion persistante"</string>
+    <string name="permdesc_broadcastSticky">"Permet à une application d\'envoyer des diffusions \"persistantes\", qui perdurent après la fin de la diffusion. Des applications malveillantes peuvent ainsi ralentir le téléphone ou le rendre instable en l\'obligeant à utiliser trop de mémoire."</string>
+    <string name="permlab_readContacts">"Lire les données des contacts"</string>
+    <string name="permdesc_readContacts">"Permet à une application de lire toutes les données des contacts (adresses) enregistrées sur votre téléphone. Des applications malveillantes peuvent utiliser cette fonctionnalité pour envoyer vos données à d\'autres personnes."</string>
+    <string name="permlab_writeContacts">"Éditer les données d\'un contact"</string>
+    <string name="permdesc_writeContacts">"Permet à une application de modifier toutes les données de contact (adresses) enregistrées sur le téléphone. Des applications malveillantes peuvent utiliser cette fonctionnalité pour effacer ou modifier vos données de contact."</string>
+    <string name="permlab_writeOwnerData">"Éditer les données du propriétaire"</string>
+    <string name="permdesc_writeOwnerData">"Permet à une application de modifier les données du propriétaire du téléphone enregistrées sur votre appareil. Des applications malveillantes peuvent utiliser cette fonctionnalité pour effacer ou modifier ces données."</string>
+    <string name="permlab_readOwnerData">"Lire des données du propriétaire"</string>
+    <string name="permdesc_readOwnerData">"Permet à une application de lire les données du propriétaire du téléphone enregistrées sur votre appareil. Des applications malveillantes peuvent utiliser cette fonctionnalité pour lire ces données."</string>
+    <string name="permlab_readCalendar">"Lire les données du calendrier"</string>
+    <string name="permdesc_readCalendar">"Permet à une application de lire tous les événements du calendrier enregistrés sur votre téléphone. Des applications malveillantes peuvent utiliser cette fonctionnalité pour envoyer les événements de votre calendrier à d\'autres personnes."</string>
+    <string name="permlab_writeCalendar">"Écrire les données du calendrier"</string>
+    <string name="permdesc_writeCalendar">"Permet à une application de modifier les événements du calendrier enregistrés sur votre téléphone. Des applications malveillantes peuvent utiliser cette fonctionnalité pour effacer ou modifier les données de votre calendrier."</string>
+    <string name="permlab_accessMockLocation">"Créer des sources géographiques fictives à des fins de test"</string>
+    <string name="permdesc_accessMockLocation">"Permet de créer des sources de position géographique fictives à des fins de test. Des applications malveillantes peuvent utiliser cette fonctionnalité pour remplacer la position géographique et/ou l\'état fournis par des sources réelles comme le GPS ou les fournisseurs d\'accès."</string>
+    <string name="permlab_accessLocationExtraCommands">"Accéder à des commandes de fournisseur de position géographique supplémentaires"</string>
+    <string name="permdesc_accessLocationExtraCommands">"Permet d\'accéder à des commandes de fournisseur de position géographique supplémentaires. Des applications malveillantes peuvent utiliser cette fonctionnalité pour interférer avec l\'utilisation du GPS ou d\'autres sources de positionnement géographique."</string>
+    <string name="permlab_accessFineLocation">"Position géographique précise (GPS)"</string>
+    <string name="permdesc_accessFineLocation">"Permet d\'accéder à des sources de positionnement géographique précises comme le Global Positioning System (GPS) sur le téléphone, lorsque ces services sont disponibles. Des applications malveillantes peuvent utiliser cette fonctionnalité pour déterminer l\'endroit où vous vous trouvez et augmenter la consommation de la batterie de votre téléphone."</string>
+    <string name="permlab_accessCoarseLocation">"Position géographique approximative (selon le réseau)"</string>
     <string name="permdesc_accessCoarseLocation">"Accéder à des sources de positionnement géographique approximatif (par ex. des bases de données de réseaux mobiles) pour déterminer la position géographique du téléphone, lorsque cette option est disponible. Des applications malveillantes peuvent utiliser cette fonctionnalité pour déterminer approximativement l\'endroit où vous vous trouvez."</string>
-    <string name="permlab_accessSurfaceFlinger">"accéder à SurfaceFlinger"</string>
-    <string name="permdesc_accessSurfaceFlinger">"Permettre à certaines applications d\'utiliser les fonctionnalités SurfaceFlinger de faible niveau."</string>
-    <string name="permlab_readFrameBuffer">"lire le tampon graphique"</string>
-    <string name="permdesc_readFrameBuffer">"Permettre aux applications de lire/utiliser le contenu du tampon graphique."</string>
-    <string name="permlab_modifyAudioSettings">"modifier les paramètres audio"</string>
-    <string name="permdesc_modifyAudioSettings">"Permettre à l\'application de modifier les paramètres audio généraux (par ex. : le volume et le transfert)."</string>
-    <string name="permlab_recordAudio">"enregistrer un fichier audio"</string>
-    <string name="permdesc_recordAudio">"Permettre à l\'application d\'accéder au chemin d\'enregistrement audio."</string>
-    <string name="permlab_camera">"prendre des photos"</string>
-    <string name="permdesc_camera">"Permettre à l\'application de prendre des clichés avec l\'appareil photo. Cette fonctionnalité permet à l\'application de récupérer à tout moment les images perçues par l\'appareil."</string>
-    <string name="permlab_brick">"désactiver le téléphone de façon permanente"</string>
-    <string name="permdesc_brick">"Permettre à l\'application de désactiver définitivement le téléphone. Cette fonctionnalité est très dangereuse."</string>
-    <string name="permlab_reboot">"forcer le redémarrage du téléphone"</string>
-    <string name="permdesc_reboot">"Permettre à l\'application d\'obliger le téléphone à redémarrer."</string>
-    <string name="permlab_mount_unmount_filesystems">"monter et démonter des systèmes de fichiers"</string>
-    <string name="permdesc_mount_unmount_filesystems">"Permettre à l\'application de monter et démonter des systèmes de fichiers pour des périphériques de stockage amovibles."</string>
-    <string name="permlab_vibrate">"contrôler le mode vibration"</string>
-    <string name="permdesc_vibrate">"Permettre à l\'application de contrôler le mode vibration."</string>
-    <string name="permlab_flashlight">"contrôler la lampe de poche"</string>
-    <string name="permdesc_flashlight">"Permettre à l\'application de contrôler la lampe de poche."</string>
-    <string name="permlab_hardware_test">"tester le matériel"</string>
-    <string name="permdesc_hardware_test">"Permettre à l\'application de contrôler différents périphériques à des fins de test matériel."</string>
-    <string name="permlab_callPhone">"appeler directement des numéros de téléphone"</string>
-    <string name="permdesc_callPhone">"Permettre à l\'application d\'appeler des numéros de téléphone sans votre intervention. Des applications malveillantes peuvent ainsi ajouter des appels non désirés à votre facture téléphonique. Sachez que cette fonctionnalité ne permet pas à l\'application d\'appeler des numéros d\'urgence."</string>
-    <string name="permlab_callPrivileged">"appeler directement tout numéro de téléphone"</string>
-    <string name="permdesc_callPrivileged">"Permettre à une application d\'appeler tout numéro de téléphone (y compris les numéros d\'urgence) sans votre intervention. Des applications malveillantes peuvent passer des appels non nécessaires ou illégitimes à des services d\'urgence."</string>
-    <string name="permlab_locationUpdates">"contrôler les notifications de mise à jour de position géographique"</string>
-    <string name="permdesc_locationUpdates">"Autoriser l\'activation/la désactivation des notifications de mises à jour de la position géographique provenant de la radio. Cette fonctionnalité n\'est pas conçue pour les applications normales."</string>
-    <string name="permlab_checkinProperties">"accéder aux propriétés d\'enregistrement"</string>
-    <string name="permdesc_checkinProperties">"Donner un accès en lecture/écriture à des propriétés chargées par le service d\'inscription. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité."</string>
-    <string name="permlab_modifyPhoneState">"modifier l\'état du téléphone"</string>
-    <string name="permdesc_modifyPhoneState">"Permettre à une application de contrôler les fonctionnalités téléphoniques de l\'appareil. Une application bénéficiant de cette autorisation peut changer de réseau, éteindre et allumer la radio du téléphone, etc. sans vous en notifier."</string>
-    <string name="permlab_readPhoneState">"lire l\'état du téléphone"</string>
-    <string name="permdesc_readPhoneState">"Permettre à l\'application d\'accéder aux fonctionnalités d\'appel du téléphone. L\'application peut alors déterminer le numéro de l\'appareil, savoir si un appel est en cours, identifier le numéro appelé, etc."</string>
-    <string name="permlab_wakeLock">"empêcher le téléphone de passer en mode veille"</string>
-    <string name="permdesc_wakeLock">"Permettre à une application d\'empêcher votre téléphone de passer en mode veille."</string>
-    <string name="permlab_devicePower">"éteindre ou allumer le téléphone"</string>
-    <string name="permdesc_devicePower">"Permettre à l\'application d\'éteindre et d\'allumer le téléphone."</string>
-    <string name="permlab_factoryTest">"exécuter en mode Test d\'usine"</string>
-    <string name="permdesc_factoryTest">"Exécuter en tant que test fabricant de faible niveau et autoriser l\'accès au matériel du téléphone. Cette fonctionnalité est uniquement disponible lorsque le téléphone est en mode de test fabricant."</string>
-    <string name="permlab_setWallpaper">"configurer le fond d\'écran"</string>
-    <string name="permdesc_setWallpaper">"Permettre à une application de configurer le fond d\'écran du système."</string>
-    <string name="permlab_setWallpaperHints">"configurer les conseils de taille du fond d\'écran."</string>
-    <string name="permdesc_setWallpaperHints">"Permettre à une application de configurer les conseils de taille du fond d\'écran du système."</string>
-    <string name="permlab_masterClear">"réinitialiser le système à ses valeurs d\'usine"</string>
-    <string name="permdesc_masterClear">"Permettre à une application de réinitialiser entièrement le système afin qu\'il récupère ses valeurs d\'usine, et d\'effacer toutes les données, configurations et applications installées."</string>
-    <string name="permlab_setTimeZone">"configurer le fuseau horaire"</string>
-    <string name="permdesc_setTimeZone">"Permettre à l\'application de modifier le fuseau horaire du téléphone."</string>
-    <string name="permlab_getAccounts">"identifier des comptes connus"</string>
-    <string name="permdesc_getAccounts">"Permettre à une application d\'obtenir la liste des comptes connus du téléphone."</string>
-    <string name="permlab_accessNetworkState">"afficher l\'état du réseau"</string>
-    <string name="permdesc_accessNetworkState">"Permettre à une application d\'afficher l\'état de tous les réseaux."</string>
-    <string name="permlab_createNetworkSockets">"accès Internet complet"</string>
-    <string name="permdesc_createNetworkSockets">"Permettre à une application de créer des connecteurs réseau."</string>
-    <string name="permlab_writeApnSettings">"écrire les paramètres de Nom des points d\'accès"</string>
-    <string name="permdesc_writeApnSettings">"Permettre à une application de modifier les paramètres Nom des points d\'accès, comme le proxy ou le port de tout point d\'accès."</string>
-    <string name="permlab_changeNetworkState">"modifier la connectivité du réseau"</string>
-    <string name="permdesc_changeNetworkState">"Permettre à une application de modifier la connectivité du réseau."</string>
-    <string name="permlab_accessWifiState">"afficher l\'état du Wi-Fi"</string>
-    <string name="permdesc_accessWifiState">"Permettre à une application d\'afficher des informations concernant l\'état du Wi-Fi."</string>
-    <string name="permlab_changeWifiState">"modifier l\'état du Wi-Fi"</string>
-    <string name="permdesc_changeWifiState">"Permettre à une application de se connecter à des points d\'accès Wi-Fi, de s\'en déconnecter et de modifier des réseaux Wi-Fi configurés."</string>
-    <string name="permlab_bluetoothAdmin">"administration Bluetooth"</string>
-    <string name="permdesc_bluetoothAdmin">"Permettre à une application de configurer le téléphone Bluetooth local, d\'identifier des périphériques distants et de les associer au téléphone."</string>
-    <string name="permlab_bluetooth">"créer des connexions Bluetooth"</string>
-    <string name="permdesc_bluetooth">"Permettre à une application d\'obtenir la configuration du téléphone Bluetooth local et de créer et accepter des connexions à des appareils associés."</string>
-    <string name="permlab_disableKeyguard">"désactiver le verrouillage des touches"</string>
-    <string name="permdesc_disableKeyguard">"Permettre à une application de désactiver le  age des touches et toute sécurité par mot de passe. Un exemple légitime : votre téléphone désactive le clavier lorsque vous recevez un appel, puis le réactive lorsque vous raccrochez."</string>
-    <string name="permlab_readSyncSettings">"lire les paramètres de synchronisation"</string>
-    <string name="permdesc_readSyncSettings">"Permettre à une application de lire les paramètres de synchronisation (par ex. : savoir si la synchronisation est activée pour les Contacts)."</string>
-    <string name="permlab_writeSyncSettings">"écrire les paramètres de synchronisation"</string>
-    <string name="permdesc_writeSyncSettings">"Permettre à une application de modifier les paramètres de synchronisation (par ex. si la synchronisation est activée pour les contacts)."</string>
-    <string name="permlab_readSyncStats">"lire les statistiques de synchronisation"</string>
-    <string name="permdesc_readSyncStats">"Permettre à une application de lire les statistiques de synchronisation (par ex. l\'historique des synchronisations effectuées)."</string>
-    <string name="permlab_subscribedFeedsRead">"lire les feeds auxquels vous êtes abonné"</string>
-    <string name="permdesc_subscribedFeedsRead">"Permettre à une application d\'obtenir des informations sur les feeds synchronisés récemment."</string>
-    <string name="permlab_subscribedFeedsWrite">"écrire les feeds auxquels vous êtes abonné"</string>
-    <string name="permdesc_subscribedFeedsWrite">"Permettre à une application de modifier vos feeds synchronisés actuels. Grâce à cette fonctionnalité, des applications malveillantes peuvent modifier vos feeds synchronisés."</string>
-    <!-- no translation found for phoneTypes:7 (9192514806975898961) -->
-    <!-- no translation found for emailAddressTypes:3 (2374913952870110618) -->
-    <!-- no translation found for postalAddressTypes:3 (4932682847595299369) -->
-    <!-- no translation found for imAddressTypes:3 (3145118944639869809) -->
-    <!-- no translation found for organizationTypes:2 (3455047468583965104) -->
+    <string name="permlab_accessSurfaceFlinger">"Accéder à SurfaceFlinger"</string>
+    <string name="permdesc_accessSurfaceFlinger">"Permet à certaines applications d\'utiliser les fonctionnalités SurfaceFlinger de bas niveau."</string>
+    <string name="permlab_readFrameBuffer">"Lire la mémoire tampon graphique"</string>
+    <string name="permdesc_readFrameBuffer">"Permet aux applications de lire/utiliser le contenu de la mémoire tampon graphique."</string>
+    <string name="permlab_modifyAudioSettings">"Modifier vos paramètres audio"</string>
+    <string name="permdesc_modifyAudioSettings">"Permet à l\'application de modifier les paramètres audio généraux (p. ex. le volume et le routage)."</string>
+    <string name="permlab_recordAudio">"Enregistrer un fichier audio"</string>
+    <string name="permdesc_recordAudio">"Permet à l\'application d\'accéder au chemin de l\'enregistrement audio."</string>
+    <string name="permlab_camera">"Prendre des photos"</string>
+    <string name="permdesc_camera">"Permet à l\'application de prendre des clichés avec l\'appareil photo. Cette fonctionnalité permet à l\'application de récupérer à tout moment les images perçues par l\'appareil."</string>
+    <string name="permlab_brick">"Désactiver définitivement le téléphone"</string>
+    <string name="permdesc_brick">"Permet à l\'application de désactiver définitivement le téléphone. Cette fonctionnalité est très dangereuse."</string>
+    <string name="permlab_reboot">"Forcer le redémarrage du téléphone"</string>
+    <string name="permdesc_reboot">"Permet à l\'application de forcer le redémarrage du téléphone."</string>
+    <string name="permlab_mount_unmount_filesystems">"Monter et démonter des systèmes de fichiers"</string>
+    <string name="permdesc_mount_unmount_filesystems">"Permet à l\'application de monter et démonter des systèmes de fichiers pour des périphériques de stockage amovibles."</string>
+    <string name="permlab_vibrate">"Contrôler le vibreur"</string>
+    <string name="permdesc_vibrate">"Permet à l\'application de contrôler le vibreur."</string>
+    <string name="permlab_flashlight">"Contrôler la lampe de poche"</string>
+    <string name="permdesc_flashlight">"Permet à l\'application de contrôler la lampe de poche."</string>
+    <string name="permlab_hardware_test">"Tester le matériel"</string>
+    <string name="permdesc_hardware_test">"Permet à l\'application de contrôler différents périphériques à des fins de test matériel."</string>
+    <string name="permlab_callPhone">"Appeler directement des numéros de téléphone"</string>
+    <string name="permdesc_callPhone">"Permet à l\'application d\'appeler des numéros de téléphone sans votre intervention. Des applications malveillantes peuvent ainsi passer appels non désirés , qui s\'ajoutent à votre facture téléphonique. Sachez que cette fonctionnalité ne permet pas à l\'application d\'appeler des numéros d\'urgence."</string>
+    <string name="permlab_callPrivileged">"Appeler directement tout numéro de téléphone"</string>
+    <string name="permdesc_callPrivileged">"Permet à une application d\'appeler tout numéro de téléphone (y compris les numéros d\'urgence) sans votre intervention. Des applications malveillantes peuvent passer des appels non nécessaires ou illégitimes à des services d\'urgence."</string>
+    <string name="permlab_locationUpdates">"Contrôler les notifications de mise à jour de position géographique"</string>
+    <string name="permdesc_locationUpdates">"Permet l\'activation/la désactivation des notifications de mises à jour de la position géographique provenant de la radio. Les applications normales n\'utilisent pas cette fonctionnalité."</string>
+    <string name="permlab_checkinProperties">"Accéder aux propriétés d\'enregistrement"</string>
+    <string name="permdesc_checkinProperties">"Permet un accès en lecture/écriture à des propriétés envoyées par le service d\'inscription. Les applications normales n\'utilisent pas cette fonctionnalité."</string>
+    <string name="permlab_modifyPhoneState">"Modifier l\'état du téléphone"</string>
+    <string name="permdesc_modifyPhoneState">"Permet à une application de contrôler les fonctionnalités téléphoniques de l\'appareil. Une application bénéficiant de cette autorisation peut changer de réseau, éteindre et allumer la radio du téléphone, etc., sans vous en notifier."</string>
+    <string name="permlab_readPhoneState">"Lire l\'état du téléphone"</string>
+    <string name="permdesc_readPhoneState">"Permet à l\'application d\'accéder aux fonctionnalités d\'appel du téléphone. L\'application peut alors déterminer le numéro de téléphone de l\'appareil, savoir si un appel est en cours, identifier le numéro appelé, etc."</string>
+    <string name="permlab_wakeLock">"Empêcher le téléphone de passer en mode veille"</string>
+    <string name="permdesc_wakeLock">"Permet à une application d\'empêcher votre téléphone de passer en mode veille."</string>
+    <string name="permlab_devicePower">"Éteindre ou allumer le téléphone"</string>
+    <string name="permdesc_devicePower">"Permet à l\'application d\'éteindre et d\'allumer le téléphone."</string>
+    <string name="permlab_factoryTest">"Exécuter en mode Test d\'usine"</string>
+    <string name="permdesc_factoryTest">"Permet d\'exécuter en tant que test fabricant de faible niveau en autorisant l\'accès au matériel du téléphone. Cette fonctionnalité est uniquement disponible lorsque le téléphone est en mode de test fabricant."</string>
+    <string name="permlab_setWallpaper">"Configurer le fond d\'écran"</string>
+    <string name="permdesc_setWallpaper">"Permet à une application de définir le fond d\'écran du système."</string>
+    <string name="permlab_setWallpaperHints">"Définir les informations relatives à la taille du fond d\'écran"</string>
+    <string name="permdesc_setWallpaperHints">"Permet à une application de définir les informations relatives à la taille du fond d\'écran du système."</string>
+    <string name="permlab_masterClear">"Réinitialiser le système à ses paramètres d\'usine"</string>
+    <string name="permdesc_masterClear">"Permet à une application de réinitialiser entièrement le système afin qu\'il récupère ses valeurs d\'usine et d\'effacer toutes les données, configurations et applications installées."</string>
+    <string name="permlab_setTimeZone">"Définir le fuseau horaire"</string>
+    <string name="permdesc_setTimeZone">"Permet à l\'application de modifier le fuseau horaire du téléphone."</string>
+    <string name="permlab_getAccounts">"Identifier des comptes connus"</string>
+    <string name="permdesc_getAccounts">"Permet à une application d\'obtenir la liste des comptes connus du téléphone."</string>
+    <string name="permlab_accessNetworkState">"Afficher l\'état du réseau"</string>
+    <string name="permdesc_accessNetworkState">"Permet à une application d\'afficher l\'état de tous les réseaux."</string>
+    <string name="permlab_createNetworkSockets">"Accès Internet complet"</string>
+    <string name="permdesc_createNetworkSockets">"Permet à une application de créer des connecteurs réseau."</string>
+    <string name="permlab_writeApnSettings">"Écrire les paramètres de Nom des points d\'accès"</string>
+    <string name="permdesc_writeApnSettings">"Permet à une application de modifier les paramètres APN (Nom des points d\'accès), comme le proxy ou le port de tout APN."</string>
+    <string name="permlab_changeNetworkState">"Modifier la connectivité du réseau"</string>
+    <string name="permdesc_changeNetworkState">"Permet à une application de modifier la connectivité du réseau."</string>
+    <string name="permlab_accessWifiState">"Afficher l\'état du Wi-Fi"</string>
+    <string name="permdesc_accessWifiState">"Permet à une application d\'afficher des informations concernant l\'état du Wi-Fi."</string>
+    <string name="permlab_changeWifiState">"Modifier l\'état du Wi-Fi"</string>
+    <string name="permdesc_changeWifiState">"Permet à une application de se connecter à des points d\'accès Wi-Fi, de s\'en déconnecter et de modifier des réseaux Wi-Fi configurés."</string>
+    <string name="permlab_bluetoothAdmin">"Gestion Bluetooth"</string>
+    <string name="permdesc_bluetoothAdmin">"Permet à une application de configurer le téléphone Bluetooth local, d\'identifier des périphériques distants et de les associer au téléphone."</string>
+    <string name="permlab_bluetooth">"Créer des connexions Bluetooth"</string>
+    <string name="permdesc_bluetooth">"Permet à une application d\'obtenir la configuration du téléphone Bluetooth local et de créer et accepter des connexions à des appareils associés."</string>
+    <string name="permlab_disableKeyguard">"Désactiver le verrouillage des touches"</string>
+    <string name="permdesc_disableKeyguard">"Permet à une application de désactiver le verrouillage des touches et toute sécurité par mot de passe. Exemple : Votre téléphone désactive le verrouillage du clavier lorsque vous recevez un appel, puis le réactive lorsque vous raccrochez."</string>
+    <string name="permlab_readSyncSettings">"Lire les paramètres de synchronisation"</string>
+    <string name="permdesc_readSyncSettings">"Permet à une application de lire les paramètres de synchronisation (par ex. savoir si la synchronisation est activée pour les Contacts)."</string>
+    <string name="permlab_writeSyncSettings">"Écrire les paramètres de synchronisation"</string>
+    <string name="permdesc_writeSyncSettings">"Permet à une application de modifier les paramètres de synchronisation (p. ex. si la synchronisation est activée pour les contacts)."</string>
+    <string name="permlab_readSyncStats">"Lire les statistiques de synchronisation"</string>
+    <string name="permdesc_readSyncStats">"Permet à une application de lire les statistiques de synchronisation (par ex. l\'historique des synchronisations effectuées)."</string>
+    <string name="permlab_subscribedFeedsRead">"Lire les flux auxquels vous êtes abonné"</string>
+    <string name="permdesc_subscribedFeedsRead">"Permet à une application d\'obtenir des informations sur les flux récemment synchronisés."</string>
+    <string name="permlab_subscribedFeedsWrite">"Écrire les flux auxquels vous êtes abonné"</string>
+    <string name="permdesc_subscribedFeedsWrite">"Permet à une application de modifier vos flux synchronisés actuels. Cette fonctionnalité peut permettre à des applications malveillantes de modifier vos flux synchronisés."</string>
+  <string-array name="phoneTypes">
+    <item>"Accueil"</item>
+    <item>"Mobile"</item>
+    <item>"Bureau"</item>
+    <item>"Télécopie bureau"</item>
+    <item>"Télécopie domicile"</item>
+    <item>"Récepteur d\'appel"</item>
+    <item>"Autre"</item>
+    <item>"Personnalisé"</item>
+  </string-array>
+  <string-array name="emailAddressTypes">
+    <item>"Accueil"</item>
+    <item>"Bureau"</item>
+    <item>"Autre"</item>
+    <item>"Personnalisée"</item>
+  </string-array>
+  <string-array name="postalAddressTypes">
+    <item>"Accueil"</item>
+    <item>"Bureau"</item>
+    <item>"Autre"</item>
+    <item>"Personnalisée"</item>
+  </string-array>
+  <string-array name="imAddressTypes">
+    <item>"Accueil"</item>
+    <item>"Bureau"</item>
+    <item>"Autre"</item>
+    <item>"Personnalisé"</item>
+  </string-array>
+  <string-array name="organizationTypes">
+    <item>"Bureau"</item>
+    <item>"Autre"</item>
+    <item>"Personnalisée"</item>
+  </string-array>
   <string-array name="imProtocols">
     <item>"AIM"</item>
     <item>"Windows Live"</item>
     <item>"ICQ"</item>
     <item>"Jabber"</item>
   </string-array>
-    <!-- no translation found for keyguard_password_enter_pin_code (3731488827218876115) -->
-    <skip />
-    <string name="keyguard_password_wrong_pin_code">"Le code PIN est incorrect !"</string>
+    <string name="keyguard_password_enter_pin_code">"Saisir le code PIN"</string>
+    <string name="keyguard_password_wrong_pin_code">"Le code PIN est incorrect !"</string>
     <string name="keyguard_label_text">"Pour débloquer le clavier, appuyez sur Menu puis sur 0."</string>
     <string name="emergency_call_dialog_number_for_display">"Numéro d\'urgence"</string>
     <string name="lockscreen_carrier_default">"(Aucun service)"</string>
-    <!-- no translation found for lockscreen_screen_locked (7288443074806832904) -->
-    <skip />
+    <string name="lockscreen_screen_locked">"Écran verrouillé"</string>
     <string name="lockscreen_instructions_when_pattern_enabled">"Appuyez sur Menu pour débloquer le téléphone ou appeler un numéro d\'urgence"</string>
-    <string name="lockscreen_instructions_when_pattern_disabled">"Appuyez sur Menu pour débloquer le téléphone."</string>
-    <!-- no translation found for lockscreen_pattern_instructions (7478703254964810302) -->
-    <skip />
+    <string name="lockscreen_instructions_when_pattern_disabled">"Appuyez sur Menu pour déverrouiller le téléphone."</string>
+    <string name="lockscreen_pattern_instructions">"Dessinez un motif pour déverrouiller le téléphone"</string>
     <string name="lockscreen_emergency_call">"Appel d\'urgence"</string>
-    <string name="lockscreen_pattern_correct">"Forme validée !"</string>
-    <!-- no translation found for lockscreen_pattern_wrong (4817583279053112312) -->
-    <skip />
-    <string name="lockscreen_plugged_in">"Rechargement (<xliff:g id="NUMBER">%d%%</xliff:g>)"</string>
+    <string name="lockscreen_pattern_correct">"Combinaison correcte !"</string>
+    <string name="lockscreen_pattern_wrong">"Désolé. Merci de réessayer"</string>
+    <string name="lockscreen_plugged_in">"Chargement (<xliff:g id="NUMBER">%d%%</xliff:g>)"</string>
     <string name="lockscreen_low_battery">"Branchez votre chargeur."</string>
     <string name="lockscreen_missing_sim_message_short">"Aucune carte SIM n\'a été trouvée."</string>
     <string name="lockscreen_missing_sim_message">"Aucune carte SIM n\'est insérée dans le téléphone."</string>
     <string name="lockscreen_missing_sim_instructions">"Insérez une carte SIM."</string>
     <string name="lockscreen_network_locked_message">"Réseau bloqué"</string>
-    <string name="lockscreen_sim_puk_locked_message">"La carte SIM est bloquée par code PUK."</string>
+    <string name="lockscreen_sim_puk_locked_message">"La carte SIM est verrouillée par code PUK."</string>
     <string name="lockscreen_sim_puk_locked_instructions">"Veuillez contacter l\'assistance clientèle."</string>
     <string name="lockscreen_sim_locked_message">"La carte SIM est bloquée."</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message">"Déblocage de la carte SIM..."</string>
-    <string name="lockscreen_too_many_failed_attempts_dialog_message">"Vous avez mal reproduit la forme de déblocage <xliff:g id="NUMBER_0">%d</xliff:g> fois. "\n\n"Veuillez réessayer dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes."</string>
-    <string name="lockscreen_failed_attempts_almost_glogin">"Vous avez mal dessiné la forme de déblocage <xliff:g id="NUMBER_0">%d</xliff:g> fois. Au bout de <xliff:g id="NUMBER_1">%d</xliff:g> tentatives supplémentaires, vous devrez débloquer votre téléphone avec votre identifiant Google."\n\n"Merci de réessayer dans <xliff:g id="NUMBER_2">%d</xliff:g> secondes."</string>
-    <string name="lockscreen_too_many_failed_attempts_countdown">"Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> secondes."</string>
-    <string name="lockscreen_forgot_pattern_button_text">"Vous avez oublié la forme à dessiner ?"</string>
-    <string name="lockscreen_glogin_too_many_attempts">"Trop de tentatives !"</string>
-    <!-- no translation found for lockscreen_glogin_instructions (7400120254204758548) -->
-    <skip />
+    <string name="lockscreen_too_many_failed_attempts_dialog_message">"Vous avez mal reproduit le motif de déverrouillage <xliff:g id="NUMBER_0">%d</xliff:g> fois. "\n\n"Veuillez réessayer dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin">"Vous avez mal saisi le motif de déverrouillage <xliff:g id="NUMBER_0">%d</xliff:g> fois. Au bout de <xliff:g id="NUMBER_1">%d</xliff:g> tentatives supplémentaires, vous devrez débloquer votre téléphone à l\'aide de votre identifiant Google."\n\n"Merci de réessayer dans <xliff:g id="NUMBER_2">%d</xliff:g> secondes."</string>
+    <string name="lockscreen_too_many_failed_attempts_countdown">"Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> secondes."</string>
+    <string name="lockscreen_forgot_pattern_button_text">"Motif oublié ?"</string>
+    <string name="lockscreen_glogin_too_many_attempts">"Trop de tentatives de motif !"</string>
+    <string name="lockscreen_glogin_instructions">"Pour débloquer votre téléphone,"\n"connectez-vous à votre compte Google"</string>
     <string name="lockscreen_glogin_username_hint">"Nom d\'utilisateur (e-mail)"</string>
     <string name="lockscreen_glogin_password_hint">"Mot de passe"</string>
     <string name="lockscreen_glogin_submit_button">"Se connecter"</string>
-    <string name="lockscreen_glogin_invalid_input">"Nom d\'utilisateur ou mot de passe non valide."</string>
+    <string name="lockscreen_glogin_invalid_input">"Nom d\'utilisateur ou mot de passe incorrect."</string>
     <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
-    <!-- no translation found for hour_minute_ampm (7044207493989843593) -->
-    <skip />
-    <!-- no translation found for hour_minute_cap_ampm (5778825208801303756) -->
-    <skip />
+    <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+    <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <!-- no translation found for hour_ampm (7618670480400517084) -->
     <skip />
     <!-- no translation found for hour_cap_ampm (5117798389811605468) -->
     <string name="status_bar_latest_events_title">"Notifications"</string>
     <!-- no translation found for battery_status_text_percent_format (8818848472818880005) -->
     <skip />
-    <string name="battery_status_charging">"Rechargement..."</string>
-    <string name="battery_low_title">"Veuillez brancher le chargeur"</string>
-    <string name="battery_low_subtitle">"La batterie commence à faiblir :"</string>
-    <string name="battery_low_percent_format">"Batterie restante : <xliff:g id="NUMBER">%d%%</xliff:g>"</string>
+    <string name="battery_status_charging">"Chargement..."</string>
+    <string name="battery_low_title">"Branchez le chargeur"</string>
+    <string name="battery_low_subtitle">"La batterie commence à faiblir :"</string>
+    <string name="battery_low_percent_format">"Batterie restante : <xliff:g id="NUMBER">%d%%</xliff:g>"</string>
     <string name="factorytest_failed">"Échec du test usine"</string>
     <string name="factorytest_not_system">"L\'action FACTORY_TEST est uniquement prise en charge pour les paquets de données installés dans in/system/app."</string>
-    <string name="factorytest_no_action">"Aucun paquet permettant de prendre en charge l\'action FACTORY_TEST n\'a été trouvé."</string>
+    <string name="factorytest_no_action">"Impossible de trouver un paquet proposant l\'action FACTORY_TEST."</string>
     <string name="factorytest_reboot">"Redémarrer"</string>
     <string name="save_password_label">"Confirmer"</string>
-    <string name="save_password_message">"Voulez-vous que le navigateur se souvienne de ce mot de passe ?"</string>
+    <string name="save_password_message">"Voulez-vous que le navigateur se souvienne de ce mot de passe ?"</string>
     <string name="save_password_notnow">"Pas maintenant"</string>
     <string name="save_password_remember">"Se souvenir du mot de passe"</string>
     <string name="save_password_never">"Jamais"</string>
-    <string name="open_permission_deny">"Vous n\'avez pas l\'autorisation d\'ouvrir cette page."</string>
+    <string name="open_permission_deny">"Vous n\'êtes pas autorisé à ouvrir cette page."</string>
     <string name="text_copied">"Le texte a été copié dans le presse-papier."</string>
     <string name="more_item_label">"Plus"</string>
     <string name="prepend_shortcut_label">"Menu+"</string>
     <string name="menu_space_shortcut_label">"espace"</string>
     <string name="menu_enter_shortcut_label">"entrée"</string>
-    <string name="menu_delete_shortcut_label">"effacer"</string>
+    <string name="menu_delete_shortcut_label">"supprimer"</string>
     <string name="search_go">"Rechercher"</string>
     <string name="today">"Aujourd\'hui"</string>
     <string name="yesterday">"Hier"</string>
     <string name="tomorrow">"Demain"</string>
-    <string name="oneMonthDurationPast">"Il y a 1 mois"</string>
+    <string name="oneMonthDurationPast">"Il y a 1 mois"</string>
     <string name="beforeOneMonthDurationPast">"Il y a plus d\'un mois"</string>
   <plurals name="num_seconds_ago">
-    <item quantity="one">"Il y a 1 seconde"</item>
-    <item quantity="other">"Il y a <xliff:g id="COUNT">%d</xliff:g> secondes"</item>
+    <item quantity="one">"Il y a 1 seconde"</item>
+    <item quantity="other">"Il y a <xliff:g id="COUNT">%d</xliff:g> secondes"</item>
   </plurals>
   <plurals name="num_minutes_ago">
-    <item quantity="one">"Il y a 1 minute"</item>
+    <item quantity="one">"Il y a 1 minute"</item>
     <item quantity="other">"Il y a <xliff:g id="COUNT">%d</xliff:g> minutes"</item>
   </plurals>
   <plurals name="num_hours_ago">
   </plurals>
   <plurals name="num_days_ago">
     <item quantity="one">"hier"</item>
-    <item quantity="other">"Il y a <xliff:g id="COUNT">%d</xliff:g> jours"</item>
+    <item quantity="other">"Il y a <xliff:g id="COUNT">%d</xliff:g> jours"</item>
   </plurals>
   <plurals name="in_num_seconds">
-    <item quantity="one">"dans 1 seconde"</item>
-    <item quantity="other">"dans <xliff:g id="COUNT">%d</xliff:g> secondes"</item>
+    <item quantity="one">"dans 1 seconde"</item>
+    <item quantity="other">"dans <xliff:g id="COUNT">%d</xliff:g> secondes"</item>
   </plurals>
   <plurals name="in_num_minutes">
-    <item quantity="one">"dans 1 minute"</item>
-    <item quantity="other">"dans <xliff:g id="COUNT">%d</xliff:g> minutes"</item>
+    <item quantity="one">"dans 1 minute"</item>
+    <item quantity="other">"dans <xliff:g id="COUNT">%d</xliff:g> minutes"</item>
   </plurals>
   <plurals name="in_num_hours">
-    <item quantity="one">"dans 1 heure"</item>
+    <item quantity="one">"dans 1 heure"</item>
     <item quantity="other">"dans <xliff:g id="COUNT">%d</xliff:g> heures"</item>
   </plurals>
   <plurals name="in_num_days">
     <item quantity="one">"demain"</item>
-    <item quantity="other">"dans <xliff:g id="COUNT">%d</xliff:g> jours"</item>
+    <item quantity="other">"dans <xliff:g id="COUNT">%d</xliff:g> jours"</item>
   </plurals>
     <!-- no translation found for abbrev_num_seconds_ago:one (1849036840200069118) -->
     <!-- no translation found for abbrev_num_seconds_ago:other (3699169366650930415) -->
     <string name="preposition_for_date">"%s"</string>
     <string name="preposition_for_time">"à %s"</string>
     <string name="preposition_for_year">"en %s"</string>
-    <string name="day">" jour"</string>
-    <string name="days">" jours"</string>
+    <string name="day">"jour"</string>
+    <string name="days">"jours"</string>
     <string name="hour">"heure"</string>
     <string name="hours">"heures"</string>
     <string name="minute">"mn"</string>
     <string name="thursday">"jeudi"</string>
     <string name="friday">"vendredi"</string>
     <string name="saturday">"samedi"</string>
-    <string name="every_weekday">"Tous les jours ouvrés (lun.-vend.)"</string>
+    <string name="every_weekday">"Tous les jours ouvrés (lun.- ven.)"</string>
     <string name="daily">"Tous les jours"</string>
     <string name="weekly">"Toutes les semaines le <xliff:g id="DAY">%s</xliff:g>"</string>
     <string name="monthly">"Tous les mois"</string>
     <!-- no translation found for relative_time (1818557177829411417) -->
     <skip />
     <string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string>
-    <string name="full_date_month_first">"<xliff:g id="MONTH">MMMM</xliff:g> <xliff:g id="DAY">dd</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="full_date_month_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string>
     <string name="full_date_day_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string>
-    <string name="medium_date_month_first">"<xliff:g id="MONTH">MMM</xliff:g> <xliff:g id="DAY">dd</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string>
-    <string name="medium_date_day_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMM</xliff:g>, <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="medium_date_month_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="medium_date_day_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string>
     <string name="twelve_hour_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">a</xliff:g>"</string>
     <string name="twenty_four_hour_time_format">"<xliff:g id="HOUR">H</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g>"</string>
     <string name="noon">"midi"</string>
     <string name="numeric_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>"</string>
     <string name="numeric_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>"</string>
     <string name="numeric_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>"</string>
-    <string name="numeric_md1_time1_md2_time2">"<xliff:g id="DAY1">%3$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_md1_time1_md2_time2">"<xliff:g id="DAY1">%3$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="TIME2">%10$s</xliff:g>"</string>
     <string name="numeric_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
     <string name="numeric_mdy1_time1_mdy2_time2">"<xliff:g id="DAY1">%3$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
     <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
     <string name="same_month_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>"</string>
     <string name="same_month_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>"</string>
     <string name="same_month_md1_time1_md2_time2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="TIME2">%10$s</xliff:g>"</string>
-    <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
     <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
     <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
     <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
     <string name="day_of_week_short_tuesday">"mar."</string>
     <string name="day_of_week_short_wednesday">"mer."</string>
     <string name="day_of_week_short_thursday">"jeu."</string>
-    <string name="day_of_week_short_friday">"vend."</string>
+    <string name="day_of_week_short_friday">"ven."</string>
     <string name="day_of_week_short_saturday">"sam."</string>
-    <string name="day_of_week_shorter_sunday">"dim"</string>
-    <string name="day_of_week_shorter_monday">"lun"</string>
+    <string name="day_of_week_shorter_sunday">"dim."</string>
+    <string name="day_of_week_shorter_monday">"lun."</string>
     <string name="day_of_week_shorter_tuesday">"mar."</string>
     <string name="day_of_week_shorter_wednesday">"mer."</string>
     <string name="day_of_week_shorter_thursday">"jeu."</string>
     <string name="day_of_week_shorter_friday">"ven."</string>
-    <string name="day_of_week_shorter_saturday">"sam"</string>
+    <string name="day_of_week_shorter_saturday">"sam."</string>
     <string name="day_of_week_shortest_sunday">"dim."</string>
     <string name="day_of_week_shortest_monday">"lun."</string>
-    <string name="day_of_week_shortest_tuesday">"mar."</string>
-    <string name="day_of_week_shortest_wednesday">"merc."</string>
+    <string name="day_of_week_shortest_tuesday">"Mar."</string>
+    <string name="day_of_week_shortest_wednesday">"mer."</string>
     <string name="day_of_week_shortest_thursday">"jeu."</string>
     <string name="day_of_week_shortest_friday">"ven."</string>
-    <string name="day_of_week_shortest_saturday">"sam"</string>
+    <string name="day_of_week_shortest_saturday">"sam."</string>
     <string name="month_long_january">"janvier"</string>
     <string name="month_long_february">"février"</string>
     <string name="month_long_march">"mars"</string>
     <string name="month_medium_november">"nov."</string>
     <string name="month_medium_december">"déc."</string>
     <string name="month_shortest_january">"jan."</string>
-    <string name="month_shortest_february">"fév."</string>
-    <string name="month_shortest_march">"mar."</string>
+    <string name="month_shortest_february">"ven."</string>
+    <string name="month_shortest_march">"mars"</string>
     <string name="month_shortest_april">"avr."</string>
     <string name="month_shortest_may">"mai"</string>
     <string name="month_shortest_june">"juin"</string>
-    <string name="month_shortest_july">"jui."</string>
+    <string name="month_shortest_july">"juil."</string>
     <string name="month_shortest_august">"août"</string>
     <string name="month_shortest_september">"sept."</string>
     <string name="month_shortest_october">"oct."</string>
     <string name="month_shortest_december">"déc."</string>
     <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
     <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
-    <string name="selectAll">"Sélectionner tout"</string>
-    <!-- no translation found for selectText (3889149123626888637) -->
-    <skip />
-    <!-- no translation found for stopSelectingText (4157931463872320996) -->
-    <skip />
+    <string name="selectAll">"Tout sélectionner"</string>
+    <string name="selectText">"Sélectionner le texte"</string>
+    <string name="stopSelectingText">"Arrêter de sélectionner du texte"</string>
     <string name="cut">"Couper"</string>
-    <string name="cutAll">"Couper tout"</string>
+    <string name="cutAll">"Tout couper"</string>
     <string name="copy">"Copier"</string>
-    <string name="copyAll">"Copier tout"</string>
+    <string name="copyAll">"Tout copier"</string>
     <string name="paste">"Coller"</string>
     <string name="copyUrl">"Copier l\'URL"</string>
-    <!-- no translation found for inputMethod (7673923508389094672) -->
-    <skip />
-    <!-- no translation found for editTextMenuTitle (1672989176958581452) -->
-    <skip />
+    <string name="inputMethod">"Mode de saisie"</string>
+    <string name="editTextMenuTitle">"Modifier le texte"</string>
     <string name="low_internal_storage_view_title">"Espace disponible faible"</string>
     <string name="low_internal_storage_view_text">"La mémoire du téléphone commence à être pleine."</string>
     <string name="ok">"OK"</string>
     <string name="capital_on">"ON"</string>
     <string name="capital_off">"OFF"</string>
     <string name="whichApplication">"Terminer l\'action avec"</string>
-    <string name="alwaysUse">"Utiliser par défaut pour cette action."</string>
-    <string name="clearDefaultHintMsg">"Effacer par défaut dans les Paramètres de l\'accueil &gt; Applications &gt; Gérer les applications."</string>
+    <string name="alwaysUse">"Utiliser cette application par défaut pour cette action."</string>
+    <string name="clearDefaultHintMsg">"Effacez les paramètres par défaut dans les Paramètres d\'accueil &gt; Applications &gt; Gérer les applications."</string>
     <string name="chooseActivity">"Sélectionner une action"</string>
     <string name="noApplications">"Aucune application ne peut effectuer cette action."</string>
-    <string name="aerr_title">"Désolé !"</string>
+    <string name="aerr_title">"Désolé !"</string>
     <string name="aerr_application">"L\'application <xliff:g id="APPLICATION">%1$s</xliff:g> (du processus <xliff:g id="PROCESS">%2$s</xliff:g>) s\'est interrompue inopinément. Merci de réessayer."</string>
     <string name="aerr_process">"Le processus <xliff:g id="PROCESS">%1$s</xliff:g> s\'est interrompu de façon inopinée. Merci de réessayer."</string>
-    <string name="anr_title">"Désolé !"</string>
+    <string name="anr_title">"Désolé !"</string>
     <string name="anr_activity_application">"L\'activité <xliff:g id="ACTIVITY">%1$s</xliff:g> (de l\'application <xliff:g id="APPLICATION">%2$s</xliff:g>) ne répond pas."</string>
     <string name="anr_activity_process">"L\'activité <xliff:g id="ACTIVITY">%1$s</xliff:g> (du processus <xliff:g id="PROCESS">%2$s</xliff:g>) ne répond pas."</string>
     <string name="anr_application_process">"L\'application <xliff:g id="APPLICATION">%1$s</xliff:g> (du processus <xliff:g id="PROCESS">%2$s</xliff:g>) ne répond pas."</string>
     <string name="debug">"Débogage"</string>
     <string name="sendText">"Sélectionner une action pour le texte"</string>
     <string name="volume_ringtone">"Volume de la sonnerie"</string>
-    <!-- no translation found for volume_music (5421651157138628171) -->
-    <skip />
-    <!-- no translation found for volume_music_hint_playing_through_bluetooth (9165984379394601533) -->
-    <skip />
+    <string name="volume_music">"Volume des médias"</string>
+    <string name="volume_music_hint_playing_through_bluetooth">"Lecture via Bluetooth"</string>
     <string name="volume_call">"Volume des appels entrants"</string>
-    <!-- no translation found for volume_call_hint_playing_through_bluetooth (7750873841563910404) -->
-    <skip />
+    <string name="volume_call_hint_playing_through_bluetooth">"Lecture via Bluetooth"</string>
     <string name="volume_alarm">"Volume de l\'alarme"</string>
-    <!-- no translation found for volume_notification (2422265656744276715) -->
-    <skip />
+    <string name="volume_notification">"Volume des notifications"</string>
     <string name="volume_unknown">"Volume"</string>
     <string name="ringtone_default">"Sonnerie par défaut"</string>
     <string name="ringtone_default_with_actual">"Sonnerie par défaut (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
     <string name="ringtone_silent">"Silencieux"</string>
-    <!-- no translation found for ringtone_picker_title (3515143939175119094) -->
-    <skip />
+    <string name="ringtone_picker_title">"Sonneries"</string>
     <string name="ringtone_unknown">"Sonnerie inconnue"</string>
   <plurals name="wifi_available">
     <item quantity="one">"Réseau Wi-Fi disponible"</item>
     <item quantity="one">"Ouvrir le réseau Wi-Fi disponible"</item>
     <item quantity="other">"Ouvrir les réseaux Wi-Fi disponibles"</item>
   </plurals>
-    <!-- no translation found for select_character (3365550120617701745) -->
-    <skip />
+    <string name="select_character">"Insérer un caractère"</string>
     <string name="sms_control_default_app_name">"Application inconnue"</string>
-    <string name="sms_control_title">"Envoi des messages SMS"</string>
-    <string name="sms_control_message">"Vous allez envoyer un grand nombre de messages SMS. Sélectionnez OK pour continuer ou Annuler pour interrompre l\'envoi."</string>
+    <string name="sms_control_title">"Envoi de messages SMS"</string>
+    <string name="sms_control_message">"Vous êtes sur le point d\'envoyer un grand nombre de messages SMS. Sélectionnez OK pour continuer ou Annuler pour interrompre l\'envoi."</string>
     <string name="sms_control_yes">"OK"</string>
     <string name="sms_control_no">"Annuler"</string>
-    <string name="date_time_set">"Régler"</string>
+    <string name="date_time_set">"Définir"</string>
     <string name="default_permission_group">"Par défaut"</string>
     <string name="no_permissions">"Aucune autorisation requise"</string>
     <string name="perms_hide"><b>"Masquer"</b></string>
-    <string name="perms_show_all"><b>"Afficher tout"</b></string>
+    <string name="perms_show_all"><b>"Tout afficher"</b></string>
     <string name="googlewebcontenthelper_loading">"Chargement..."</string>
-    <string name="usb_storage_title">"Connecté avec un câble USB"</string>
-    <string name="usb_storage_message">"Vous avez connecté votre téléphone à votre ordinateur avec un câble USB. Sélectionnez Monter pour copier des fichiers depuis votre ordinateur vers votre carte SD ou inversement."</string>
+    <string name="usb_storage_title">"Connecté à l\'aide d\'un câble USB"</string>
+    <string name="usb_storage_message">"Vous avez connecté votre téléphone à votre ordinateur à l\'aide d\'un câble USB. Sélectionnez Monter pour copier des fichiers depuis votre ordinateur vers votre carte SD ou inversement."</string>
     <string name="usb_storage_button_mount">"Monter"</string>
     <string name="usb_storage_button_unmount">"Ne pas monter"</string>
     <string name="usb_storage_error_message">"Un problème est survenu lors de l\'utilisation de votre carte SD en tant que périphérique de stockage USB."</string>
     <string name="usb_storage_notification_title">"Connecté avec un câble USB"</string>
-    <string name="usb_storage_notification_message">"Sélectionner cette option pour copier des fichiers vers/à partir de votre ordinateur."</string>
-    <!-- no translation found for select_input_method (2086499663193509436) -->
-    <skip />
-    <!-- no translation found for fast_scroll_alphabet (5433275485499039199) -->
-    <skip />
-    <!-- no translation found for fast_scroll_numeric_alphabet (4030170524595123610) -->
-    <skip />
-    <!-- no translation found for candidates_style (5248064431114273041) -->
-    <skip />
+    <string name="usb_storage_notification_message">"Sélectionnez cette option pour copier des fichiers vers/à partir de votre ordinateur."</string>
+    <string name="select_input_method">"Sélectionner un mode de saisie"</string>
+    <string name="fast_scroll_alphabet">"ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="fast_scroll_numeric_alphabet">"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="candidates_style"><font fgcolor="#ff000000" bgcolor="#ff8080ff"><u>"candidats"</u>"u&gt;"</font></string>
 </resources>
index 771eabd..b41d449 100644 (file)
@@ -25,8 +25,7 @@
     <string name="badPuk">"Il PUK digitato è errato."</string>
     <string name="mismatchPin">"I PIN inseriti non corrispondono."</string>
     <string name="invalidPin">"Il PIN deve essere di 4-8 numeri."</string>
-    <!-- no translation found for needPuk (919668385956251611) -->
-    <skip />
+    <string name="needPuk">"La SIM è bloccata tramite PUK. Digita il codice PUK per sbloccarla."</string>
     <string name="needPuk2">"Digita il PUK2 per sbloccare la SIM."</string>
     <string name="ClipMmi">"ID chiamante in entrata"</string>
     <string name="ClirMmi">"ID chiamante in uscita"</string>
@@ -70,7 +69,7 @@
     <string name="httpErrorFile">"Impossibile accedere al file."</string>
     <string name="httpErrorFileNotFound">"Impossibile trovare il file richiesto."</string>
     <string name="httpErrorTooManyRequests">"Troppe richieste in fase di elaborazione. Riprova più tardi."</string>
-    <string name="contentServiceSync">"Sincronizzazione"</string>
+    <string name="contentServiceSync">"Sinc"</string>
     <string name="contentServiceSyncNotificationTitle">"Sincronizzazione"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc">"Troppe eliminazioni di <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
     <string name="low_memory">"Spazio di archiviazione del telefono esaurito. Elimina alcuni file per liberare spazio."</string>
     <string name="permdesc_injectEvents">"Consente a un\'applicazione di offrire i suoi eventi di input (pressioni di tasti etc.) ad altre applicazioni. Le applicazioni dannose possono sfruttare questa possibilità per assumere il controllo del telefono."</string>
     <string name="permlab_readInputState">"registrare il testo digitato e le azioni effettuate"</string>
     <string name="permdesc_readInputState">"Consente il rilevamento da parte delle applicazioni dei tasti premuti anche durante l\'interazione con un\'altra applicazione (come nel caso di inserimento di una password). Non dovrebbe essere mai necessario per le normali applicazioni."</string>
-    <!-- no translation found for permlab_bindInputMethod (3360064620230515776) -->
-    <skip />
-    <!-- no translation found for permdesc_bindInputMethod (3734838321027317228) -->
-    <skip />
+    <string name="permlab_bindInputMethod">"associare a un metodo di inserimento"</string>
+    <string name="permdesc_bindInputMethod">"Consente l\'associazione all\'interfaccia principale di un metodo di inserimento. Non dovrebbe essere mai necessario per le normali applicazioni."</string>
     <string name="permlab_setOrientation">"cambiare l\'orientamento dello schermo"</string>
     <string name="permdesc_setOrientation">"Consente a un\'applicazione di cambiare la rotazione dello schermo in qualsiasi momento. Non dovrebbe essere mai necessario per le normali applicazioni."</string>
     <string name="permlab_signalPersistentProcesses">"inviare segnali Linux alle applicazioni"</string>
     <string name="permlab_diagnostic">"leggere/scrivere a risorse di proprietà di diag"</string>
     <string name="permdesc_diagnostic">"Consente a un\'applicazione di leggere le risorse del gruppo diag e scrivere a esse, per esempio i file in /dev. Questa capacità potrebbe influire sulla stabilità e sicurezza del sistema. Dovrebbe essere utilizzata SOLTANTO per diagnostiche specifiche dell\'hardware effettuate dal produttore o dall\'operatore."</string>
     <string name="permlab_changeComponentState">"attivare o disattivare componenti delle applicazioni"</string>
-    <!-- no translation found for permdesc_changeComponentState (4569107043246700630) -->
-    <skip />
+    <string name="permdesc_changeComponentState">"Consente a un\'applicazione di attivare o disattivare un componente di un\'altra applicazione. Le applicazioni dannose possono sfruttare questa possibilità per disattivare importanti funzionalità del telefono. Prestare attenzione con questa autorizzazione perché è possibile rendere inutilizzabili, incoerenti o instabili i componenti delle applicazioni."</string>
     <string name="permlab_setPreferredApplications">"impostare le applicazioni preferite"</string>
     <string name="permdesc_setPreferredApplications">"Consente la modifica da parte di un\'applicazione delle applicazioni preferite. Le applicazioni dannose potrebbero essere in grado di modificare automaticamente le applicazioni in esecuzione, effettuando lo spoofing delle applicazioni esistenti per raccogliere dati riservati."</string>
     <string name="permlab_writeSettings">"modificare le impostazioni di sistema globali"</string>
     <string name="permdesc_writeSettings">"Consente la modifica in un\'applicazione dei dati delle impostazioni del sistema. Le applicazioni dannose possono danneggiare la configurazione del sistema."</string>
-    <!-- no translation found for permlab_writeSecureSettings (204676251876718288) -->
-    <skip />
-    <!-- no translation found for permdesc_writeSecureSettings (4116616249170428132) -->
-    <skip />
+    <string name="permlab_writeSecureSettings">"modificare le impostazioni di protezione del sistema"</string>
+    <string name="permdesc_writeSecureSettings">"Consente a un\'applicazione di modificare i dati delle impostazioni di protezione del sistema. Da non usare per normali applicazioni."</string>
     <string name="permlab_writeGservices">"modificare la mappa dei servizi Google"</string>
     <string name="permdesc_writeGservices">"Consente a un\'applicazione di modificare la mappa dei servizi Google. Da non usare per normali applicazioni."</string>
     <string name="permlab_receiveBootCompleted">"aprire automaticamente all\'avvio"</string>
     <string name="permlab_checkinProperties">"accedere a proprietà di archiviazione"</string>
     <string name="permdesc_checkinProperties">"Consente l\'accesso di lettura/scrittura alle proprietà caricate dal servizio di archiviazione. Da non usare per normali applicazioni."</string>
     <string name="permlab_modifyPhoneState">"modificare lo stato del telefono"</string>
-    <string name="permdesc_modifyPhoneState">"Consente all\'applicazione di controllare le funzioni telefoniche del dispositivo. Un\'applicazione con questa autorizzazione può cambiare rete, accendere e spegnere la radio del telefono e così via, il tutto automaticamente."</string>
+    <string name="permdesc_modifyPhoneState">"Consente all\'applicazione di controllare le funzioni telefoniche del dispositivo. Un\'applicazione con questa autorizzazione può cambiare rete, accendere e spegnere il modulo radio del telefono e così via, il tutto automaticamente."</string>
     <string name="permlab_readPhoneState">"leggere lo stato del telefono"</string>
     <string name="permdesc_readPhoneState">"Consente l\'accesso dell\'applicazione alle funzioni telefoniche del dispositivo. Un\'applicazione con questa autorizzazione può determinare il numero del telefono in uso, se una chiamata è attiva o meno, il numero a cui è collegata la chiamata e simili."</string>
     <string name="permlab_wakeLock">"impedire la sospensione del telefono"</string>
     <string name="permdesc_subscribedFeedsRead">"Consente a un\'applicazione di ottenere dettagli sui feed attualmente sincronizzati."</string>
     <string name="permlab_subscribedFeedsWrite">"scrivere feed sottoscritti"</string>
     <string name="permdesc_subscribedFeedsWrite">"Consente la modifica da parte di un\'applicazione dei feed attualmente sincronizzati. Le applicazioni dannose potrebbero essere in grado di modificare i feed sincronizzati."</string>
-    <!-- no translation found for phoneTypes:7 (9192514806975898961) -->
-    <!-- no translation found for emailAddressTypes:3 (2374913952870110618) -->
-    <!-- no translation found for postalAddressTypes:3 (4932682847595299369) -->
-    <!-- no translation found for imAddressTypes:3 (3145118944639869809) -->
-    <!-- no translation found for organizationTypes:2 (3455047468583965104) -->
+  <string-array name="phoneTypes">
+    <item>"Casa"</item>
+    <item>"Cellulare"</item>
+    <item>"Lavoro"</item>
+    <item>"Fax lavoro"</item>
+    <item>"Fax abitazione"</item>
+    <item>"Cercapersone"</item>
+    <item>"Altro"</item>
+    <item>"Personale"</item>
+  </string-array>
+  <string-array name="emailAddressTypes">
+    <item>"Casa"</item>
+    <item>"Lavoro"</item>
+    <item>"Altro"</item>
+    <item>"Personale"</item>
+  </string-array>
+  <string-array name="postalAddressTypes">
+    <item>"Casa"</item>
+    <item>"Lavoro"</item>
+    <item>"Altro"</item>
+    <item>"Personale"</item>
+  </string-array>
+  <string-array name="imAddressTypes">
+    <item>"Casa"</item>
+    <item>"Lavoro"</item>
+    <item>"Altro"</item>
+    <item>"Personale"</item>
+  </string-array>
+  <string-array name="organizationTypes">
+    <item>"Lavoro"</item>
+    <item>"Altro"</item>
+    <item>"Personale"</item>
+  </string-array>
   <string-array name="imProtocols">
     <item>"AIM"</item>
     <item>"Windows Live"</item>
     <item>"ICQ"</item>
     <item>"Jabber"</item>
   </string-array>
-    <!-- no translation found for keyguard_password_enter_pin_code (3731488827218876115) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_code">"Inserisci il PIN"</string>
     <string name="keyguard_password_wrong_pin_code">"Codice PIN errato."</string>
-    <string name="keyguard_label_text">"Per sbloccare, premere Menu, poi 0."</string>
+    <string name="keyguard_label_text">"Per sbloccare, premi Menu, poi 0."</string>
     <string name="emergency_call_dialog_number_for_display">"Numero di emergenza"</string>
     <string name="lockscreen_carrier_default">"(Nessun servizio)"</string>
-    <!-- no translation found for lockscreen_screen_locked (7288443074806832904) -->
-    <skip />
+    <string name="lockscreen_screen_locked">"Schermo bloccato."</string>
     <string name="lockscreen_instructions_when_pattern_enabled">"Premi Menu per sbloccare o effettuare chiamate di emergenza."</string>
     <string name="lockscreen_instructions_when_pattern_disabled">"Premi Menu per sbloccare."</string>
-    <!-- no translation found for lockscreen_pattern_instructions (7478703254964810302) -->
-    <skip />
+    <string name="lockscreen_pattern_instructions">"Traccia la sequenza di sblocco"</string>
     <string name="lockscreen_emergency_call">"Chiamata di emergenza"</string>
     <string name="lockscreen_pattern_correct">"Corretta."</string>
-    <!-- no translation found for lockscreen_pattern_wrong (4817583279053112312) -->
-    <skip />
+    <string name="lockscreen_pattern_wrong">"Riprova"</string>
     <string name="lockscreen_plugged_in">"In carica (<xliff:g id="NUMBER">%d%%</xliff:g>)"</string>
     <string name="lockscreen_low_battery">"Collega il caricabatterie."</string>
     <string name="lockscreen_missing_sim_message_short">"Nessuna SIM presente."</string>
     <string name="lockscreen_too_many_failed_attempts_countdown">"Riprova fra <xliff:g id="NUMBER">%d</xliff:g> secondi."</string>
     <string name="lockscreen_forgot_pattern_button_text">"Hai dimenticato la sequenza?"</string>
     <string name="lockscreen_glogin_too_many_attempts">"Troppi tentativi di inserimento della sequenza."</string>
-    <!-- no translation found for lockscreen_glogin_instructions (7400120254204758548) -->
-    <skip />
+    <string name="lockscreen_glogin_instructions">"Per sbloccare,"\n"accedi tramite il tuo account Google"</string>
     <string name="lockscreen_glogin_username_hint">"Nome utente (email)"</string>
     <string name="lockscreen_glogin_password_hint">"Password"</string>
     <string name="lockscreen_glogin_submit_button">"Accedi"</string>
     <string name="lockscreen_glogin_invalid_input">"Password o nome utente non valido."</string>
     <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
-    <!-- no translation found for hour_minute_ampm (7044207493989843593) -->
-    <skip />
-    <!-- no translation found for hour_minute_cap_ampm (5778825208801303756) -->
-    <skip />
+    <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+    <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <!-- no translation found for hour_ampm (7618670480400517084) -->
     <skip />
     <!-- no translation found for hour_cap_ampm (5117798389811605468) -->
     <skip />
     <!-- no translation found for month (7026169712234774086) -->
     <skip />
-    <string name="month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <string name="month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
     <!-- no translation found for month_year (9219019380312413367) -->
     <skip />
     <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
     <string name="same_year_md1_time1_md2_time2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
     <string name="same_year_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
     <string name="same_year_mdy1_time1_mdy2_time2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
-    <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
     <string name="numeric_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>"</string>
     <string name="numeric_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>"</string>
     <string name="numeric_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>"</string>
     <string name="same_month_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>"</string>
     <string name="same_month_md1_time1_md2_time2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
     <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
-    <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
     <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
     <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string>
     <!-- no translation found for abbrev_month_year (3856424847226891943) -->
     <string name="day_of_week_shortest_sunday">"D"</string>
     <string name="day_of_week_shortest_monday">"Lun"</string>
     <string name="day_of_week_shortest_tuesday">"M"</string>
-    <string name="day_of_week_shortest_wednesday">"Mer"</string>
+    <string name="day_of_week_shortest_wednesday">"Me"</string>
     <string name="day_of_week_shortest_thursday">"G"</string>
     <string name="day_of_week_shortest_friday">"V"</string>
     <string name="day_of_week_shortest_saturday">"Sa"</string>
     <string name="month_medium_december">"Dic"</string>
     <string name="month_shortest_january">"G"</string>
     <string name="month_shortest_february">"F"</string>
-    <string name="month_shortest_march">"Mar"</string>
+    <string name="month_shortest_march">"M"</string>
     <string name="month_shortest_april">"Ap"</string>
     <string name="month_shortest_may">"Mag"</string>
     <string name="month_shortest_june">"Gi"</string>
     <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
     <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
     <string name="selectAll">"Seleziona tutto"</string>
-    <!-- no translation found for selectText (3889149123626888637) -->
-    <skip />
-    <!-- no translation found for stopSelectingText (4157931463872320996) -->
-    <skip />
+    <string name="selectText">"Seleziona testo"</string>
+    <string name="stopSelectingText">"Termina selezione testo"</string>
     <string name="cut">"Taglia"</string>
     <string name="cutAll">"Taglia tutto"</string>
     <string name="copy">"Copia"</string>
     <string name="copyAll">"Copia tutto"</string>
     <string name="paste">"Incolla"</string>
     <string name="copyUrl">"Copia URL"</string>
-    <!-- no translation found for inputMethod (7673923508389094672) -->
-    <skip />
-    <!-- no translation found for editTextMenuTitle (1672989176958581452) -->
-    <skip />
+    <string name="inputMethod">"Metodo inserimento"</string>
+    <string name="editTextMenuTitle">"Modifica testo"</string>
     <string name="low_internal_storage_view_title">"Spazio in esaurimento"</string>
     <string name="low_internal_storage_view_text">"Spazio di archiviazione del telefono in esaurimento."</string>
     <string name="ok">"OK"</string>
     <string name="capital_off">"OFF"</string>
     <string name="whichApplication">"Completa l\'azione con"</string>
     <string name="alwaysUse">"Usa come predefinita per questa azione."</string>
-    <string name="clearDefaultHintMsg">"Cancella predefinita in Impostazioni home &gt; Applicazioni &gt; Gestisci applicazioni."</string>
+    <string name="clearDefaultHintMsg">"Cancella predefinita in Home &gt; Impostazioni &gt; Applicazioni &gt; Gestisci applicazioni."</string>
     <string name="chooseActivity">"Seleziona un\'azione"</string>
     <string name="noApplications">"Nessuna applicazione è in grado di svolgere questa azione."</string>
     <string name="aerr_title">"Spiacenti."</string>
     <string name="debug">"Debug"</string>
     <string name="sendText">"Seleziona un\'azione per il testo"</string>
     <string name="volume_ringtone">"Volume suoneria"</string>
-    <!-- no translation found for volume_music (5421651157138628171) -->
-    <skip />
-    <!-- no translation found for volume_music_hint_playing_through_bluetooth (9165984379394601533) -->
-    <skip />
+    <string name="volume_music">"Volume media"</string>
+    <string name="volume_music_hint_playing_through_bluetooth">"Riproduzione tramite Bluetooth"</string>
     <string name="volume_call">"Volume chiamate"</string>
-    <!-- no translation found for volume_call_hint_playing_through_bluetooth (7750873841563910404) -->
-    <skip />
+    <string name="volume_call_hint_playing_through_bluetooth">"Riproduzione tramite Bluetooth"</string>
     <string name="volume_alarm">"Volume allarme"</string>
-    <!-- no translation found for volume_notification (2422265656744276715) -->
-    <skip />
+    <string name="volume_notification">"Volume notifiche"</string>
     <string name="volume_unknown">"Volume"</string>
     <string name="ringtone_default">"Suoneria predefinita"</string>
     <string name="ringtone_default_with_actual">"Suoneria predefinita (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
     <string name="ringtone_silent">"Silenzioso"</string>
-    <!-- no translation found for ringtone_picker_title (3515143939175119094) -->
-    <skip />
+    <string name="ringtone_picker_title">"Suonerie"</string>
     <string name="ringtone_unknown">"Suoneria sconosciuta"</string>
   <plurals name="wifi_available">
     <item quantity="one">"Rete Wi-Fi disponibile"</item>
     <item quantity="one">"Rete Wi-Fi aperta disponibile"</item>
     <item quantity="other">"Reti Wi-Fi aperte disponibili"</item>
   </plurals>
-    <!-- no translation found for select_character (3365550120617701745) -->
-    <skip />
+    <string name="select_character">"Inserisci carattere"</string>
     <string name="sms_control_default_app_name">"Applicazione sconosciuta"</string>
     <string name="sms_control_title">"Invio SMS"</string>
     <string name="sms_control_message">"È in corso l\'invio di numerosi SMS. Seleziona \"OK\" per continuare, oppure \"Annulla\" per interrompere l\'invio."</string>
     <string name="usb_storage_error_message">"Problema di utilizzo della scheda SD per l\'archiviazione USB."</string>
     <string name="usb_storage_notification_title">"USB collegata"</string>
     <string name="usb_storage_notification_message">"Seleziona per copiare file sul/dal computer in uso."</string>
-    <!-- no translation found for select_input_method (2086499663193509436) -->
-    <skip />
-    <!-- no translation found for fast_scroll_alphabet (5433275485499039199) -->
-    <skip />
-    <!-- no translation found for fast_scroll_numeric_alphabet (4030170524595123610) -->
-    <skip />
-    <!-- no translation found for candidates_style (5248064431114273041) -->
-    <skip />
+    <string name="select_input_method">"Seleziona metodo di inserimento"</string>
+    <string name="fast_scroll_alphabet">"ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="fast_scroll_numeric_alphabet">"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="candidates_style"><font fgcolor="#ff000000" bgcolor="#ff8080ff"><u>"candidati"</u>"u&gt;"</font></string>
 </resources>
index b402c7f..93b66f3 100644 (file)
@@ -8,7 +8,7 @@
     <string name="terabyteShort">"TB"</string>
     <string name="petabyteShort">"PB"</string>
     <string name="untitled">"&lt;無題&gt;"</string>
-    <string name="ellipsis">""</string>
+    <string name="ellipsis">"..."</string>
     <string name="emptyPhoneNumber">"(電話番号なし)"</string>
     <string name="unknownName">"(不明)"</string>
     <string name="defaultVoiceMailAlphaTag">"ボイスメール"</string>
     <string name="badPuk">"入力したPUKは正しくありません。"</string>
     <string name="mismatchPin">"入力したPINが一致しません。"</string>
     <string name="invalidPin">"4~8桁の数字のPINを入力してください。"</string>
-    <!-- no translation found for needPuk (919668385956251611) -->
-    <skip />
+    <string name="needPuk">"SIMカードはPUKでロックされています。ロックを解除するにはPUKコードを入力してください。"</string>
     <string name="needPuk2">"SIMカードのロック解除のためPUK2を入力します。"</string>
     <string name="ClipMmi">"着信時の発信者番号"</string>
     <string name="ClirMmi">"発信時の発信者番号"</string>
     <string name="CfMmi">"電話の転送"</string>
-    <string name="CwMmi">"待機中の着信"</string>
+    <string name="CwMmi">"通話中着信"</string>
     <string name="BaMmi">"発信制限"</string>
     <string name="PwdMmi">"パスワードの変更"</string>
     <string name="PinMmi">"PINの変更"</string>
@@ -82,7 +81,7 @@
     <string name="screen_lock">"画面をロック"</string>
     <string name="power_off">"電源オフ"</string>
     <string name="shutdown_progress">"シャットダウン中..."</string>
-    <string name="shutdown_confirm">"æ\90ºå¸¯é\9b»è©±ã\81¯å\81\9cæ­¢ã\81\95ã\82\8cます。"</string>
+    <string name="shutdown_confirm">"æ\90ºå¸¯é\9b»è©±ã\81®é\9b»æº\90ã\82\92ã\82ªã\83\95ã\81«ã\81\97ます。"</string>
     <string name="no_recent_tasks">"最近使ったアプリケーションはありません。"</string>
     <string name="global_actions">"携帯電話オプション"</string>
     <string name="global_action_lock">"画面をロック"</string>
     <string name="permgrouplab_accounts">"Googleアカウント"</string>
     <string name="permgroupdesc_accounts">"利用可能なGoogleアカウントへのアクセス"</string>
     <string name="permgrouplab_hardwareControls">"ハードウェアの制御"</string>
-    <string name="permgroupdesc_hardwareControls">"ハンドセットのハードウェアへの直接アクセス"</string>
+    <string name="permgroupdesc_hardwareControls">"携帯電話のハードウェアに直接アクセスします。"</string>
     <string name="permgrouplab_phoneCalls">"電話の発信"</string>
     <string name="permgroupdesc_phoneCalls">"通話の監視、記録、処理"</string>
     <string name="permgrouplab_systemTools">"システムツール"</string>
     <string name="permgrouplab_developmentTools">"開発ツール"</string>
     <string name="permgroupdesc_developmentTools">"アプリケーションのデベロッパーにのみ必要な機能です。"</string>
     <string name="permlab_statusBar">"ステータスバーを無効にしたり変更する"</string>
-    <string name="permdesc_statusBar">"ã\82¹ã\83\86ã\83¼ã\82¿ã\82¹ã\83\90ã\83¼ã\82\92ç\84¡å\8a¹ã\81«ã\81\97ã\81\9fã\82\8aã\80\81ã\82·ã\82¹ã\83\86ã\83 ã\82¢ã\82¤ã\82³ã\83³ã\82\92追å\8a ã\82\84å\89\8aé\99¤ã\81\99ã\82\8bã\81\93ã\81¨をアプリケーションに許可します。"</string>
+    <string name="permdesc_statusBar">"ã\82¹ã\83\86ã\83¼ã\82¿ã\82¹ã\83\90ã\83¼ã\81®ç\84¡å\8a¹å\8c\96ã\82\84ã\80\81ã\82·ã\82¹ã\83\86ã\83 ã\82¢ã\82¤ã\82³ã\83³ã\81®è¿½å\8a ã\82\84å\89\8aé\99¤をアプリケーションに許可します。"</string>
     <string name="permlab_expandStatusBar">"ステータスバーの拡大/縮小"</string>
     <string name="permdesc_expandStatusBar">"ステータスバーの拡大や縮小をアプリケーションに許可します。"</string>
     <string name="permlab_processOutgoingCalls">"発信の傍受"</string>
     <string name="permlab_receiveWapPush">"WAPの受信"</string>
     <string name="permdesc_receiveWapPush">"WAPメッセージの受信と処理をアプリケーションに許可します。悪意のあるアプリケーションがメッセージを監視したり、表示せずに削除する恐れがあります。"</string>
     <string name="permlab_getTasks">"実行中のアプリケーションの取得"</string>
-    <string name="permdesc_getTasks">"ç\8f¾å\9c¨å®\9fè¡\8c中ã\81¾ã\81\9fã\81¯æ\9c\80è¿\91å®\9fè¡\8cã\81\97ã\81\9fã\82¿ã\82¹ã\82¯ã\81«é\96¢ã\81\99ã\82\8bæ\83\85å ±ã\81®å\8f\96å¾\97ã\82\92ã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³ã\81«è¨±å\8f¯ã\81\97ã\81¾ã\81\99ã\80\82æ\82ªæ\84\8fã\81®ã\81\82ã\82\8bã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³ã\81\8cä»\96ã\81®ã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³ã\81\8bã\82\89非公開情報を取得する恐れがあります。"</string>
+    <string name="permdesc_getTasks">"ç\8f¾å\9c¨å®\9fè¡\8c中ã\81¾ã\81\9fã\81¯æ\9c\80è¿\91å®\9fè¡\8cã\81\97ã\81\9fã\82¿ã\82¹ã\82¯ã\81«é\96¢ã\81\99ã\82\8bæ\83\85å ±ã\81®å\8f\96å¾\97ã\82\92ã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³ã\81«è¨±å\8f¯ã\81\97ã\81¾ã\81\99ã\80\82æ\82ªæ\84\8fã\81®ã\81\82ã\82\8bã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³ã\81\8cä»\96ã\81®ã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³ã\81®非公開情報を取得する恐れがあります。"</string>
     <string name="permlab_reorderTasks">"実行中のアプリケーションの順序の変更"</string>
     <string name="permdesc_reorderTasks">"タスクをフォアグラウンドやバックグラウンドに移動することをアプリケーションに許可します。悪意のあるアプリケーションが優先されて、コントロールできなくなる恐れがあります。"</string>
     <string name="permlab_setDebugApp">"アプリケーションのデバッグを有効にする"</string>
     <string name="permlab_restartPackages">"他のアプリケーションの再起動"</string>
     <string name="permdesc_restartPackages">"他のアプリケーションの強制的な再起動をアプリケーションに許可します。"</string>
     <string name="permlab_setProcessForeground">"停止の阻止"</string>
-    <string name="permdesc_setProcessForeground">"フォアグラウンドでプロセスを実行して、終了できないようにすることをアプリケーションに許可します。通常のアプリケーションではまったく必要ありません。"</string>
+    <string name="permdesc_setProcessForeground">"フォアグラウンドでプロセスを実行して、強制終了できないようにすることをアプリケーションに許可します。通常のアプリケーションではまったく必要ありません。"</string>
     <string name="permlab_forceBack">"アプリケーションの強制終了"</string>
     <string name="permdesc_forceBack">"フォアグラウンドで実行されている操作を強制終了して戻ることをアプリケーションに許可します。通常のアプリケーションではまったく必要ありません。"</string>
     <string name="permlab_dump">"システムの内部状態の取得"</string>
     <string name="permdesc_addSystemService">"独自の低レベルのシステムサービスを公開することをアプリケーションに許可します。悪意のあるアプリケーションがシステムを乗っ取って、データの盗用や破壊をする恐れがあります。"</string>
     <string name="permlab_runSetActivityWatcher">"起動中のすべてのアプリケーションの監視と制御"</string>
     <string name="permdesc_runSetActivityWatcher">"システムが起動する操作の監視と制御をアプリケーションに許可します。悪意のあるアプリケーションがシステムを完全に破壊する恐れがあります。この許可は開発にのみ必要で、携帯電話の通常の使用にはまったく必要ありません。"</string>
-    <string name="permlab_broadcastPackageRemoved">"パッケージが削除されたブロードキャストの配信"</string>
-    <string name="permdesc_broadcastPackageRemoved">"アプリケーションパッケージの削除通知を配信することをアプリケーションに許可します。これにより悪意のあるアプリケーションが、他の実行中のアプリケーションを強制終了する恐れがあります。"</string>
-    <string name="permlab_broadcastSmsReceived">"SMSå\8f\97ä¿¡ã\83\96ã\83­ã\83¼ã\83\89ã\82­ã\83£ã\82¹ã\83\88ã\81®é\85\8d信"</string>
+    <string name="permlab_broadcastPackageRemoved">"パッケージ削除ブロードキャストの送信"</string>
+    <string name="permdesc_broadcastPackageRemoved">"アプリケーションパッケージの削除通知を配信することをアプリケーションに許可します。これにより悪意のあるアプリケーションが、他の実行中のアプリケーションを強制終了する恐れがあります。"</string>
+    <string name="permlab_broadcastSmsReceived">"SMSå\8f\97ä¿¡ã\83\96ã\83­ã\83¼ã\83\89ã\82­ã\83£ã\82¹ã\83\88ã\81®é\80\81信"</string>
     <string name="permdesc_broadcastSmsReceived">"SMSメッセージの受信通知の配信をアプリケーションに許可します。これにより悪意のあるアプリケーションが、受信SMSメッセージを偽造する恐れがあります。"</string>
-    <string name="permlab_broadcastWapPush">"WAP-PUSHå\8f\97ä¿¡ã\83\96ã\83­ã\83¼ã\83\89ã\82­ã\83£ã\82¹ã\83\88ã\81®é\85\8d信"</string>
-    <string name="permdesc_broadcastWapPush">"WAP PUSHメッセージの受信の通知を配信することをアプリケーションに許可します。これにより悪意のあるアプリケーションが、MMS受信メッセージを偽造したり、ウェブページのコンテンツを密かに改ざんする恐れがあります。"</string>
+    <string name="permlab_broadcastWapPush">"WAP-PUSHå\8f\97ä¿¡ã\83\96ã\83­ã\83¼ã\83\89ã\82­ã\83£ã\82¹ã\83\88ã\81®é\80\81信"</string>
+    <string name="permdesc_broadcastWapPush">"WAP PUSHメッセージの受信通知を配信することをアプリケーションに許可します。これにより悪意のあるアプリケーションが、MMS受信メッセージを偽造したり、ウェブページのコンテンツを密かに改ざんしたりする恐れがあります。"</string>
     <string name="permlab_setProcessLimit">"実行中のプロセスの数を制限"</string>
     <string name="permdesc_setProcessLimit">"実行するプロセス数の上限の制御をアプリケーションに許可します。通常のアプリケーションにはまったく必要ありません。"</string>
-    <string name="permlab_setAlwaysFinish">"バックグラウンドアプリケーションをすべて閉じる"</string>
+    <string name="permlab_setAlwaysFinish">"バックグラウンドアプリケーションをすべて終了する"</string>
     <string name="permdesc_setAlwaysFinish">"バックグラウンドになり次第必ず操作を終了させるかどうかの制御をアプリケーションに許可します。通常のアプリケーションではまったく必要ありません。"</string>
     <string name="permlab_fotaUpdate">"システムアップデートの自動インストール"</string>
     <string name="permdesc_fotaUpdate">"保留中のシステムアップデートに関する通知を受信してインストールを開始することをアプリケーションに許可します。これにより悪意のあるアプリケーションが、許可なく更新を行ってシステムを破壊したり、更新処理を妨害する恐れがあります。"</string>
-    <string name="permlab_batteryStats">"バッテリ統計の変更"</string>
+    <string name="permlab_batteryStats">"バッテリ統計の変更"</string>
     <string name="permdesc_batteryStats">"収集されたバッテリの統計の変更を許可します。通常のアプリケーションでは使用しません。"</string>
     <string name="permlab_internalSystemWindow">"未許可のウィンドウの表示"</string>
     <string name="permdesc_internalSystemWindow">"内部システムのユーザーインターフェースで使用するためのウィンドウ作成を許可します。通常のアプリケーションでは使用しません。"</string>
     <string name="permdesc_injectEvents">"入力イベント (キーを押すなど) を別のアプリケーションに伝えることをアプリケーションに許可します。これにより悪意のあるアプリケーションが、携帯電話を乗っ取る恐れがあります。"</string>
     <string name="permlab_readInputState">"入力や操作の記録"</string>
     <string name="permdesc_readInputState">"別のアプリケーションへの入力 (パスワードなど) でもキー入力を監視することをアプリケーションに許可します。通常のアプリケーションではまったく必要ありません。"</string>
-    <!-- no translation found for permlab_bindInputMethod (3360064620230515776) -->
-    <skip />
-    <!-- no translation found for permdesc_bindInputMethod (3734838321027317228) -->
-    <skip />
+    <string name="permlab_bindInputMethod">"入力方法に関連付ける"</string>
+    <string name="permdesc_bindInputMethod">"入力方法のトップレベルインターフェースに関連付けることを所有者に許可します。通常のアプリケーションにはまったく必要ありません。"</string>
     <string name="permlab_setOrientation">"画面の向きの変更"</string>
     <string name="permdesc_setOrientation">"いつでも画面の回転を変更することをアプリケーションに許可します。通常のアプリケーションにはまったく必要ありません。"</string>
     <string name="permlab_signalPersistentProcesses">"Linuxのシグナルをアプリケーションに送信"</string>
-    <string name="permdesc_signalPersistentProcesses">"ã\81\99ã\81¹ã\81¦ã\81®æ°¸ç¶\9aã\83\97ã\83­ã\82»ã\82¹ã\81¸ã\81®æ\8c\87å®\9aã\81®ä¿¡å\8f·ã\81®é\80\81ä¿¡è¦\81æ±\82をアプリケーションに許可します。"</string>
+    <string name="permdesc_signalPersistentProcesses">"ã\81\99ã\81¹ã\81¦ã\81®æ°¸ç¶\9aã\83\97ã\83­ã\82»ã\82¹ã\81«ç\89¹å®\9aã\81®ä¿¡å\8f·ã\82\92é\80\81ä¿¡ã\81\99ã\82\8bã\83ªã\82¯ã\82¨ã\82¹ã\83\88をアプリケーションに許可します。"</string>
     <string name="permlab_persistentActivity">"アプリケーションを常に実行する"</string>
     <string name="permdesc_persistentActivity">"自身を部分的に永続させて、他のアプリケーション用にはその領域をシステムに使わせないようにすることをアプリケーションに許可します。"</string>
     <string name="permlab_deletePackages">"アプリケーションの削除"</string>
     <string name="permlab_readLogs">"システムログファイルの読み取り"</string>
     <string name="permdesc_readLogs">"システムのさまざまなログファイルの読み取りをアプリケーションに許可します。これにより携帯電話の使用状況に関する全般情報が取得されますが、個人情報や非公開情報が含まれることはありません。"</string>
     <string name="permlab_diagnostic">"diagが所有するリソースの読み書き"</string>
-    <string name="permdesc_diagnostic">"diagグループが所有するリソース (例、/dev内のファイル) への読み書きをアプリケーションに許可します。これはシステムの安定性とセキュリティに影響する恐れがあります。メーカーまたはオペレータによるハードウェア固有の診断以外には使用しないでください。"</string>
+    <string name="permdesc_diagnostic">"diagグループが所有するリソース (/dev内のファイルなど) への読み書きをアプリケーションに許可します。これはシステムの安定性とセキュリティに影響する恐れがあります。メーカーまたはオペレータによるハードウェア固有の診断以外には使用しないでください。"</string>
     <string name="permlab_changeComponentState">"アプリケーションのコンポーネントを有効/無効にする"</string>
-    <!-- no translation found for permdesc_changeComponentState (4569107043246700630) -->
-    <skip />
+    <string name="permdesc_changeComponentState">"別アプリケーションのコンポーネントの有効/無効を変更することをアプリケーションに許可します。これにより悪意のあるアプリケーションが、携帯電話の重要な機能を無効にする恐れがあります。アプリケーションコンポーネントが利用できない、整合性が取れない、または不安定な状態になる恐れがあるので、許可には注意が必要です。"</string>
     <string name="permlab_setPreferredApplications">"優先アプリケーションの設定"</string>
     <string name="permdesc_setPreferredApplications">"優先アプリケーションを変更することをアプリケーションに許可します。これにより悪意のあるアプリケーションが、実行中のアプリケーションを密かに変更し、既存のアプリケーションになりすまして、非公開データを収集する恐れがあります。"</string>
     <string name="permlab_writeSettings">"システム全般の設定の変更"</string>
     <string name="permdesc_writeSettings">"システム設定データの変更をアプリケーションに許可します。悪意のあるアプリケーションがシステム設定を破壊する恐れがあります。"</string>
-    <!-- no translation found for permlab_writeSecureSettings (204676251876718288) -->
-    <skip />
-    <!-- no translation found for permdesc_writeSecureSettings (4116616249170428132) -->
-    <skip />
+    <string name="permlab_writeSecureSettings">"システムのセキュリティ設定の変更"</string>
+    <string name="permdesc_writeSecureSettings">"システムのセキュリティ設定の変更をアプリケーションに許可します。通常のアプリケーションでは使用しません。"</string>
     <string name="permlab_writeGservices">"Googleサービスの地図の変更"</string>
     <string name="permdesc_writeGservices">"Googleサービスマップの変更をアプリケーションに許可します。通常のアプリケーションでは使用しません。"</string>
     <string name="permlab_receiveBootCompleted">"起動時に自動的に開始"</string>
-    <string name="permdesc_receiveBootCompleted">"システムの起動後に、自動的に起動することをアプリケーションに許可します。これにより携帯電話の起動に時間がかかるようになり、アプリケーションが常に実行されるために携帯電話の全体的な動作が遅くなります。"</string>
+    <string name="permdesc_receiveBootCompleted">"システムの起動直後に自動的に起動することをアプリケーションに許可します。これにより携帯電話の起動に時間がかかるようになります。また、アプリケーションが常に実行中となるため、携帯電話の全体的な動作が遅くなります。"</string>
     <string name="permlab_broadcastSticky">"stickyブロードキャストの配信"</string>
     <string name="permdesc_broadcastSticky">"配信が終了してもメモリに残るようなstickyブロードキャストをアプリケーションに許可します。悪意のあるアプリケーションがメモリを使いすぎて、携帯電話の動作が遅くなったり、不安定になる恐れがあります。"</string>
     <string name="permlab_readContacts">"連絡先データの読み取り"</string>
     <string name="permlab_writeContacts">"連絡先データの書き込み"</string>
     <string name="permdesc_writeContacts">"携帯電話に保存した連絡先 (アドレス) データの変更をアプリケーションに許可します。これにより悪意のあるアプリケーションが、連絡先データを消去や変更する恐れがあります。"</string>
     <string name="permlab_writeOwnerData">"所有者データの書き込み"</string>
-    <string name="permdesc_writeOwnerData">"æ\90ºå¸¯é\9b»è©±ã\81«ä¿\9då­\98ã\81\97ã\81\9fæ\89\80æ\9c\89è\80\85ã\81®ã\83\87ã\83¼ã\82¿ã\81®å¤\89æ\9b´ã\82\92ã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³ã\81«è¨±å\8f¯ã\81\97ã\81¾ã\81\99ã\80\82ã\81\93ã\82\8cã\81«ã\82\88ã\82\8aæ\82ªæ\84\8fã\81®ã\81\82ã\82\8bã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³ã\81\8cã\80\81æ\89\80æ\9c\89è\80\85ã\81®ã\83\87ã\83¼ã\82¿ã\82\92æ¶\88å\8e»ã\82\84変更する恐れがあります。"</string>
+    <string name="permdesc_writeOwnerData">"æ\90ºå¸¯é\9b»è©±ã\81«ä¿\9då­\98ã\81\97ã\81\9fæ\89\80æ\9c\89è\80\85ã\81®ã\83\87ã\83¼ã\82¿ã\81®å¤\89æ\9b´ã\82\92ã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³ã\81«è¨±å\8f¯ã\81\97ã\81¾ã\81\99ã\80\82ã\81\93ã\82\8cã\81«ã\82\88ã\82\8aæ\82ªæ\84\8fã\81®ã\81\82ã\82\8bã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³ã\81\8cã\80\81æ\89\80æ\9c\89è\80\85ã\81®ã\83\87ã\83¼ã\82¿ã\82\92æ¶\88å\8e»ã\81¾ã\81\9fã\81¯変更する恐れがあります。"</string>
     <string name="permlab_readOwnerData">"所有者データの読み取り"</string>
     <string name="permdesc_readOwnerData">"携帯電話に保存した所有者データの読み取りをアプリケーションに許可します。これにより悪意のあるアプリケーションが、所有者データを読み取る恐れがあります。"</string>
     <string name="permlab_readCalendar">"カレンダーデータの読み取り"</string>
     <string name="permlab_accessLocationExtraCommands">"位置情報プロバイダのその他のコマンドへのアクセス"</string>
     <string name="permdesc_accessLocationExtraCommands">"位置情報プロバイダのその他のコマンドにアクセスします。これにより悪意のあるアプリケーションが、GPSなどの位置情報源の動作を妨害する恐れがあります。"</string>
     <string name="permlab_accessFineLocation">"正確な (GPS) 位置"</string>
-    <string name="permdesc_accessFineLocation">"GPSã\81ªã\81©ã\80\81æ\90ºå¸¯é\9b»è©±ã\81®æ­£ç¢ºã\81ªä½\8dç½®æ\83\85å ±æº\90ã\81«ã\80\81å\8f¯è\83½ã\81ªå ´å\90\88ã\82¢ã\82¯ã\82»ã\82¹ã\81\97ã\81¾ã\81\99ã\80\82ã\81\93ã\82\8cã\81«ã\82\88ã\82\8aæ\82ªæ\84\8fã\81®ã\81\82ã\82\8bã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³ã\81\8cã\80\81ã\83¦ã\83¼ã\82¶ã\83¼ã\81®ç\8f¾å\9c¨å\9c°ã\82\92ç\89¹å®\9aã\81\97ã\81\9fã\82\8aã\80\81ã\83\90ã\83\83ã\83\86ã\83ªã\81®æ¶\88è²»ã\81\8cå¢\97ã\81\88る恐れがあります。"</string>
+    <string name="permdesc_accessFineLocation">"GPSã\81ªã\81©ã\80\81æ\90ºå¸¯é\9b»è©±ã\81®æ­£ç¢ºã\81ªä½\8dç½®æ\83\85å ±æº\90ã\81«ã\80\81å\8f¯è\83½ã\81ªå ´å\90\88ã\82¢ã\82¯ã\82»ã\82¹ã\81\97ã\81¾ã\81\99ã\80\82ã\81\93ã\82\8cã\81«ã\82\88ã\82\8aæ\82ªæ\84\8fã\81®ã\81\82ã\82\8bã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³ã\81\8cã\80\81ã\83¦ã\83¼ã\82¶ã\83¼ã\81®ç\8f¾å\9c¨å\9c°ã\82\92ç\89¹å®\9aã\81\97ã\81\9fã\82\8aã\80\81ã\83\90ã\83\83ã\83\86ã\83ªã\81®æ¶\88è²»ã\82\92å¢\97ã\82\84ã\81\97ã\81\9fã\82\8aã\81\99る恐れがあります。"</string>
     <string name="permlab_accessCoarseLocation">"おおよその (ネットワーク情報による) 位置"</string>
     <string name="permdesc_accessCoarseLocation">"セルラーネットワークデータベースなど、携帯電話のおおよその位置を特定する情報源が利用可能な場合にアクセスします。これにより悪意のあるアプリケーションが、ユーザーのおおよその位置を特定できる恐れがあります。"</string>
     <string name="permlab_accessSurfaceFlinger">"SurfaceFlingerへのアクセス"</string>
     <string name="permdesc_subscribedFeedsRead">"現在同期しているフィードの詳細の取得をアプリケーションに許可します。"</string>
     <string name="permlab_subscribedFeedsWrite">"登録したフィードの書き込み"</string>
     <string name="permdesc_subscribedFeedsWrite">"現在同期しているフィードの変更をアプリケーションに許可します。悪意のあるアプリケーションが同期フィードを変更する恐れがあります。"</string>
-    <!-- no translation found for phoneTypes:7 (9192514806975898961) -->
-    <!-- no translation found for emailAddressTypes:3 (2374913952870110618) -->
-    <!-- no translation found for postalAddressTypes:3 (4932682847595299369) -->
-    <!-- no translation found for imAddressTypes:3 (3145118944639869809) -->
-    <!-- no translation found for organizationTypes:2 (3455047468583965104) -->
+  <string-array name="phoneTypes">
+    <item>"自宅"</item>
+    <item>"携帯"</item>
+    <item>"勤務先"</item>
+    <item>"勤務先FAX"</item>
+    <item>"自宅FAX"</item>
+    <item>"ポケベル"</item>
+    <item>"その他"</item>
+    <item>"カスタム"</item>
+  </string-array>
+  <string-array name="emailAddressTypes">
+    <item>"自宅"</item>
+    <item>"勤務先"</item>
+    <item>"その他"</item>
+    <item>"カスタム"</item>
+  </string-array>
+  <string-array name="postalAddressTypes">
+    <item>"自宅"</item>
+    <item>"勤務先"</item>
+    <item>"その他"</item>
+    <item>"カスタム"</item>
+  </string-array>
+  <string-array name="imAddressTypes">
+    <item>"自宅"</item>
+    <item>"勤務先"</item>
+    <item>"その他"</item>
+    <item>"カスタム"</item>
+  </string-array>
+  <string-array name="organizationTypes">
+    <item>"勤務先"</item>
+    <item>"その他"</item>
+    <item>"カスタム"</item>
+  </string-array>
   <string-array name="imProtocols">
     <item>"AIM"</item>
     <item>"Windows Live"</item>
     <item>"ICQ"</item>
     <item>"Jabber"</item>
   </string-array>
-    <!-- no translation found for keyguard_password_enter_pin_code (3731488827218876115) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_code">"PINコードを入力"</string>
     <string name="keyguard_password_wrong_pin_code">"PINコードが正しくありません。"</string>
     <string name="keyguard_label_text">"ロックを解除するには、Menu、0キーの順に押します。"</string>
     <string name="emergency_call_dialog_number_for_display">"緊急電話番号"</string>
     <string name="lockscreen_carrier_default">"(サービスなし)"</string>
-    <!-- no translation found for lockscreen_screen_locked (7288443074806832904) -->
-    <skip />
+    <string name="lockscreen_screen_locked">"画面がロックされています。"</string>
     <string name="lockscreen_instructions_when_pattern_enabled">"Menuキーを押してロックを解除するか、緊急電話をかけます。"</string>
     <string name="lockscreen_instructions_when_pattern_disabled">"ロックを解除するにはMenuキーを押します。"</string>
-    <!-- no translation found for lockscreen_pattern_instructions (7478703254964810302) -->
-    <skip />
+    <string name="lockscreen_pattern_instructions">"ロックを解除するパターンを入力"</string>
     <string name="lockscreen_emergency_call">"緊急電話"</string>
     <string name="lockscreen_pattern_correct">"一致しました"</string>
-    <!-- no translation found for lockscreen_pattern_wrong (4817583279053112312) -->
-    <skip />
+    <string name="lockscreen_pattern_wrong">"もう一度試してください"</string>
     <string name="lockscreen_plugged_in">"充電中 (<xliff:g id="NUMBER">%d%%</xliff:g>)"</string>
     <string name="lockscreen_low_battery">"充電してください。"</string>
     <string name="lockscreen_missing_sim_message_short">"SIMカードがありません。"</string>
     <string name="lockscreen_too_many_failed_attempts_countdown">"<xliff:g id="NUMBER">%d</xliff:g>秒後にもう一度試してください。"</string>
     <string name="lockscreen_forgot_pattern_button_text">"パターンを忘れた場合"</string>
     <string name="lockscreen_glogin_too_many_attempts">"パターンの指定回数が多すぎる"</string>
-    <!-- no translation found for lockscreen_glogin_instructions (7400120254204758548) -->
-    <skip />
+    <string name="lockscreen_glogin_instructions">"ロックを解除するには、"\n"Googleアカウントでログインしてください。"</string>
     <string name="lockscreen_glogin_username_hint">"ユーザー名 (メール)"</string>
     <string name="lockscreen_glogin_password_hint">"パスワード"</string>
     <string name="lockscreen_glogin_submit_button">"ログイン"</string>
     <string name="lockscreen_glogin_invalid_input">"ユーザー名またはパスワードが正しくありません。"</string>
     <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
-    <!-- no translation found for hour_minute_ampm (7044207493989843593) -->
-    <skip />
-    <!-- no translation found for hour_minute_cap_ampm (5778825208801303756) -->
-    <skip />
+    <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+    <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <!-- no translation found for hour_ampm (7618670480400517084) -->
     <skip />
     <!-- no translation found for hour_cap_ampm (5117798389811605468) -->
     <string name="menu_space_shortcut_label">"Space"</string>
     <string name="menu_enter_shortcut_label">"Enter"</string>
     <string name="menu_delete_shortcut_label">"Del"</string>
-    <string name="search_go">"Search"</string>
+    <string name="search_go">"検索"</string>
     <string name="today">"今日"</string>
     <string name="yesterday">"昨日"</string>
     <string name="tomorrow">"明日"</string>
     <item quantity="one">"明日"</item>
     <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g>日後"</item>
   </plurals>
+    <!-- no translation found for abbrev_num_seconds_ago:one (1849036840200069118) -->
+    <!-- no translation found for abbrev_num_seconds_ago:other (3699169366650930415) -->
+    <!-- no translation found for abbrev_num_minutes_ago:one (6361490147113871545) -->
+    <!-- no translation found for abbrev_num_minutes_ago:other (851164968597150710) -->
+    <!-- no translation found for abbrev_num_hours_ago:one (4796212039724722116) -->
+    <!-- no translation found for abbrev_num_hours_ago:other (6889970745748538901) -->
+    <!-- no translation found for abbrev_num_days_ago:one (8463161711492680309) -->
+    <!-- no translation found for abbrev_num_days_ago:other (3453342639616481191) -->
+    <!-- no translation found for abbrev_in_num_seconds:one (5842225370795066299) -->
+    <!-- no translation found for abbrev_in_num_seconds:other (5495880108825805108) -->
+    <!-- no translation found for abbrev_in_num_minutes:one (562786149928284878) -->
+    <!-- no translation found for abbrev_in_num_minutes:other (4216113292706568726) -->
+    <!-- no translation found for abbrev_in_num_hours:one (3274708118124045246) -->
+    <!-- no translation found for abbrev_in_num_hours:other (3705373766798013406) -->
+    <!-- no translation found for abbrev_in_num_days:one (2178576254385739855) -->
+    <!-- no translation found for abbrev_in_num_days:other (2973062968038355991) -->
     <string name="preposition_for_date">"%s"</string>
     <string name="preposition_for_time">"%s"</string>
     <string name="preposition_for_year">"%s年"</string>
     <string name="VideoView_error_button">"OK"</string>
     <string name="am">"AM"</string>
     <string name="pm">"PM"</string>
-    <string name="numeric_date">"<xliff:g id="YEAR">%Y</xliff:g>/<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="MONTH">%m</xliff:g>"</string>
+    <string name="numeric_date">"<xliff:g id="YEAR">%Y</xliff:g>/<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="DAY">%d</xliff:g>"</string>
     <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g> (<xliff:g id="WEEKDAY1">%1$s</xliff:g>) <xliff:g id="TIME1">%3$s</xliff:g>~<xliff:g id="DATE2">%5$s</xliff:g> (<xliff:g id="WEEKDAY2">%4$s</xliff:g>) <xliff:g id="TIME2">%6$s</xliff:g>"</string>
     <string name="wday1_date1_wday2_date2">"<xliff:g id="DATE1">%2$s</xliff:g> (<xliff:g id="WEEKDAY1">%1$s</xliff:g>)~<xliff:g id="DATE2">%5$s</xliff:g> (<xliff:g id="WEEKDAY2">%4$s</xliff:g>)"</string>
     <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g> <xliff:g id="TIME1">%3$s</xliff:g>~<xliff:g id="DATE2">%5$s</xliff:g> <xliff:g id="TIME2">%6$s</xliff:g>"</string>
     <string name="time1_time2">"<xliff:g id="TIME1">%1$s</xliff:g>~<xliff:g id="TIME2">%2$s</xliff:g>"</string>
     <string name="time_wday_date">"<xliff:g id="DATE">%3$s</xliff:g> (<xliff:g id="WEEKDAY">%2$s</xliff:g>) <xliff:g id="TIME_RANGE">%1$s</xliff:g>"</string>
     <string name="wday_date">"<xliff:g id="DATE">%3$s</xliff:g> (<xliff:g id="WEEKDAY">%2$s</xliff:g>)"</string>
-    <string name="time_date">"<xliff:g id="DATE">%3$s</xliff:g> <xliff:g id="TIME_RANGE">%1$s</xliff:g>"</string>
-    <string name="time_wday">"<xliff:g id="WEEKDAY">%2$s</xliff:g> <xliff:g id="TIME_RANGE">%1$s</xliff:g>"</string>
+    <string name="time_date">"<xliff:g id="DATE">%3$s</xliff:g>、<xliff:g id="TIME_RANGE">%1$s</xliff:g>"</string>
+    <!-- no translation found for date_time (6104442718633642836) -->
+    <skip />
+    <!-- no translation found for relative_time (1818557177829411417) -->
+    <skip />
+    <string name="time_wday">"<xliff:g id="WEEKDAY">%2$s</xliff:g>、<xliff:g id="TIME_RANGE">%1$s</xliff:g>"</string>
     <string name="full_date_month_first">"<xliff:g id="YEAR">yyyy</xliff:g>\'年\'<xliff:g id="MONTH">MMMM</xliff:g><xliff:g id="DAY">dd</xliff:g>\'日\'"</string>
     <string name="full_date_day_first">"<xliff:g id="YEAR">yyyy</xliff:g>\'年\'<xliff:g id="MONTH">MMMM</xliff:g><xliff:g id="DAY">dd</xliff:g>\'日\'"</string>
     <string name="medium_date_month_first">"<xliff:g id="YEAR">yyyy</xliff:g>\'年\'<xliff:g id="MONTH">MMM</xliff:g><xliff:g id="DAY">dd</xliff:g>\'日\'"</string>
     <string name="day_of_week_shortest_monday">"月"</string>
     <string name="day_of_week_shortest_tuesday">"火"</string>
     <string name="day_of_week_shortest_wednesday">"水"</string>
-    <string name="day_of_week_shortest_thursday">""</string>
+    <string name="day_of_week_shortest_thursday">""</string>
     <string name="day_of_week_shortest_friday">"金"</string>
     <string name="day_of_week_shortest_saturday">"土"</string>
     <string name="month_long_january">"1月"</string>
     <string name="month_medium_december">"12月"</string>
     <string name="month_shortest_january">"1"</string>
     <string name="month_shortest_february">"2"</string>
-    <string name="month_shortest_march">"3"</string>
+    <string name="month_shortest_march">""</string>
     <string name="month_shortest_april">"4"</string>
     <string name="month_shortest_may">"5"</string>
     <string name="month_shortest_june">"6"</string>
     <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
     <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
     <string name="selectAll">"すべて選択"</string>
+    <string name="selectText">"テキストを選択"</string>
+    <string name="stopSelectingText">"テキストの選択を終了"</string>
     <string name="cut">"切り取り"</string>
     <string name="cutAll">"すべて切り取り"</string>
     <string name="copy">"コピー"</string>
     <string name="copyAll">"すべてコピー"</string>
     <string name="paste">"貼り付け"</string>
     <string name="copyUrl">"URLをコピー"</string>
-    <!-- no translation found for inputMethod (7673923508389094672) -->
-    <skip />
-    <!-- no translation found for editTextMenuTitle (1672989176958581452) -->
-    <skip />
+    <string name="inputMethod">"入力方法"</string>
+    <string name="editTextMenuTitle">"テキストを編集"</string>
     <string name="low_internal_storage_view_title">"空き容量低下"</string>
     <string name="low_internal_storage_view_text">"携帯電話の空き容量が少なくなっています。"</string>
     <string name="ok">"OK"</string>
     <string name="alwaysUse">"この操作にデフォルトで使用します。"</string>
     <string name="clearDefaultHintMsg">"ホームの[設定]&gt;[アプリケーション]&gt;[アプリケーションを管理]で、デフォルトをクリアします。"</string>
     <string name="chooseActivity">"操作の選択"</string>
-    <string name="noApplications">"ã\81\93ã\81®æ\93\8dä½\9cã\82\92å®\9fè¡\8cã\81\99るアプリケーションはありません。"</string>
+    <string name="noApplications">"ã\81\93ã\81®æ\93\8dä½\9cã\82\92å®\9fè¡\8cã\81§ã\81\8dるアプリケーションはありません。"</string>
     <string name="aerr_title">"エラー"</string>
     <string name="aerr_application">"アプリケーション<xliff:g id="APPLICATION">%1$s</xliff:g> (<xliff:g id="PROCESS">%2$s</xliff:g>プロセス) が予期せず停止しました。もう一度試してください。"</string>
     <string name="aerr_process">"<xliff:g id="PROCESS">%1$s</xliff:g>プロセスが予期せず停止しました。もう一度試してください。"</string>
     <string name="debug">"デバッグ"</string>
     <string name="sendText">"テキストの操作の選択"</string>
     <string name="volume_ringtone">"着信音の音量"</string>
-    <!-- no translation found for volume_music (5421651157138628171) -->
-    <skip />
-    <!-- no translation found for volume_music_hint_playing_through_bluetooth (9165984379394601533) -->
-    <skip />
+    <string name="volume_music">"メディアの音量"</string>
+    <string name="volume_music_hint_playing_through_bluetooth">"Bluetooth経由で再生中です"</string>
     <string name="volume_call">"着信音の音量"</string>
-    <!-- no translation found for volume_call_hint_playing_through_bluetooth (7750873841563910404) -->
-    <skip />
+    <string name="volume_call_hint_playing_through_bluetooth">"Bluetooth経由で再生中です"</string>
     <string name="volume_alarm">"アラームの音量"</string>
-    <!-- no translation found for volume_notification (2422265656744276715) -->
-    <skip />
+    <string name="volume_notification">"通知音の音量"</string>
     <string name="volume_unknown">"音量"</string>
     <string name="ringtone_default">"デフォルトの着信音"</string>
     <string name="ringtone_default_with_actual">"デフォルトの着信音 (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
     <string name="ringtone_silent">"無音"</string>
-    <!-- no translation found for ringtone_picker_title (3515143939175119094) -->
-    <skip />
-    <string name="ringtone_unknown">"不明の着信音"</string>
+    <string name="ringtone_picker_title">"着信音"</string>
+    <string name="ringtone_unknown">"不明時着信音"</string>
   <plurals name="wifi_available">
     <item quantity="one">"Wi-Fiネットワークが利用可能"</item>
     <item quantity="other">"Wi-Fiネットワークが利用可能"</item>
     <item quantity="one">"Wi-Fiオープンネットワークが利用できます"</item>
     <item quantity="other">"Wi-Fiオープンネットワークが利用できます"</item>
   </plurals>
-    <!-- no translation found for select_character (3365550120617701745) -->
-    <skip />
+    <string name="select_character">"文字を挿入"</string>
     <string name="sms_control_default_app_name">"不明なアプリケーション"</string>
     <string name="sms_control_title">"SMSメッセージの送信中"</string>
     <string name="sms_control_message">"大量のSMSメッセージが送信されます。送信するには[OK]、中止するには[キャンセル]を選択します。"</string>
     <string name="usb_storage_error_message">"USBメモリにSDカードを使用する際に問題が発生しました。"</string>
     <string name="usb_storage_notification_title">"USB接続"</string>
     <string name="usb_storage_notification_message">"パソコンとの間でファイルをコピーします。"</string>
-    <!-- no translation found for select_input_method (2086499663193509436) -->
-    <skip />
-    <!-- no translation found for fast_scroll_alphabet (5433275485499039199) -->
-    <skip />
-    <!-- no translation found for fast_scroll_numeric_alphabet (4030170524595123610) -->
-    <skip />
-    <!-- no translation found for candidates_style (5248064431114273041) -->
-    <skip />
+    <string name="select_input_method">"入力方法の選択"</string>
+    <string name="fast_scroll_alphabet">"ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="fast_scroll_numeric_alphabet">"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="candidates_style"><font fgcolor="#ff000000" bgcolor="#ff8080ff"><u>"候補"</u></font></string>
 </resources>
diff --git a/core/res/res/values-mcc204-cs/strings.xml b/core/res/res/values-mcc204-cs/strings.xml
new file mode 100644 (file)
index 0000000..c846c60
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"nl_nl"</string>
+</resources>
index 1b2f85b..c846c60 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (2972154133076909542) -->
-    <skip />
+    <string name="locale_replacement">"nl_nl"</string>
 </resources>
diff --git a/core/res/res/values-mcc204-es/strings.xml b/core/res/res/values-mcc204-es/strings.xml
new file mode 100644 (file)
index 0000000..c846c60
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"nl_nl"</string>
+</resources>
index 1b2f85b..c846c60 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (2972154133076909542) -->
-    <skip />
+    <string name="locale_replacement">"nl_nl"</string>
 </resources>
index 1b2f85b..c846c60 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (2972154133076909542) -->
-    <skip />
+    <string name="locale_replacement">"nl_nl"</string>
 </resources>
index 1b2f85b..c846c60 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (2972154133076909542) -->
-    <skip />
+    <string name="locale_replacement">"nl_nl"</string>
 </resources>
diff --git a/core/res/res/values-mcc204-nl/strings.xml b/core/res/res/values-mcc204-nl/strings.xml
new file mode 100644 (file)
index 0000000..c846c60
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-pl/strings.xml b/core/res/res/values-mcc204-pl/strings.xml
new file mode 100644 (file)
index 0000000..c846c60
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-ru/strings.xml b/core/res/res/values-mcc204-ru/strings.xml
new file mode 100644 (file)
index 0000000..c846c60
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"nl_nl"</string>
+</resources>
index 1b2f85b..c846c60 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (2972154133076909542) -->
-    <skip />
+    <string name="locale_replacement">"nl_nl"</string>
 </resources>
diff --git a/core/res/res/values-mcc204-zh-rTW/strings.xml b/core/res/res/values-mcc204-zh-rTW/strings.xml
new file mode 100644 (file)
index 0000000..c846c60
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-cs/strings.xml b/core/res/res/values-mcc230-cs/strings.xml
new file mode 100644 (file)
index 0000000..fd82191
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"cs_cz"</string>
+</resources>
index 46bdbda..fd82191 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (9011721823833053909) -->
-    <skip />
+    <string name="locale_replacement">"cs_cz"</string>
 </resources>
diff --git a/core/res/res/values-mcc230-es/strings.xml b/core/res/res/values-mcc230-es/strings.xml
new file mode 100644 (file)
index 0000000..fd82191
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"cs_cz"</string>
+</resources>
index 46bdbda..fd82191 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (9011721823833053909) -->
-    <skip />
+    <string name="locale_replacement">"cs_cz"</string>
 </resources>
index 46bdbda..fd82191 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (9011721823833053909) -->
-    <skip />
+    <string name="locale_replacement">"cs_cz"</string>
 </resources>
index 46bdbda..fd82191 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (9011721823833053909) -->
-    <skip />
+    <string name="locale_replacement">"cs_cz"</string>
 </resources>
diff --git a/core/res/res/values-mcc230-nl/strings.xml b/core/res/res/values-mcc230-nl/strings.xml
new file mode 100644 (file)
index 0000000..fd82191
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-pl/strings.xml b/core/res/res/values-mcc230-pl/strings.xml
new file mode 100644 (file)
index 0000000..fd82191
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-ru/strings.xml b/core/res/res/values-mcc230-ru/strings.xml
new file mode 100644 (file)
index 0000000..fd82191
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"cs_cz"</string>
+</resources>
index 46bdbda..fd82191 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (9011721823833053909) -->
-    <skip />
+    <string name="locale_replacement">"cs_cz"</string>
 </resources>
diff --git a/core/res/res/values-mcc230-zh-rTW/strings.xml b/core/res/res/values-mcc230-zh-rTW/strings.xml
new file mode 100644 (file)
index 0000000..fd82191
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-cs/strings.xml b/core/res/res/values-mcc232-cs/strings.xml
new file mode 100644 (file)
index 0000000..1376f0c
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"de_at"</string>
+</resources>
index 0a20691..1376f0c 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (166900303893651370) -->
-    <skip />
+    <string name="locale_replacement">"de_at"</string>
 </resources>
diff --git a/core/res/res/values-mcc232-es/strings.xml b/core/res/res/values-mcc232-es/strings.xml
new file mode 100644 (file)
index 0000000..1376f0c
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"de_at"</string>
+</resources>
index 0a20691..1376f0c 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (166900303893651370) -->
-    <skip />
+    <string name="locale_replacement">"de_at"</string>
 </resources>
index 0a20691..1376f0c 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (166900303893651370) -->
-    <skip />
+    <string name="locale_replacement">"de_at"</string>
 </resources>
index 0a20691..1376f0c 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (166900303893651370) -->
-    <skip />
+    <string name="locale_replacement">"de_at"</string>
 </resources>
diff --git a/core/res/res/values-mcc232-nl/strings.xml b/core/res/res/values-mcc232-nl/strings.xml
new file mode 100644 (file)
index 0000000..1376f0c
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-pl/strings.xml b/core/res/res/values-mcc232-pl/strings.xml
new file mode 100644 (file)
index 0000000..1376f0c
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-ru/strings.xml b/core/res/res/values-mcc232-ru/strings.xml
new file mode 100644 (file)
index 0000000..1376f0c
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"de_at"</string>
+</resources>
index 0a20691..1376f0c 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (166900303893651370) -->
-    <skip />
+    <string name="locale_replacement">"de_at"</string>
 </resources>
diff --git a/core/res/res/values-mcc232-zh-rTW/strings.xml b/core/res/res/values-mcc232-zh-rTW/strings.xml
new file mode 100644 (file)
index 0000000..1376f0c
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-cs/strings.xml b/core/res/res/values-mcc234-cs/strings.xml
new file mode 100644 (file)
index 0000000..44a7841
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"en_gb"</string>
+</resources>
index 44a7f03..44a7841 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (233769627858930762) -->
-    <skip />
+    <string name="locale_replacement">"en_gb"</string>
 </resources>
diff --git a/core/res/res/values-mcc234-es/strings.xml b/core/res/res/values-mcc234-es/strings.xml
new file mode 100644 (file)
index 0000000..44a7841
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"en_gb"</string>
+</resources>
index 44a7f03..44a7841 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (233769627858930762) -->
-    <skip />
+    <string name="locale_replacement">"en_gb"</string>
 </resources>
index 44a7f03..44a7841 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (233769627858930762) -->
-    <skip />
+    <string name="locale_replacement">"en_gb"</string>
 </resources>
index 44a7f03..44a7841 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (233769627858930762) -->
-    <skip />
+    <string name="locale_replacement">"en_gb"</string>
 </resources>
diff --git a/core/res/res/values-mcc234-nl/strings.xml b/core/res/res/values-mcc234-nl/strings.xml
new file mode 100644 (file)
index 0000000..44a7841
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-pl/strings.xml b/core/res/res/values-mcc234-pl/strings.xml
new file mode 100644 (file)
index 0000000..44a7841
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-ru/strings.xml b/core/res/res/values-mcc234-ru/strings.xml
new file mode 100644 (file)
index 0000000..44a7841
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"en_gb"</string>
+</resources>
index 44a7f03..44a7841 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (233769627858930762) -->
-    <skip />
+    <string name="locale_replacement">"en_gb"</string>
 </resources>
diff --git a/core/res/res/values-mcc234-zh-rTW/strings.xml b/core/res/res/values-mcc234-zh-rTW/strings.xml
new file mode 100644 (file)
index 0000000..44a7841
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-cs/strings.xml b/core/res/res/values-mcc260-cs/strings.xml
new file mode 100644 (file)
index 0000000..2e40a50
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-de/strings.xml b/core/res/res/values-mcc260-de/strings.xml
new file mode 100644 (file)
index 0000000..2e40a50
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-es/strings.xml b/core/res/res/values-mcc260-es/strings.xml
new file mode 100644 (file)
index 0000000..2e40a50
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"pl_pl"</string>
+</resources>
index ddf5b9f..2e40a50 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (6306793451973344945) -->
-    <skip />
+    <string name="locale_replacement">"pl_pl"</string>
 </resources>
index ddf5b9f..2e40a50 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (6306793451973344945) -->
-    <skip />
+    <string name="locale_replacement">"pl_pl"</string>
 </resources>
diff --git a/core/res/res/values-mcc260-ja/strings.xml b/core/res/res/values-mcc260-ja/strings.xml
new file mode 100644 (file)
index 0000000..2e40a50
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-nl/strings.xml b/core/res/res/values-mcc260-nl/strings.xml
new file mode 100644 (file)
index 0000000..2e40a50
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-pl/strings.xml b/core/res/res/values-mcc260-pl/strings.xml
new file mode 100644 (file)
index 0000000..2e40a50
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-ru/strings.xml b/core/res/res/values-mcc260-ru/strings.xml
new file mode 100644 (file)
index 0000000..2e40a50
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"pl_pl"</string>
+</resources>
index ddf5b9f..2e40a50 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (6306793451973344945) -->
-    <skip />
+    <string name="locale_replacement">"pl_pl"</string>
 </resources>
diff --git a/core/res/res/values-mcc260-zh-rTW/strings.xml b/core/res/res/values-mcc260-zh-rTW/strings.xml
new file mode 100644 (file)
index 0000000..2e40a50
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-cs/strings.xml b/core/res/res/values-mcc262-cs/strings.xml
new file mode 100644 (file)
index 0000000..c4b1b72
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"de_de"</string>
+</resources>
index fad4872..c4b1b72 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (273407696421660814) -->
-    <skip />
+    <string name="locale_replacement">"de_de"</string>
 </resources>
diff --git a/core/res/res/values-mcc262-es/strings.xml b/core/res/res/values-mcc262-es/strings.xml
new file mode 100644 (file)
index 0000000..c4b1b72
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"de_de"</string>
+</resources>
index fad4872..c4b1b72 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (273407696421660814) -->
-    <skip />
+    <string name="locale_replacement">"de_de"</string>
 </resources>
index fad4872..c4b1b72 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (273407696421660814) -->
-    <skip />
+    <string name="locale_replacement">"de_de"</string>
 </resources>
index fad4872..c4b1b72 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (273407696421660814) -->
-    <skip />
+    <string name="locale_replacement">"de_de"</string>
 </resources>
diff --git a/core/res/res/values-mcc262-nl/strings.xml b/core/res/res/values-mcc262-nl/strings.xml
new file mode 100644 (file)
index 0000000..c4b1b72
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-pl/strings.xml b/core/res/res/values-mcc262-pl/strings.xml
new file mode 100644 (file)
index 0000000..c4b1b72
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-ru/strings.xml b/core/res/res/values-mcc262-ru/strings.xml
new file mode 100644 (file)
index 0000000..c4b1b72
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"de_de"</string>
+</resources>
index fad4872..c4b1b72 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for locale_replacement (273407696421660814) -->
-    <skip />
+    <string name="locale_replacement">"de_de"</string>
 </resources>
diff --git a/core/res/res/values-mcc262-zh-rTW/strings.xml b/core/res/res/values-mcc262-zh-rTW/strings.xml
new file mode 100644 (file)
index 0000000..c4b1b72
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-nl/arrays.xml b/core/res/res/values-nl/arrays.xml
new file mode 100644 (file)
index 0000000..f9c904b
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
new file mode 100644 (file)
index 0000000..54a7321
--- /dev/null
@@ -0,0 +1,724 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="byteShort">"B"</string>
+    <string name="kilobyteShort">"kB"</string>
+    <string name="megabyteShort">"MB"</string>
+    <string name="gigabyteShort">"GB"</string>
+    <string name="terabyteShort">"TB"</string>
+    <string name="petabyteShort">"PB"</string>
+    <string name="untitled">"&lt;zonder titel&gt;"</string>
+    <string name="ellipsis">"…"</string>
+    <string name="emptyPhoneNumber">"(Geen telefoonnummer)"</string>
+    <string name="unknownName">"(Onbekend)"</string>
+    <string name="defaultVoiceMailAlphaTag">"Voicemail"</string>
+    <string name="defaultMsisdnAlphaTag">"MSISDN1"</string>
+    <string name="mmiError">"Verbindingsprobleem of ongeldige MMI-code."</string>
+    <string name="serviceEnabled">"Service is ingeschakeld."</string>
+    <string name="serviceEnabledFor">"Service is ingeschakeld voor:"</string>
+    <string name="serviceDisabled">"Service is uitgeschakeld."</string>
+    <string name="serviceRegistered">"De registratie is voltooid."</string>
+    <string name="serviceErased">"Wissen uitgevoerd."</string>
+    <string name="passwordIncorrect">"Onjuist wachtwoord."</string>
+    <string name="mmiComplete">"MMI voltooid."</string>
+    <string name="badPin">"De oude PIN-code die u heeft ingevoerd, is onjuist."</string>
+    <string name="badPuk">"De PUK-code die u heeft ingevoerd, is onjuist."</string>
+    <string name="mismatchPin">"De PIN-codes die u heeft ingevoerd, komen niet overeen."</string>
+    <string name="invalidPin">"Voer een PIN-code van 4 tot 8 cijfers in."</string>
+    <string name="needPuk">"Uw SIM-kaart is geblokkeerd met de PUK-code. Typ de PUK-code om de blokkering op te heffen."</string>
+    <string name="needPuk2">"Voer de PUK2-code in om de SIM-kaart te deblokkeren."</string>
+    <string name="ClipMmi">"Inkomende beller-id"</string>
+    <string name="ClirMmi">"Uitgaande beller-id"</string>
+    <string name="CfMmi">"Oproep doorschakelen"</string>
+    <string name="CwMmi">"Wisselgesprek"</string>
+    <string name="BaMmi">"Oproep blokkeren"</string>
+    <string name="PwdMmi">"Wachtwoordwijziging"</string>
+    <string name="PinMmi">"PIN-wijziging"</string>
+    <string name="CLIRDefaultOnNextCallOn">"Beller-id standaard ingesteld op \'beperkt\'. Volgende oproep: beperkt."</string>
+    <string name="CLIRDefaultOnNextCallOff">"Beller-id standaard ingesteld op \'beperkt\'. Volgende oproep: onbeperkt."</string>
+    <string name="CLIRDefaultOffNextCallOn">"Beller-id standaard ingesteld op \'onbeperkt\'. Volgende oproep: beperkt."</string>
+    <string name="CLIRDefaultOffNextCallOff">"Beller-id standaard ingesteld op \'onbeperkt\'. Volgende oproep: onbeperkt."</string>
+    <string name="serviceNotProvisioned">"Service niet voorzien."</string>
+    <string name="CLIRPermanent">"De instelling voor beller-id kan niet worden gewijzigd."</string>
+    <string name="serviceClassVoice">"Spraak"</string>
+    <string name="serviceClassData">"Gegevens"</string>
+    <string name="serviceClassFAX">"FAX"</string>
+    <string name="serviceClassSMS">"SMS"</string>
+    <string name="serviceClassDataAsync">"Asynchroon"</string>
+    <string name="serviceClassDataSync">"Synchroniseren"</string>
+    <string name="serviceClassPacket">"Pakket"</string>
+    <string name="serviceClassPAD">"PAD"</string>
+    <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: niet doorgeschakeld"</string>
+    <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+    <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> na <xliff:g id="TIME_DELAY">{2}</xliff:g> seconden"</string>
+    <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: niet doorgeschakeld"</string>
+    <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: niet doorgeschakeld"</string>
+    <string name="httpErrorOk">"OK"</string>
+    <string name="httpError">"De webpagina bevat een fout."</string>
+    <string name="httpErrorLookup">"De URL kan niet worden gevonden."</string>
+    <string name="httpErrorUnsupportedAuthScheme">"Het schema voor de siteverificatie wordt niet ondersteund."</string>
+    <string name="httpErrorAuth">"Verificatie mislukt."</string>
+    <string name="httpErrorProxyAuth">"Verificatie via de proxyserver is mislukt."</string>
+    <string name="httpErrorConnect">"Er kan geen verbinding met de server worden gemaakt."</string>
+    <string name="httpErrorIO">"De server kan niet communiceren. Probeer het later opnieuw."</string>
+    <string name="httpErrorTimeout">"Er is een time-out voor de serververbinding opgetreden."</string>
+    <string name="httpErrorRedirectLoop">"De pagina bevat te veel serveromleidingen."</string>
+    <string name="httpErrorUnsupportedScheme">"Het protocol wordt niet ondersteund."</string>
+    <string name="httpErrorFailedSslHandshake">"Er kan geen beveiligde verbinding tot stand worden gebracht."</string>
+    <string name="httpErrorBadUrl">"De pagina kan niet worden geopend, omdat de URL ongeldig is."</string>
+    <string name="httpErrorFile">"Het bestand kan niet worden geopend."</string>
+    <string name="httpErrorFileNotFound">"Het opgevraagde bestand is niet gevonden."</string>
+    <string name="httpErrorTooManyRequests">"Er worden te veel aanvragen verwerkt. Probeer het later opnieuw."</string>
+    <string name="contentServiceSync">"Synchroniseren"</string>
+    <string name="contentServiceSyncNotificationTitle">"Synchroniseren"</string>
+    <string name="contentServiceTooManyDeletesNotificationDesc">"Te veel verwijderen voor <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+    <string name="low_memory">"Telefoongeheugen is vol! Verwijder enkele bestanden om ruimte vrij te maken."</string>
+    <string name="me">"Ik"</string>
+    <string name="power_dialog">"Telefoonopties"</string>
+    <string name="silent_mode">"Stille modus"</string>
+    <string name="turn_on_radio">"Draadloos inschakelen"</string>
+    <string name="turn_off_radio">"Draadloos uitschakelen"</string>
+    <string name="screen_lock">"Schermblokkering"</string>
+    <string name="power_off">"Uitschakelen"</string>
+    <string name="shutdown_progress">"Uitschakelen..."</string>
+    <string name="shutdown_confirm">"Uw telefoon wordt uitgeschakeld."</string>
+    <string name="no_recent_tasks">"Geen recente toepassingen."</string>
+    <string name="global_actions">"Telefoonopties"</string>
+    <string name="global_action_lock">"Schermblokkering"</string>
+    <string name="global_action_power_off">"Uitschakelen"</string>
+    <string name="global_action_toggle_silent_mode">"Stille modus"</string>
+    <string name="global_action_silent_mode_on_status">"Geluid is UIT"</string>
+    <string name="global_action_silent_mode_off_status">"Geluid is AAN"</string>
+    <string name="safeMode">"Veilige modus"</string>
+    <string name="permgrouplab_costMoney">"Services waarvoor u moet betalen"</string>
+    <string name="permgroupdesc_costMoney">"Toepassingen toestaan activiteiten uit te voeren waarvoor mogelijk kosten in rekening worden gebracht."</string>
+    <string name="permgrouplab_messages">"Uw berichten"</string>
+    <string name="permgroupdesc_messages">"SMS, e-mail en andere berichten lezen en schrijven."</string>
+    <string name="permgrouplab_personalInfo">"Uw persoonlijke informatie"</string>
+    <string name="permgroupdesc_personalInfo">"Rechtstreekse toegang tot de op uw telefoon opgeslagen contactpersonen en agenda."</string>
+    <string name="permgrouplab_location">"Uw locatie"</string>
+    <string name="permgroupdesc_location">"Uw fysieke locatie bijhouden"</string>
+    <string name="permgrouplab_network">"Netwerkcommunicatie"</string>
+    <string name="permgroupdesc_network">"Toepassingen toestaan verschillende netwerkfuncties te openen."</string>
+    <string name="permgrouplab_accounts">"Uw Google-accounts"</string>
+    <string name="permgroupdesc_accounts">"Toegang tot de beschikbare Google-accounts."</string>
+    <string name="permgrouplab_hardwareControls">"Bedieningselementen hardware"</string>
+    <string name="permgroupdesc_hardwareControls">"Rechtstreekse toegang tot hardware op de handset."</string>
+    <string name="permgrouplab_phoneCalls">"Telefoonoproepen"</string>
+    <string name="permgroupdesc_phoneCalls">"Oproepen bijhouden, registreren en verwerken."</string>
+    <string name="permgrouplab_systemTools">"Systeemhulpprogramma\'s"</string>
+    <string name="permgroupdesc_systemTools">"Toegang tot en beheer van het systeem op lager niveau."</string>
+    <string name="permgrouplab_developmentTools">"Ontwikkelingshulpprogramma\'s"</string>
+    <string name="permgroupdesc_developmentTools">"Functies die alleen door toepassingsontwikkelaars worden gebruikt."</string>
+    <string name="permlab_statusBar">"statusbalk uitschakelen of wijzigen"</string>
+    <string name="permdesc_statusBar">"Hiermee kan een toepassing de statusbalk uitschakelen of systeempictogrammen toevoegen en verwijderen."</string>
+    <string name="permlab_expandStatusBar">"statusbalk uitvouwen/samenvouwen"</string>
+    <string name="permdesc_expandStatusBar">"Hiermee kan de toepassing de statusbalk uitvouwen of samenvouwen."</string>
+    <string name="permlab_processOutgoingCalls">"uitgaande oproepen onderscheppen"</string>
+    <string name="permdesc_processOutgoingCalls">"Hiermee kan een toepassing uitgaande oproepen verwerken en het nummer wijzigen dat wordt gebeld. Schadelijke toepassingen kunnen uitgaande oproepen bijhouden, omleiden of tegenhouden."</string>
+    <string name="permlab_receiveSms">"SMS ontvangen"</string>
+    <string name="permdesc_receiveSms">"Hiermee kan een toepassing SMS-berichten ontvangen en verwerken. Schadelijke toepassingen kunnen uw berichten bijhouden of deze verwijderen zonder dat u ze te zien krijgt."</string>
+    <string name="permlab_receiveMms">"MMS ontvangen"</string>
+    <string name="permdesc_receiveMms">"Hiermee kan een toepassing MMS-berichten ontvangen en verwerken. Schadelijke toepassingen kunnen uw berichten bijhouden of deze verwijderen zonder dat u ze te zien krijgt."</string>
+    <string name="permlab_sendSms">"SMS-berichten verzenden"</string>
+    <string name="permdesc_sendSms">"Hiermee kan de toepassing SMS-berichten verzenden. Schadelijke toepassingen kunnen u geld kosten door berichten te verzenden zonder uw toestemming."</string>
+    <string name="permlab_readSms">"SMS of MMS lezen"</string>
+    <string name="permdesc_readSms">"Hiermee kan een toepassing de op uw telefoon of SIM-kaart opgeslagen SMS-berichten lezen. Schadelijke toepassingen kunnen uw vertrouwelijke berichten mogelijk lezen."</string>
+    <string name="permlab_writeSms">"SMS of MMS bewerken"</string>
+    <string name="permdesc_writeSms">"Hiermee kan een toepassing naar de op uw telefoon of SIM-kaart opgeslagen SMS-berichten schrijven. Schadelijke toepassingen kunnen uw berichten mogelijk verwijderen."</string>
+    <string name="permlab_receiveWapPush">"WAP ontvangen"</string>
+    <string name="permdesc_receiveWapPush">"Hiermee kan een toepassing WAP-berichten ontvangen en verwerken. Schadelijke toepassingen kunnen uw berichten bijhouden of deze verwijderen zonder dat u ze te zien krijgt."</string>
+    <string name="permlab_getTasks">"actieve toepassingen ophalen"</string>
+    <string name="permdesc_getTasks">"Hiermee kan een toepassing informatie over huidige en recent uitgevoerde taken ophalen. Schadelijke toepassingen kunnen op deze manier mogelijk privé-informatie over andere toepassingen achterhalen."</string>
+    <string name="permlab_reorderTasks">"actieve toepassingen opnieuw indelen"</string>
+    <string name="permdesc_reorderTasks">"Hiermee kan een toepassing taken naar de voor- en achtergrond verplaatsen. Schadelijke toepassingen kunnen zichzelf op de voorgrond plaatsen zonder dat u hier iets aan kunt doen."</string>
+    <string name="permlab_setDebugApp">"foutopsporing in toepassingen inschakelen"</string>
+    <string name="permdesc_setDebugApp">"Hiermee kan een toepassing de foutopsporing voor een andere toepassing inschakelen. Schadelijke toepassingen kunnen dit gebruiken om andere toepassingen af te sluiten."</string>
+    <string name="permlab_changeConfiguration">"uw UI-instellingen wijzigen"</string>
+    <string name="permdesc_changeConfiguration">"Hiermee kan een toepassing de huidige configuratie, zoals de landinstelling of de algemene lettergrootte, wijzigen."</string>
+    <string name="permlab_restartPackages">"andere toepassingen opnieuw starten"</string>
+    <string name="permdesc_restartPackages">"Hiermee kan een toepassing andere toepassingen opnieuw starten."</string>
+    <string name="permlab_setProcessForeground">"stoppen voorkomen"</string>
+    <string name="permdesc_setProcessForeground">"Hiermee kan een toepassing ervoor zorgen dat elk willekeurig proces op de voorgrond wordt uitgevoerd en dus niet kan worden afgesloten. Nooit vereist voor normale toepassingen."</string>
+    <string name="permlab_forceBack">"toepassing gedwongen sluiten"</string>
+    <string name="permdesc_forceBack">"Hiermee kan een toepassing elke willekeurige activiteit die op de voorgrond wordt uitgevoerd, sluiten en naar de achtergrond verplaatsen. Nooit vereist voor normale toepassingen."</string>
+    <string name="permlab_dump">"interne systeemstatus ophalen"</string>
+    <string name="permdesc_dump">"Hiermee kan een toepassing de interne status van het systeem ophalen. Schadelijke toepassingen kunnen privé- of veiligheidsgegevens ophalen die ze normaal niet nodig hebben."</string>
+    <string name="permlab_addSystemService">"services op laag niveau publiceren"</string>
+    <string name="permdesc_addSystemService">"Hiermee kunnen toepassingen hun eigen systeemservices op laag niveau publiceren. Schadelijke toepassingen kunnen het systeem mogelijk kapen en willekeurige gegevens van het systeem stelen of beschadigen."</string>
+    <string name="permlab_runSetActivityWatcher">"alle startende toepassingen bijhouden en beheren"</string>
+    <string name="permdesc_runSetActivityWatcher">"Hiermee kan een toepassing de manier waarop het systeem activiteiten start, bijhouden en beheren. Schadelijke toepassingen kunnen het systeem volledig in gevaar brengen. Deze machtiging is alleen voor ontwikkeling vereist, nooit voor normaal telefoongebruik."</string>
+    <string name="permlab_broadcastPackageRemoved">"melding verzenden dat pakket is verwijderd"</string>
+    <string name="permdesc_broadcastPackageRemoved">"Hiermee kan een toepassing een melding verzenden dat een toepassingspakket is verwijderd. Schadelijke toepassingen kunnen hiervan gebruik maken om alle andere actieve toepassingen af te sluiten."</string>
+    <string name="permlab_broadcastSmsReceived">"melding over ontvangen SMS-bericht verzenden"</string>
+    <string name="permdesc_broadcastSmsReceived">"Hiermee kan een toepassing een melding verzenden dat een SMS-bericht is ontvangen. Schadelijke toepassingen kunnen hiervan gebruik maken om inkomende SMS-berichten te vervalsen."</string>
+    <string name="permlab_broadcastWapPush">"melding over ontvangen WAP-PUSH-bericht verzenden"</string>
+    <string name="permdesc_broadcastWapPush">"Hiermee kan een toepassing een melding verzenden dat een WAP PUSH-bericht is ontvangen. Schadelijke toepassingen kunnen hiervan gebruik maken om een valse MMS-ontvangst te melden of de inhoud van willekeurige webpagina\'s door schadelijke varianten te vervangen."</string>
+    <string name="permlab_setProcessLimit">"aantal actieve processen beperken"</string>
+    <string name="permdesc_setProcessLimit">"Hiermee kan een toepassing het maximum aantal processen bepalen dat wordt uitgevoerd. Nooit vereist voor normale toepassingen."</string>
+    <string name="permlab_setAlwaysFinish">"alle achtergrondtoepassingen sluiten"</string>
+    <string name="permdesc_setAlwaysFinish">"Hiermee kan een toepassing bepalen of activiteiten altijd worden afgesloten zodra deze naar de achtergrond gaan. Nooit nodig voor normale toepassingen."</string>
+    <string name="permlab_fotaUpdate">"systeemupdates automatisch installeren"</string>
+    <string name="permdesc_fotaUpdate">"Hiermee ontvangt een toepassing meldingen over beschikbare systeemupdates en kan hun installatie starten. Schadelijke toepassingen kunnen hiervan gebruik maken om het systeem met ongeautoriseerde updates te beschadigen of het updateproces in het algemeen te verstoren."</string>
+    <string name="permlab_batteryStats">"accustatistieken aanpassen"</string>
+    <string name="permdesc_batteryStats">"Hiermee kunnen verzamelde accustatistieken worden gewijzigd. Niet voor gebruik door normale toepassingen."</string>
+    <string name="permlab_internalSystemWindow">"niet-geautoriseerde vensters weergeven"</string>
+    <string name="permdesc_internalSystemWindow">"Hiermee kunnen vensters worden gemaakt die door de interne systeemgebruikersinterface worden gebruikt. Niet voor gebruik door normale toepassingen."</string>
+    <string name="permlab_systemAlertWindow">"waarschuwingen op systeemniveau weergeven"</string>
+    <string name="permdesc_systemAlertWindow">"Hiermee kan een toepassing systeemwaarschuwingen weergeven. Schadelijke toepassingen kunnen op deze manier het hele scherm van de telefoon overnemen."</string>
+    <string name="permlab_setAnimationScale">"algemene animatiesnelheid wijzigen"</string>
+    <string name="permdesc_setAnimationScale">"Hiermee kan een toepassing op elk gewenst moment de algemene animatiesnelheid wijzigen (snellere of tragere animaties)."</string>
+    <string name="permlab_manageAppTokens">"toepassingstokens beheren"</string>
+    <string name="permdesc_manageAppTokens">"Hiermee kunnen toepassingen hun eigen tokens maken en beheren, waarbij de normale Z-volgorde wordt overgeslagen. Nooit nodig voor normale toepassingen."</string>
+    <string name="permlab_injectEvents">"drukken op toetsen en bedieningselementen"</string>
+    <string name="permdesc_injectEvents">"Hiermee kan een toepassing zijn eigen invoergebeurtenissen (toetsaanslagen, enzovoort) aan andere toepassingen doorgeven. Schadelijke toepassingen kunnen dit gebruiken om de telefoon over te nemen."</string>
+    <string name="permlab_readInputState">"uw invoer en acties vastleggen"</string>
+    <string name="permdesc_readInputState">"Hiermee kan een toepassing uw toetsaanslagen registreren, zelfs tijdens de interactie met een andere toepassing (zoals de invoer van een wachtwoord). Nooit vereist voor normale toepassingen."</string>
+    <string name="permlab_bindInputMethod">"verbinden aan een invoermethode"</string>
+    <string name="permdesc_bindInputMethod">"Hiermee staat u de houder toe zich te verbinden met de hoofdinterface van een invoermethode. Nooit vereist voor normale toepassingen."</string>
+    <string name="permlab_setOrientation">"schermstand wijzigen"</string>
+    <string name="permdesc_setOrientation">"Hiermee kan een toepassing op elk gewenst moment de oriëntatie van het scherm wijzigen. Nooit vereist voor normale toepassingen."</string>
+    <string name="permlab_signalPersistentProcesses">"Linux-signalen verzenden naar toepassingen"</string>
+    <string name="permdesc_signalPersistentProcesses">"Hiermee kan de toepassing ervoor zorgen dat het geleverde signaal wordt verzonden naar alle persistente processen."</string>
+    <string name="permlab_persistentActivity">"toepassing altijd laten uitvoeren"</string>
+    <string name="permdesc_persistentActivity">"Hiermee kan een toepassing delen van zichzelf persistent maken, zodat het systeem dat deel niet voor andere toepassingen kan gebruiken."</string>
+    <string name="permlab_deletePackages">"toepassingen verwijderen"</string>
+    <string name="permdesc_deletePackages">"Hiermee kan een toepassing Android-pakketten verwijderen. Schadelijke toepassingen kunnen dit gebruiken om belangrijke toepassingen te verwijderen."</string>
+    <string name="permlab_clearAppUserData">"gegevens van andere toepassingen verwijderen"</string>
+    <string name="permdesc_clearAppUserData">"Hiermee kan een toepassing gebruikersgegevens wissen."</string>
+    <string name="permlab_deleteCacheFiles">"caches van andere toepassingen verwijderen"</string>
+    <string name="permdesc_deleteCacheFiles">"Hiermee kan een toepassing cachebestanden verwijderen."</string>
+    <string name="permlab_getPackageSize">"opslagruimte van toepassing bepalen"</string>
+    <string name="permdesc_getPackageSize">"Hiermee kan een toepassing de bijbehorende code, gegevens en cachegrootten ophalen."</string>
+    <string name="permlab_installPackages">"toepassingen rechtstreeks installeren"</string>
+    <string name="permdesc_installPackages">"Hiermee kan een toepassing nieuwe of bijgewerkte Android-pakketten installeren. Schadelijke toepassingen kunnen hiervan gebruik maken om nieuwe toepassingen met willekeurig krachtige machtigingen toe te voegen."</string>
+    <string name="permlab_clearAppCache">"alle cachegegevens van toepassing verwijderen"</string>
+    <string name="permdesc_clearAppCache">"Hiermee kan een toepassing opslagruimte op de telefoon vrij maken door bestanden te verwijderen uit de cachemap van de toepassing. De toegang is doorgaans beperkt tot het systeemproces."</string>
+    <string name="permlab_readLogs">"systeemlogbestanden lezen"</string>
+    <string name="permdesc_readLogs">"Hiermee kan een toepassing de verschillende logbestanden van het systeem lezen. De toepassing kan op deze manier algemene informatie achterhalen over uw telefoongebruik. Hierin is geen persoonlijke of privé-informatie opgenomen."</string>
+    <string name="permlab_diagnostic">"lezen/schrijven naar bronnen van diag"</string>
+    <string name="permdesc_diagnostic">"Hiermee kan een toepassing lezen en schrijven naar elke bron die hoort bij de diagnostische groep, zoals bestanden in /dev. Hierdoor kan de systeemstabiliteit en -veiligheid worden beïnvloed. Dit mag ALLEEN worden gebruikt voor hardwarespecifieke diagnostiek door de fabrikant of operator."</string>
+    <string name="permlab_changeComponentState">"toepassingscomponenten in- of uitschakelen"</string>
+    <string name="permdesc_changeComponentState">"Hiermee kan een toepassing bepalen of een component van een andere toepassing is ingeschakeld. Schadelijke toepassingen kunnen hiervan gebruik maken om belangrijke telefoonfuncties uit te schakelen. Een machtiging moet zorgvuldig worden overwogen, aangezien toepassingscomponenten onbruikbaar, inconsistent of instabiel kunnen worden."</string>
+    <string name="permlab_setPreferredApplications">"voorkeurstoepassingen instellen"</string>
+    <string name="permdesc_setPreferredApplications">"Hiermee kan een toepassing uw voorkeurstoepassingen wijzigen. Schadelijke toepassingen kunnen op deze manier de actieve toepassingen zonder uw medeweten wijzigen en uw bestaande toepassingen doorzoeken om privégegevens van u te verzamelen."</string>
+    <string name="permlab_writeSettings">"algemene systeeminstellingen wijzigen"</string>
+    <string name="permdesc_writeSettings">"Hiermee kan een toepassing de systeeminstellingen wijzigen. Schadelijke toepassingen kunnen hiermee uw systeemconfiguratie beschadigen."</string>
+    <string name="permlab_writeSecureSettings">"beveiligde systeeminstellingen wijzigen"</string>
+    <string name="permdesc_writeSecureSettings">"Hiermee kan een toepassing beveiligde systeeminstellingen wijzigen. Niet voor gebruik door normale toepassingen."</string>
+    <string name="permlab_writeGservices">"de Google-serviceskaart wijzigen"</string>
+    <string name="permdesc_writeGservices">"Hiermee kan een toepassing de Google-serviceskaart wijzigen. Niet voor gebruik door normale toepassingen."</string>
+    <string name="permlab_receiveBootCompleted">"automatisch starten bij opstarten"</string>
+    <string name="permdesc_receiveBootCompleted">"Hiermee kan een toepassing zichzelf starten zodra het systeem klaar is met opstarten. Hierdoor kan het langer duren voordat de telefoon is opgestart en kan de toepassing de telefoonprocessen vertragen door altijd actief te zijn."</string>
+    <string name="permlab_broadcastSticky">"sticky broadcast verzenden"</string>
+    <string name="permdesc_broadcastSticky">"Hiermee kan een toepassing sticky broadcasts verzenden die achterblijven als de broadcast eindigt. Schadelijke toepassingen kunnen hiermee de telefoon traag of instabiel maken door ervoor te zorgen dat er te veel geheugenruimte wordt gebruikt."</string>
+    <string name="permlab_readContacts">"contactgegevens lezen"</string>
+    <string name="permdesc_readContacts">"Hiermee kan een toepassing alle contactgegevens (adresgegevens) zien die op uw telefoon zijn opgeslagen. Schadelijke toepassingen kunnen hiervan gebruik maken om uw gegevens te verzenden naar andere personen."</string>
+    <string name="permlab_writeContacts">"contactgegevens schrijven"</string>
+    <string name="permdesc_writeContacts">"Hiermee kan een toepassing de op uw telefoon opgeslagen contactgegevens (adresgegevens) wijzigen. Schadelijke toepassingen kunnen hiermee uw contactgegevens verwijderen of wijzigen."</string>
+    <string name="permlab_writeOwnerData">"gegevens eigenaar schrijven"</string>
+    <string name="permdesc_writeOwnerData">"Hiermee kan een toepassing de op uw telefoon opgeslagen gegevens van de eigenaar wijzigen. Schadelijke toepassingen kunnen hiermee gegevens van de eigenaar verwijderen of wijzigen."</string>
+    <string name="permlab_readOwnerData">"gegevens eigenaar lezen"</string>
+    <string name="permdesc_readOwnerData">"Hiermee kan een toepassing de op uw telefoon opgeslagen gegevens van de eigenaar lezen. Schadelijke toepassingen kunnen hiermee gegevens van de eigenaar lezen."</string>
+    <string name="permlab_readCalendar">"agendagegevens lezen"</string>
+    <string name="permdesc_readCalendar">"Hiermee kan een toepassing alle agendagebeurtenissen lezen die zijn opgeslagen op uw telefoon. Schadelijke toepassingen kunnen hiervan gebruik maken om uw agendagebeurtenissen te verzenden naar andere personen."</string>
+    <string name="permlab_writeCalendar">"agendagegevens schrijven"</string>
+    <string name="permdesc_writeCalendar">"Hiermee kan een toepassing de op uw telefoon opgeslagen agendagebeurtenissen wijzigen. Schadelijke toepassingen kunnen hiermee uw agendagegevens verwijderen of wijzigen."</string>
+    <string name="permlab_accessMockLocation">"neplocatiebronnen voor test"</string>
+    <string name="permdesc_accessMockLocation">"Neplocatiebronnen voor testdoeleinden maken. Schadelijke toepassingen kunnen dit gebruiken om de locatie en/of status te overschrijven die door de echte locatiebronnen wordt aangegeven, zoals GPS of netwerkaanbieders."</string>
+    <string name="permlab_accessLocationExtraCommands">"toegang opdrachten aanbieder extra locaties"</string>
+    <string name="permdesc_accessLocationExtraCommands">"Toegang tot opdrachten aanbieder extra locaties. Schadelijke toepassingen kunnen hiervan gebruik maken om de werking van GPS of andere locatiebronnen te verstoren."</string>
+    <string name="permlab_accessFineLocation">"nauwkeurige (GPS) locatie"</string>
+    <string name="permdesc_accessFineLocation">"Toegang tot exacte locatiebronnen, zoals het Global Positioning System op de telefoon, indien beschikbaar. Schadelijke toepassingen kunnen dit gebruiken om te bepalen waar u zich bevindt en mogelijk extra acculading verbruiken."</string>
+    <string name="permlab_accessCoarseLocation">"globale (netwerkgebaseerde) locatie"</string>
+    <string name="permdesc_accessCoarseLocation">"Toegang tot globale locatiebronnen, zoals de mobiele netwerkdatabase om een globale telefoonlocatie te bepalen, indien beschikbaar. Schadelijke toepassingen kunnen hiervan gebruik maken om bij benadering te bepalen waar u zich bevindt."</string>
+    <string name="permlab_accessSurfaceFlinger">"toegang tot SurfaceFlinger"</string>
+    <string name="permdesc_accessSurfaceFlinger">"Hiermee kan een toepassing SurfaceFlinger-functies op laag niveau gebruiken."</string>
+    <string name="permlab_readFrameBuffer">"framebuffer lezen"</string>
+    <string name="permdesc_readFrameBuffer">"Hiermee kan een toepassing de inhoud van de framebuffer lezen."</string>
+    <string name="permlab_modifyAudioSettings">"uw audio-instellingen wijzigen"</string>
+    <string name="permdesc_modifyAudioSettings">"Hiermee kan een toepassing de algemene audio-instellingen, zoals volume en omleiding, wijzigen."</string>
+    <string name="permlab_recordAudio">"audio opnemen"</string>
+    <string name="permdesc_recordAudio">"Hiermee krijgt de toepassing toegang tot het audio-opnamepad."</string>
+    <string name="permlab_camera">"foto\'s maken"</string>
+    <string name="permdesc_camera">"Hiermee kan een toepassing foto\'s maken met de camera. De toepassing kan op deze manier op elk gewenste moment foto\'s verzamelen van wat de camera ziet."</string>
+    <string name="permlab_brick">"telefoon permanent uitschakelen"</string>
+    <string name="permdesc_brick">"Hiermee kan de toepassing de telefoon permanent uitschakelen. Dit is erg gevaarlijk."</string>
+    <string name="permlab_reboot">"telefoon gedwongen opnieuw opstarten"</string>
+    <string name="permdesc_reboot">"Hiermee kan de toepassing de telefoon gedwongen opnieuw opstarten."</string>
+    <string name="permlab_mount_unmount_filesystems">"bestandssystemen koppelen en ontkoppelen"</string>
+    <string name="permdesc_mount_unmount_filesystems">"Hiermee kan de toepassing bestandssystemen koppelen en ontkoppelen voor verwisselbare opslagruimte."</string>
+    <string name="permlab_vibrate">"trilstand beheren"</string>
+    <string name="permdesc_vibrate">"Hiermee kan de toepassing de trilstand beheren."</string>
+    <string name="permlab_flashlight">"zaklamp bedienen"</string>
+    <string name="permdesc_flashlight">"Hiermee kan de toepassing de zaklamp bedienen."</string>
+    <string name="permlab_hardware_test">"hardware testen"</string>
+    <string name="permdesc_hardware_test">"Hiermee kan de toepassing verschillende randapparaten beheren om de hardware te testen."</string>
+    <string name="permlab_callPhone">"telefoonnummers rechtstreeks bellen"</string>
+    <string name="permdesc_callPhone">"Hiermee kan de toepassing telefoonnummers bellen zonder uw tussenkomst. Door schadelijke toepassingen kunnen onverwachte oproepen op uw telefoonrekening verschijnen. De toepassing kan hiermee geen alarmnummers bellen."</string>
+    <string name="permlab_callPrivileged">"alle telefoonnummers rechtstreeks bellen"</string>
+    <string name="permdesc_callPrivileged">"Hiermee kan een toepassing elk telefoonnummer, inclusief alarmnummers, bellen zonder uw tussenkomst. Schadelijke toepassingen kunnen onnodige en illegale oproepen uitvoeren naar alarmdiensten."</string>
+    <string name="permlab_locationUpdates">"meldingen over locatie-updates beheren"</string>
+    <string name="permdesc_locationUpdates">"Hiermee kunnen updatemeldingen voor locaties van de radio worden ingeschakeld/uitgeschakeld. Niet voor gebruik door normale toepassingen."</string>
+    <string name="permlab_checkinProperties">"toegang tot checkin-eigenschappen"</string>
+    <string name="permdesc_checkinProperties">"Hiermee wordt lees-/schrijftoegang gegeven tot eigenschappen die door de checkin-service zijn geüpload. Niet voor gebruik door normale toepassingen."</string>
+    <string name="permlab_modifyPhoneState">"telefoonstatus wijzigen"</string>
+    <string name="permdesc_modifyPhoneState">"Hiermee kan de toepassing de telefoonfuncties van het apparaat beheren. Een toepassing met deze machtiging kan schakelen tussen netwerken, de radio van de telefoon in- of uitschakelen en dergelijke zonder dat u hiervan op de hoogte wordt gesteld."</string>
+    <string name="permlab_readPhoneState">"telefoonstatus lezen"</string>
+    <string name="permdesc_readPhoneState">"Hiermee krijgt de toepassing toegang tot de telefoonfuncties van het apparaat. Een toepassing met de betreffende machtiging kan het telefoonnummer van deze telefoon achterhalen, bepalen of een oproep actief is, het gekozen nummer achterhalen en dergelijke."</string>
+    <string name="permlab_wakeLock">"voorkomen dat telefoon overschakelt naar slaapmodus"</string>
+    <string name="permdesc_wakeLock">"Hiermee kan een toepassing voorkomen dat de telefoon overschakelt naar de slaapmodus."</string>
+    <string name="permlab_devicePower">"telefoon in- of uitschakelen"</string>
+    <string name="permdesc_devicePower">"Hiermee kan de toepassing de telefoon in- of uitschakelen."</string>
+    <string name="permlab_factoryTest">"uitvoeren in fabriekstestmodus"</string>
+    <string name="permdesc_factoryTest">"Uitvoeren als fabrikanttest op laag niveau, waardoor toegang wordt gegeven tot de hardware van de telefoon. Alleen beschikbaar als een telefoon zich in de fabrikanttestmodus bevindt."</string>
+    <string name="permlab_setWallpaper">"achtergrond instellen"</string>
+    <string name="permdesc_setWallpaper">"Hiermee kan de toepassing de systeemachtergrond instellen."</string>
+    <string name="permlab_setWallpaperHints">"grootte achtergrond instellen"</string>
+    <string name="permdesc_setWallpaperHints">"Hiermee kan de toepassing de grootte van de achtergrond instellen."</string>
+    <string name="permlab_masterClear">"systeem terugzetten op fabrieksinstellingen"</string>
+    <string name="permdesc_masterClear">"Hiermee kan een toepassing het systeem terugzetten op de fabrieksinstellingen, waarbij alle gegevens, configuraties en geïnstalleerde toepassingen worden verwijderd."</string>
+    <string name="permlab_setTimeZone">"tijdzone instellen"</string>
+    <string name="permdesc_setTimeZone">"Hiermee kan een toepassing de tijdzone van de telefoon wijzigen."</string>
+    <string name="permlab_getAccounts">"bekende accounts zoeken"</string>
+    <string name="permdesc_getAccounts">"Hiermee kan een toepassing de lijst met accounts van een telefoon ophalen."</string>
+    <string name="permlab_accessNetworkState">"netwerkstatus bekijken"</string>
+    <string name="permdesc_accessNetworkState">"Hiermee kan een toepassing de status van alle netwerken bekijken."</string>
+    <string name="permlab_createNetworkSockets">"volledige internettoegang"</string>
+    <string name="permdesc_createNetworkSockets">"Hiermee kan een toepassing netwerksockets maken."</string>
+    <string name="permlab_writeApnSettings">"instellingen voor toegangspuntnaam schrijven"</string>
+    <string name="permdesc_writeApnSettings">"Hiermee kan een toepassing de APN-instellingen, zoals proxy en poort, van elke APN wijzigen."</string>
+    <string name="permlab_changeNetworkState">"netwerkverbinding wijzigen"</string>
+    <string name="permdesc_changeNetworkState">"Hiermee kan een toepassing de verbindingsstatus van het netwerk wijzigen."</string>
+    <string name="permlab_accessWifiState">"Wi-Fi-status bekijken"</string>
+    <string name="permdesc_accessWifiState">"Hiermee kan een toepassing informatie over de Wi-Fi-status bekijken."</string>
+    <string name="permlab_changeWifiState">"Wi-Fi-status wijzigen"</string>
+    <string name="permdesc_changeWifiState">"Hiermee kan een toepassing zich koppelen aan en loskoppelen van Wi-Fi toegangspunten en wijzigingen aanbrengen in geconfigureerde Wi-Fi-netwerken."</string>
+    <string name="permlab_bluetoothAdmin">"bluetooth-beheer"</string>
+    <string name="permdesc_bluetoothAdmin">"Hiermee kan een toepassing de lokale Bluetooth-telefoon configureren en externe apparaten zoeken en aansluiten."</string>
+    <string name="permlab_bluetooth">"Bluetooth-verbindingen maken"</string>
+    <string name="permdesc_bluetooth">"Hiermee kan een toepassing de configuratie van een lokale Bluetooth-telefoon bekijken en verbindingen met gekoppelde apparaten maken en accepteren."</string>
+    <string name="permlab_disableKeyguard">"toetsblokkering uitschakelen"</string>
+    <string name="permdesc_disableKeyguard">"Hiermee kan een toepassing de toetsblokkering en bijbehorende wachtwoordbeveiliging uitschakelen. Een voorbeeld: de telefoon schakelt de toetsblokkering uit als er een oproep binnenkomt en schakelt de toetsblokkering weer in als de oproep is beëindigd."</string>
+    <string name="permlab_readSyncSettings">"synchronisatie-instellingen lezen"</string>
+    <string name="permdesc_readSyncSettings">"Hiermee kan een toepassing de synchronisatie-instellingen lezen, bijvoorbeeld of de synchronisatie van contactpersonen is ingeschakeld."</string>
+    <string name="permlab_writeSyncSettings">"synchronisatie-instellingen schrijven"</string>
+    <string name="permdesc_writeSyncSettings">"Hiermee kan een toepassing uw synchronisatie-instellingen wijzigen, bijvoorbeeld of de synchronisatie van contactpersonen is ingeschakeld."</string>
+    <string name="permlab_readSyncStats">"synchronisatiestatistieken lezen"</string>
+    <string name="permdesc_readSyncStats">"Hiermee kan een toepassing de synchronisatiestatistieken lezen, zoals de geschiedenis van uitgevoerde synchronisaties."</string>
+    <string name="permlab_subscribedFeedsRead">"geabonneerde feeds lezen"</string>
+    <string name="permdesc_subscribedFeedsRead">"Hiermee kan een toepassing details over de huidige gesynchroniseerde feeds achterhalen."</string>
+    <string name="permlab_subscribedFeedsWrite">"geabonneerde feeds schrijven"</string>
+    <string name="permdesc_subscribedFeedsWrite">"Hiermee kan een toepassing uw huidige gesynchroniseerde feeds wijzigen. Een schadelijke toepassing kan op deze manier uw gesynchroniseerde feeds wijzigen."</string>
+  <string-array name="phoneTypes">
+    <item>"Thuis"</item>
+    <item>"Mobiel"</item>
+    <item>"Werk"</item>
+    <item>"Fax werk"</item>
+    <item>"Fax thuis"</item>
+    <item>"Semafoon"</item>
+    <item>"Overig"</item>
+    <item>"Aangepast"</item>
+  </string-array>
+  <string-array name="emailAddressTypes">
+    <item>"Thuis"</item>
+    <item>"Werk"</item>
+    <item>"Overig"</item>
+    <item>"Aangepast"</item>
+  </string-array>
+  <string-array name="postalAddressTypes">
+    <item>"Thuis"</item>
+    <item>"Werk"</item>
+    <item>"Overig"</item>
+    <item>"Aangepast"</item>
+  </string-array>
+  <string-array name="imAddressTypes">
+    <item>"Thuis"</item>
+    <item>"Werk"</item>
+    <item>"Overig"</item>
+    <item>"Aangepast"</item>
+  </string-array>
+  <string-array name="organizationTypes">
+    <item>"Werk"</item>
+    <item>"Overig"</item>
+    <item>"Aangepast"</item>
+  </string-array>
+  <string-array name="imProtocols">
+    <item>"AIM"</item>
+    <item>"Windows Live"</item>
+    <item>"Yahoo"</item>
+    <item>"Skype"</item>
+    <item>"QQ"</item>
+    <item>"Google Talk"</item>
+    <item>"ICQ"</item>
+    <item>"Jabber"</item>
+  </string-array>
+    <string name="keyguard_password_enter_pin_code">"PIN-code invoeren"</string>
+    <string name="keyguard_password_wrong_pin_code">"Onjuiste PIN-code!"</string>
+    <string name="keyguard_label_text">"Druk op \'Menu\' en vervolgens op 0 om te deblokkeren."</string>
+    <string name="emergency_call_dialog_number_for_display">"Alarmnummer"</string>
+    <string name="lockscreen_carrier_default">"(Geen service)"</string>
+    <string name="lockscreen_screen_locked">"Scherm geblokkeerd."</string>
+    <string name="lockscreen_instructions_when_pattern_enabled">"Druk op \'Menu\' om te deblokkeren of noodoproep te plaatsen."</string>
+    <string name="lockscreen_instructions_when_pattern_disabled">"Druk op \'Menu\' om te deblokkeren."</string>
+    <string name="lockscreen_pattern_instructions">"Patroon tekenen om te deblokkeren"</string>
+    <string name="lockscreen_emergency_call">"Noodoproep"</string>
+    <string name="lockscreen_pattern_correct">"Juist!"</string>
+    <string name="lockscreen_pattern_wrong">"Probeer het opnieuw"</string>
+    <string name="lockscreen_plugged_in">"Opladen (<xliff:g id="NUMBER">%d%%</xliff:g>)"</string>
+    <string name="lockscreen_low_battery">"Sluit de oplader aan."</string>
+    <string name="lockscreen_missing_sim_message_short">"Geen SIM-kaart."</string>
+    <string name="lockscreen_missing_sim_message">"Geen SIM-kaart in telefoon."</string>
+    <string name="lockscreen_missing_sim_instructions">"Plaats een SIM-kaart."</string>
+    <string name="lockscreen_network_locked_message">"Netwerk geblokkeerd"</string>
+    <string name="lockscreen_sim_puk_locked_message">"SIM-kaart is geblokkeerd met PUK-code."</string>
+    <string name="lockscreen_sim_puk_locked_instructions">"Neem contact op met de klantenservice."</string>
+    <string name="lockscreen_sim_locked_message">"SIM-kaart is geblokkeerd."</string>
+    <string name="lockscreen_sim_unlock_progress_dialog_message">"SIM-kaart deblokkeren..."</string>
+    <string name="lockscreen_too_many_failed_attempts_dialog_message">"U heeft uw deblokkeringspatroon <xliff:g id="NUMBER_0">%d</xliff:g> keer onjuist getekend. "\n\n"Probeer het over <xliff:g id="NUMBER_1">%d</xliff:g> seconden opnieuw."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin">"U heeft uw deblokkeringspatroon <xliff:g id="NUMBER_0">%d</xliff:g> keer onjuist getekend. Na nog eens <xliff:g id="NUMBER_1">%d</xliff:g> mislukte pogingen, wordt u gevraagd om uw telefoon te deblokkeren met uw Google aanmelding."\n\n" Probeer het over <xliff:g id="NUMBER_2">%d</xliff:g> seconden opnieuw."</string>
+    <string name="lockscreen_too_many_failed_attempts_countdown">"Probeer het over <xliff:g id="NUMBER">%d</xliff:g> seconden opnieuw."</string>
+    <string name="lockscreen_forgot_pattern_button_text">"Patroon vergeten?"</string>
+    <string name="lockscreen_glogin_too_many_attempts">"Te veel patroonpogingen!"</string>
+    <string name="lockscreen_glogin_instructions">"U moet zich aanmelden bij uw Google-account"\n"om te deblokkeren"</string>
+    <string name="lockscreen_glogin_username_hint">"Gebruikersnaam (e-mail)"</string>
+    <string name="lockscreen_glogin_password_hint">"Wachtwoord"</string>
+    <string name="lockscreen_glogin_submit_button">"Aanmelden"</string>
+    <string name="lockscreen_glogin_invalid_input">"Gebruikersnaam of wachtwoord ongeldig."</string>
+    <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
+    <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+    <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+    <!-- no translation found for hour_ampm (7618670480400517084) -->
+    <skip />
+    <!-- no translation found for hour_cap_ampm (5117798389811605468) -->
+    <skip />
+    <string name="status_bar_clear_all_button">"Meldingen wissen"</string>
+    <string name="status_bar_no_notifications_title">"Geen meldingen"</string>
+    <string name="status_bar_ongoing_events_title">"Actief"</string>
+    <string name="status_bar_latest_events_title">"Meldingen"</string>
+    <!-- no translation found for battery_status_text_percent_format (8818848472818880005) -->
+    <skip />
+    <string name="battery_status_charging">"Opladen..."</string>
+    <string name="battery_low_title">"Sluit de oplader aan"</string>
+    <string name="battery_low_subtitle">"De accu raakt op:"</string>
+    <string name="battery_low_percent_format">"minder dan <xliff:g id="NUMBER">%d%%</xliff:g> resterend."</string>
+    <string name="factorytest_failed">"Fabriekstest mislukt"</string>
+    <string name="factorytest_not_system">"De actie FACTORY_TEST wordt alleen ondersteund voor pakketten die zijn geïnstalleerd in /system/app."</string>
+    <string name="factorytest_no_action">"Er is geen pakket gevonden dat de actie FACTORY_TEST levert."</string>
+    <string name="factorytest_reboot">"Opnieuw opstarten"</string>
+    <string name="save_password_label">"Bevestigen"</string>
+    <string name="save_password_message">"Wilt u dat de browser dit wachtwoord onthoudt?"</string>
+    <string name="save_password_notnow">"Niet nu"</string>
+    <string name="save_password_remember">"Onthouden"</string>
+    <string name="save_password_never">"Nooit"</string>
+    <string name="open_permission_deny">"U heeft geen toestemming om deze pagina te openen."</string>
+    <string name="text_copied">"Tekst naar klembord gekopieerd."</string>
+    <string name="more_item_label">"Meer"</string>
+    <string name="prepend_shortcut_label">"Menu+"</string>
+    <string name="menu_space_shortcut_label">"ruimte"</string>
+    <string name="menu_enter_shortcut_label">"invoeren"</string>
+    <string name="menu_delete_shortcut_label">"verwijderen"</string>
+    <string name="search_go">"Zoeken"</string>
+    <string name="today">"Vandaag"</string>
+    <string name="yesterday">"Gisteren"</string>
+    <string name="tomorrow">"Morgen"</string>
+    <string name="oneMonthDurationPast">"1 maand geleden"</string>
+    <string name="beforeOneMonthDurationPast">"Meer dan 1 maand geleden"</string>
+  <plurals name="num_seconds_ago">
+    <item quantity="one">"1 seconde geleden"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> seconden geleden"</item>
+  </plurals>
+  <plurals name="num_minutes_ago">
+    <item quantity="one">"1 minuut geleden"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> minuten geleden"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one">"1 uur geleden"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> uur geleden"</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one">"gisteren"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> dagen geleden"</item>
+  </plurals>
+  <plurals name="in_num_seconds">
+    <item quantity="one">"over 1 seconde"</item>
+    <item quantity="other">"over <xliff:g id="COUNT">%d</xliff:g> seconden"</item>
+  </plurals>
+  <plurals name="in_num_minutes">
+    <item quantity="one">"over 1 minuut"</item>
+    <item quantity="other">"over <xliff:g id="COUNT">%d</xliff:g> minuten"</item>
+  </plurals>
+  <plurals name="in_num_hours">
+    <item quantity="one">"over 1 uur"</item>
+    <item quantity="other">"over <xliff:g id="COUNT">%d</xliff:g> uur"</item>
+  </plurals>
+  <plurals name="in_num_days">
+    <item quantity="one">"morgen"</item>
+    <item quantity="other">"over <xliff:g id="COUNT">%d</xliff:g> dagen"</item>
+  </plurals>
+    <!-- no translation found for abbrev_num_seconds_ago:one (1849036840200069118) -->
+    <!-- no translation found for abbrev_num_seconds_ago:other (3699169366650930415) -->
+    <!-- no translation found for abbrev_num_minutes_ago:one (6361490147113871545) -->
+    <!-- no translation found for abbrev_num_minutes_ago:other (851164968597150710) -->
+    <!-- no translation found for abbrev_num_hours_ago:one (4796212039724722116) -->
+    <!-- no translation found for abbrev_num_hours_ago:other (6889970745748538901) -->
+    <!-- no translation found for abbrev_num_days_ago:one (8463161711492680309) -->
+    <!-- no translation found for abbrev_num_days_ago:other (3453342639616481191) -->
+    <!-- no translation found for abbrev_in_num_seconds:one (5842225370795066299) -->
+    <!-- no translation found for abbrev_in_num_seconds:other (5495880108825805108) -->
+    <!-- no translation found for abbrev_in_num_minutes:one (562786149928284878) -->
+    <!-- no translation found for abbrev_in_num_minutes:other (4216113292706568726) -->
+    <!-- no translation found for abbrev_in_num_hours:one (3274708118124045246) -->
+    <!-- no translation found for abbrev_in_num_hours:other (3705373766798013406) -->
+    <!-- no translation found for abbrev_in_num_days:one (2178576254385739855) -->
+    <!-- no translation found for abbrev_in_num_days:other (2973062968038355991) -->
+    <string name="preposition_for_date">"op %s"</string>
+    <string name="preposition_for_time">"om %s"</string>
+    <string name="preposition_for_year">"in %s"</string>
+    <string name="day">"dag"</string>
+    <string name="days">"dagen"</string>
+    <string name="hour">"uur"</string>
+    <string name="hours">"uren"</string>
+    <string name="minute">"min"</string>
+    <string name="minutes">"minuten"</string>
+    <string name="second">"sec"</string>
+    <string name="seconds">"seconden"</string>
+    <string name="week">"week"</string>
+    <string name="weeks">"weken"</string>
+    <string name="year">"jaar"</string>
+    <string name="years">"jaren"</string>
+    <string name="sunday">"Zondag"</string>
+    <string name="monday">"Maandag"</string>
+    <string name="tuesday">"Dinsdag"</string>
+    <string name="wednesday">"Woensdag"</string>
+    <string name="thursday">"Donderdag"</string>
+    <string name="friday">"Vrijdag"</string>
+    <string name="saturday">"Zaterdag"</string>
+    <string name="every_weekday">"Elke weekdag (ma-vr)"</string>
+    <string name="daily">"Dagelijks"</string>
+    <string name="weekly">"Wekelijks op <xliff:g id="DAY">%s</xliff:g>"</string>
+    <string name="monthly">"Maandelijks"</string>
+    <string name="yearly">"Jaarlijks"</string>
+    <string name="VideoView_error_title">"Video kan niet worden afgespeeld"</string>
+    <string name="VideoView_error_text_unknown">"Deze video kan niet worden afgespeeld."</string>
+    <string name="VideoView_error_button">"OK"</string>
+    <string name="am">"am"</string>
+    <string name="pm">"pm"</string>
+    <string name="numeric_date">"<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
+    <string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string>
+    <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
+    <string name="date1_date2">"<xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>"</string>
+    <string name="time1_time2">"<xliff:g id="TIME1">%1$s</xliff:g> – <xliff:g id="TIME2">%2$s</xliff:g>"</string>
+    <string name="time_wday_date">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>, <xliff:g id="DATE">%3$s</xliff:g>"</string>
+    <string name="wday_date">"<xliff:g id="WEEKDAY">%2$s</xliff:g>, <xliff:g id="DATE">%3$s</xliff:g>"</string>
+    <string name="time_date">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="DATE">%3$s</xliff:g>"</string>
+    <!-- no translation found for date_time (6104442718633642836) -->
+    <skip />
+    <!-- no translation found for relative_time (1818557177829411417) -->
+    <skip />
+    <string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string>
+    <string name="full_date_month_first">"<xliff:g id="MONTH">MMMM</xliff:g> <xliff:g id="DAY">dd</xliff:g>, <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="full_date_day_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMMM</xliff:g>, <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="medium_date_month_first">"<xliff:g id="MONTH">MMM</xliff:g> <xliff:g id="DAY">dd</xliff:g>, <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="medium_date_day_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMM</xliff:g>, <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="twelve_hour_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">a</xliff:g>"</string>
+    <string name="twenty_four_hour_time_format">"<xliff:g id="HOUR">H</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g>"</string>
+    <string name="noon">"twaalf uur \'s middags"</string>
+    <string name="Noon">"Twaalf uur \'s middags"</string>
+    <string name="midnight">"middernacht"</string>
+    <string name="Midnight">"Middernacht"</string>
+    <!-- no translation found for month_day (5565829181417740906) -->
+    <skip />
+    <!-- no translation found for month (7026169712234774086) -->
+    <skip />
+    <string name="month_day_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <!-- no translation found for month_year (9219019380312413367) -->
+    <skip />
+    <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
+    <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <string name="same_year_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>"</string>
+    <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>"</string>
+    <string name="same_year_mdy1_mdy2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR">%9$s</xliff:g>"</string>
+    <string name="same_year_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="YEAR">%9$s</xliff:g>"</string>
+    <string name="same_year_md1_time1_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_year_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_year_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>"</string>
+    <string name="numeric_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>"</string>
+    <string name="numeric_mdy1_mdy2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="numeric_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="numeric_md1_time1_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>"</string>
+    <string name="same_month_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>"</string>
+    <string name="same_month_mdy1_mdy2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="same_month_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="same_month_md1_time1_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="abbrev_month_day_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <!-- no translation found for abbrev_month_year (3856424847226891943) -->
+    <skip />
+    <!-- no translation found for abbrev_month_day (5028815883653985933) -->
+    <skip />
+    <!-- no translation found for abbrev_month (3131032032850777433) -->
+    <skip />
+    <string name="day_of_week_long_sunday">"Zondag"</string>
+    <string name="day_of_week_long_monday">"Maandag"</string>
+    <string name="day_of_week_long_tuesday">"Dinsdag"</string>
+    <string name="day_of_week_long_wednesday">"Woensdag"</string>
+    <string name="day_of_week_long_thursday">"Donderdag"</string>
+    <string name="day_of_week_long_friday">"Vrijdag"</string>
+    <string name="day_of_week_long_saturday">"Zaterdag"</string>
+    <string name="day_of_week_medium_sunday">"Zo"</string>
+    <string name="day_of_week_medium_monday">"Ma"</string>
+    <string name="day_of_week_medium_tuesday">"Di"</string>
+    <string name="day_of_week_medium_wednesday">"Wo"</string>
+    <string name="day_of_week_medium_thursday">"Do"</string>
+    <string name="day_of_week_medium_friday">"Vr"</string>
+    <string name="day_of_week_medium_saturday">"Za"</string>
+    <string name="day_of_week_short_sunday">"Zo"</string>
+    <string name="day_of_week_short_monday">"Ma"</string>
+    <string name="day_of_week_short_tuesday">"Di"</string>
+    <string name="day_of_week_short_wednesday">"Wo"</string>
+    <string name="day_of_week_short_thursday">"Do"</string>
+    <string name="day_of_week_short_friday">"Vr"</string>
+    <string name="day_of_week_short_saturday">"Za"</string>
+    <string name="day_of_week_shorter_sunday">"Zo"</string>
+    <string name="day_of_week_shorter_monday">"M"</string>
+    <string name="day_of_week_shorter_tuesday">"Di"</string>
+    <string name="day_of_week_shorter_wednesday">"W"</string>
+    <string name="day_of_week_shorter_thursday">"Do"</string>
+    <string name="day_of_week_shorter_friday">"V"</string>
+    <string name="day_of_week_shorter_saturday">"Za"</string>
+    <string name="day_of_week_shortest_sunday">"Z"</string>
+    <string name="day_of_week_shortest_monday">"M"</string>
+    <string name="day_of_week_shortest_tuesday">"D"</string>
+    <string name="day_of_week_shortest_wednesday">"W"</string>
+    <string name="day_of_week_shortest_thursday">"D"</string>
+    <string name="day_of_week_shortest_friday">"V"</string>
+    <string name="day_of_week_shortest_saturday">"Z"</string>
+    <string name="month_long_january">"Januari"</string>
+    <string name="month_long_february">"Februari"</string>
+    <string name="month_long_march">"Maart"</string>
+    <string name="month_long_april">"April"</string>
+    <string name="month_long_may">"Mei"</string>
+    <string name="month_long_june">"Juni"</string>
+    <string name="month_long_july">"Juli"</string>
+    <string name="month_long_august">"Augustus"</string>
+    <string name="month_long_september">"September"</string>
+    <string name="month_long_october">"Oktober"</string>
+    <string name="month_long_november">"November"</string>
+    <string name="month_long_december">"December"</string>
+    <string name="month_medium_january">"Jan"</string>
+    <string name="month_medium_february">"Feb"</string>
+    <string name="month_medium_march">"Mrt"</string>
+    <string name="month_medium_april">"Apr"</string>
+    <string name="month_medium_may">"Mei"</string>
+    <string name="month_medium_june">"Jun"</string>
+    <string name="month_medium_july">"Jul"</string>
+    <string name="month_medium_august">"Aug"</string>
+    <string name="month_medium_september">"Sep"</string>
+    <string name="month_medium_october">"Okt"</string>
+    <string name="month_medium_november">"Nov"</string>
+    <string name="month_medium_december">"Dec"</string>
+    <string name="month_shortest_january">"J"</string>
+    <string name="month_shortest_february">"V"</string>
+    <string name="month_shortest_march">"M"</string>
+    <string name="month_shortest_april">"A"</string>
+    <string name="month_shortest_may">"M"</string>
+    <string name="month_shortest_june">"J"</string>
+    <string name="month_shortest_july">"J"</string>
+    <string name="month_shortest_august">"A"</string>
+    <string name="month_shortest_september">"S"</string>
+    <string name="month_shortest_october">"O"</string>
+    <string name="month_shortest_november">"N"</string>
+    <string name="month_shortest_december">"D"</string>
+    <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+    <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
+    <string name="selectAll">"Alles selecteren"</string>
+    <string name="selectText">"Tekst selecteren"</string>
+    <string name="stopSelectingText">"Stoppen met tekst selecteren"</string>
+    <string name="cut">"Knippen"</string>
+    <string name="cutAll">"Alles knippen"</string>
+    <string name="copy">"Kopiëren"</string>
+    <string name="copyAll">"Alles kopiëren"</string>
+    <string name="paste">"Plakken"</string>
+    <string name="copyUrl">"URL kopiëren"</string>
+    <string name="inputMethod">"Invoermethode"</string>
+    <string name="editTextMenuTitle">"Tekst bewerken"</string>
+    <string name="low_internal_storage_view_title">"Weinig ruimte"</string>
+    <string name="low_internal_storage_view_text">"Opslagruimte van telefoon raakt op."</string>
+    <string name="ok">"OK"</string>
+    <string name="cancel">"Annuleren"</string>
+    <string name="yes">"OK"</string>
+    <string name="no">"Annuleren"</string>
+    <string name="capital_on">"AAN"</string>
+    <string name="capital_off">"UIT"</string>
+    <string name="whichApplication">"Actie voltooien met"</string>
+    <string name="alwaysUse">"Standaard gebruiken voor deze actie."</string>
+    <string name="clearDefaultHintMsg">"Wis standaardinstelling via startscherm: \'Instellingen\' &gt; \'Toepassingen\' &gt; \'Toepassingen beheren\'."</string>
+    <string name="chooseActivity">"Een actie selecteren"</string>
+    <string name="noApplications">"Geen enkele toepassing kan deze actie uitvoeren."</string>
+    <string name="aerr_title">"Helaas!"</string>
+    <string name="aerr_application">"De toepassing <xliff:g id="APPLICATION">%1$s</xliff:g> (proces <xliff:g id="PROCESS">%2$s</xliff:g>) is onverwachts gestopt. Probeer het opnieuw."</string>
+    <string name="aerr_process">"Het proces <xliff:g id="PROCESS">%1$s</xliff:g> is onverwachts gestopt. Probeer het opnieuw."</string>
+    <string name="anr_title">"Helaas!"</string>
+    <string name="anr_activity_application">"Activiteit <xliff:g id="ACTIVITY">%1$s</xliff:g> (in toepassing <xliff:g id="APPLICATION">%2$s</xliff:g>) reageert niet."</string>
+    <string name="anr_activity_process">"Activiteit <xliff:g id="ACTIVITY">%1$s</xliff:g> (in proces <xliff:g id="PROCESS">%2$s</xliff:g>) reageert niet."</string>
+    <string name="anr_application_process">"Toepassing <xliff:g id="APPLICATION">%1$s</xliff:g> (in proces <xliff:g id="PROCESS">%2$s</xliff:g>) reageert niet."</string>
+    <string name="anr_process">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> reageert niet."</string>
+    <string name="force_close">"Gedwongen sluiten"</string>
+    <string name="wait">"Wachten"</string>
+    <string name="debug">"Foutopsporing"</string>
+    <string name="sendText">"Selecteer een actie voor tekst"</string>
+    <string name="volume_ringtone">"Belvolume"</string>
+    <string name="volume_music">"Mediavolume"</string>
+    <string name="volume_music_hint_playing_through_bluetooth">"Afspelen via Bluetooth"</string>
+    <string name="volume_call">"Volume inkomende oproep"</string>
+    <string name="volume_call_hint_playing_through_bluetooth">"Afspelen via Bluetooth"</string>
+    <string name="volume_alarm">"Alarmvolume"</string>
+    <string name="volume_notification">"Meldingsvolume"</string>
+    <string name="volume_unknown">"Volume"</string>
+    <string name="ringtone_default">"Standaardbeltoon"</string>
+    <string name="ringtone_default_with_actual">"Standaardbeltoon (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+    <string name="ringtone_silent">"Stil"</string>
+    <string name="ringtone_picker_title">"Beltonen"</string>
+    <string name="ringtone_unknown">"Onbekende beltoon"</string>
+  <plurals name="wifi_available">
+    <item quantity="one">"Wi-Fi-netwerk beschikbaar"</item>
+    <item quantity="other">"Wi-Fi-netwerken beschikbaar"</item>
+  </plurals>
+  <plurals name="wifi_available_detailed">
+    <item quantity="one">"Open Wi-Fi-netwerk beschikbaar"</item>
+    <item quantity="other">"Open Wi-Fi-netwerken beschikbaar"</item>
+  </plurals>
+    <string name="select_character">"Teken invoegen"</string>
+    <string name="sms_control_default_app_name">"Onbekende toepassing"</string>
+    <string name="sms_control_title">"SMS-berichten verzenden"</string>
+    <string name="sms_control_message">"Er wordt een groot aantal SMS-berichten verzonden. Selecteer \'OK\' om door te gaan of \'Annuleren\' om de verzending te stoppen."</string>
+    <string name="sms_control_yes">"OK"</string>
+    <string name="sms_control_no">"Annuleren"</string>
+    <string name="date_time_set">"Instellen"</string>
+    <string name="default_permission_group">"Standaard"</string>
+    <string name="no_permissions">"Geen machtigingen vereist"</string>
+    <string name="perms_hide"><b>"Verbergen"</b></string>
+    <string name="perms_show_all"><b>"Alles weergeven"</b></string>
+    <string name="googlewebcontenthelper_loading">"Laden..."</string>
+    <string name="usb_storage_title">"USB-verbinding"</string>
+    <string name="usb_storage_message">"U heeft uw telefoon via USB op uw computer aangesloten. Selecteer \'Koppelen\' als u bestanden tussen uw computer en de SD-kaart van uw telefoon wilt kopiëren."</string>
+    <string name="usb_storage_button_mount">"Koppelen"</string>
+    <string name="usb_storage_button_unmount">"Niet koppelen"</string>
+    <string name="usb_storage_error_message">"Er is een probleem bij het gebruik van uw SD-kaart voor USB-opslag."</string>
+    <string name="usb_storage_notification_title">"USB-verbinding"</string>
+    <string name="usb_storage_notification_message">"Selecteer dit om bestanden naar/van uw computer te kopiëren."</string>
+    <string name="select_input_method">"Invoermethode selecteren"</string>
+    <string name="fast_scroll_alphabet">"ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="fast_scroll_numeric_alphabet">"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="candidates_style"><font fgcolor="#ff000000" bgcolor="#ff8080ff"><u>"kandidaten"</u>"u&gt;"</font></string>
+</resources>
diff --git a/core/res/res/values-pl/arrays.xml b/core/res/res/values-pl/arrays.xml
new file mode 100644 (file)
index 0000000..f9c904b
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
new file mode 100644 (file)
index 0000000..c3cf8a1
--- /dev/null
@@ -0,0 +1,724 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="byteShort">"B"</string>
+    <string name="kilobyteShort">"KB"</string>
+    <string name="megabyteShort">"MB"</string>
+    <string name="gigabyteShort">"GB"</string>
+    <string name="terabyteShort">"TB"</string>
+    <string name="petabyteShort">"PB"</string>
+    <string name="untitled">"&lt;bez nazwy&gt;"</string>
+    <string name="ellipsis">"…"</string>
+    <string name="emptyPhoneNumber">"(Brak numeru telefonu)"</string>
+    <string name="unknownName">"(Nieznany)"</string>
+    <string name="defaultVoiceMailAlphaTag">"Poczta głosowa"</string>
+    <string name="defaultMsisdnAlphaTag">"MSISDN1"</string>
+    <string name="mmiError">"Problem z połączeniem lub błędny kod MMI."</string>
+    <string name="serviceEnabled">"Usługa była włączona."</string>
+    <string name="serviceEnabledFor">"Usługa została włączona dla:"</string>
+    <string name="serviceDisabled">"Usługa została wyłączona."</string>
+    <string name="serviceRegistered">"Rejestracja powiodła się."</string>
+    <string name="serviceErased">"Wymazywanie zakończone pomyślnie."</string>
+    <string name="passwordIncorrect">"Błędne hasło."</string>
+    <string name="mmiComplete">"MMI zakończone."</string>
+    <string name="badPin">"Wprowadzony stary kod PIN jest nieprawidłowy."</string>
+    <string name="badPuk">"Wprowadzony kod PUK jest nieprawidłowy."</string>
+    <string name="mismatchPin">"Wprowadzone kody PIN nie są identyczne."</string>
+    <string name="invalidPin">"Wpisz kod PIN o długości od 4 do 8 cyfr."</string>
+    <string name="needPuk">"Karta SIM jest zablokowana kodem PUK. Wprowadź kod PUK, aby odblokować kartę."</string>
+    <string name="needPuk2">"Wprowadź kod PUK2, aby odblokować kartę SIM."</string>
+    <string name="ClipMmi">"Identyfikator dzwoniącego przy połączeniach przychodzących"</string>
+    <string name="ClirMmi">"Identyfikator dzwoniącego przy połączeniach wychodzących"</string>
+    <string name="CfMmi">"Przekierowanie połączeń"</string>
+    <string name="CwMmi">"Połączenie oczekujące"</string>
+    <string name="BaMmi">"Blokada dzwonienia"</string>
+    <string name="PwdMmi">"Zmiana hasła"</string>
+    <string name="PinMmi">"Zmiana kodu PIN"</string>
+    <string name="CLIRDefaultOnNextCallOn">"Identyfikator dzwoniącego ustawiony jest domyślnie na „zastrzeżony”. Następne połączenie: zastrzeżony"</string>
+    <string name="CLIRDefaultOnNextCallOff">"Identyfikator dzwoniącego ustawiony jest domyślnie na „zastrzeżony”. Następne połączenie: nie zastrzeżony"</string>
+    <string name="CLIRDefaultOffNextCallOn">"Identyfikator dzwoniącego ustawiony jest domyślnie na „nie zastrzeżony”. Następne połączenie: zastrzeżony"</string>
+    <string name="CLIRDefaultOffNextCallOff">"Identyfikator dzwoniącego ustawiony jest domyślnie na „nie zastrzeżony”. Następne połączenie: nie zastrzeżony"</string>
+    <string name="serviceNotProvisioned">"Usługa nie jest świadczona."</string>
+    <string name="CLIRPermanent">"Nie można zmienić ustawienia identyfikatora dzwoniącego."</string>
+    <string name="serviceClassVoice">"Głos"</string>
+    <string name="serviceClassData">"Dane"</string>
+    <string name="serviceClassFAX">"FAKS"</string>
+    <string name="serviceClassSMS">"SMS"</string>
+    <string name="serviceClassDataAsync">"Dane asynchroniczne"</string>
+    <string name="serviceClassDataSync">"Synchronizacja"</string>
+    <string name="serviceClassPacket">"Pakiet"</string>
+    <string name="serviceClassPAD">"PAD"</string>
+    <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: nieprzekierowane"</string>
+    <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+    <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> po <xliff:g id="TIME_DELAY">{2}</xliff:g> sekundach"</string>
+    <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: nieprzekierowane"</string>
+    <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: nieprzekierowane"</string>
+    <string name="httpErrorOk">"OK"</string>
+    <string name="httpError">"Strona sieci Web zawiera błąd."</string>
+    <string name="httpErrorLookup">"Nie można odszukać adresu URL."</string>
+    <string name="httpErrorUnsupportedAuthScheme">"Schemat uwierzytelniania strony nie jest obsługiwany."</string>
+    <string name="httpErrorAuth">"Nieudane uwierzytelnianie."</string>
+    <string name="httpErrorProxyAuth">"Autoryzacja przez serwer proxy zakończyła się niepowodzeniem."</string>
+    <string name="httpErrorConnect">"Nieudane połączenie z serwerem."</string>
+    <string name="httpErrorIO">"Nie udało się połączyć z serwerem. Spróbuj ponownie później."</string>
+    <string name="httpErrorTimeout">"Zbyt długi czas oczekiwania na połączenie z serwerem."</string>
+    <string name="httpErrorRedirectLoop">"Strona zawiera zbyt wiele przekierowań do serwerów."</string>
+    <string name="httpErrorUnsupportedScheme">"Protokół nie jest obsługiwany"</string>
+    <string name="httpErrorFailedSslHandshake">"Nie można ustanowić bezpiecznego połączenia."</string>
+    <string name="httpErrorBadUrl">"Nie można otworzyć strony, ponieważ adres URL jest nieprawidłowy."</string>
+    <string name="httpErrorFile">"Nie można uzyskać dostępu do pliku."</string>
+    <string name="httpErrorFileNotFound">"Nie znaleziono żądanego pliku."</string>
+    <string name="httpErrorTooManyRequests">"Zbyt wiele żądań jest przetwarzanych. Spróbuj ponownie później."</string>
+    <string name="contentServiceSync">"Synchronizacja"</string>
+    <string name="contentServiceSyncNotificationTitle">"Synchronizuj"</string>
+    <string name="contentServiceTooManyDeletesNotificationDesc">"Zbyt wiele usuwanych <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+    <string name="low_memory">"Pamięć telefonu jest pełna! Usuń niektóre pliki, aby zwolnić miejsce."</string>
+    <string name="me">"Ja"</string>
+    <string name="power_dialog">"Opcje telefonu"</string>
+    <string name="silent_mode">"Tryb cichy"</string>
+    <string name="turn_on_radio">"Włącz połączenia bezprzewodowe"</string>
+    <string name="turn_off_radio">"Wyłącz połączenia bezprzewodowe"</string>
+    <string name="screen_lock">"Blokada ekranu"</string>
+    <string name="power_off">"Wyłącz"</string>
+    <string name="shutdown_progress">"Wyłączanie..."</string>
+    <string name="shutdown_confirm">"Telefon zostanie wyłączony"</string>
+    <string name="no_recent_tasks">"Brak ostatnio używanych aplikacji."</string>
+    <string name="global_actions">"Opcje telefonu"</string>
+    <string name="global_action_lock">"Blokada ekranu"</string>
+    <string name="global_action_power_off">"Wyłącz"</string>
+    <string name="global_action_toggle_silent_mode">"Tryb cichy"</string>
+    <string name="global_action_silent_mode_on_status">"Dźwięk jest wyłączony"</string>
+    <string name="global_action_silent_mode_off_status">"Dźwięk jest włączony"</string>
+    <string name="safeMode">"Tryb awaryjny"</string>
+    <string name="permgrouplab_costMoney">"Usługi płatne"</string>
+    <string name="permgroupdesc_costMoney">"Pozwól aplikacjom na wykonywanie płatnych operacji."</string>
+    <string name="permgrouplab_messages">"Twoje wiadomości"</string>
+    <string name="permgroupdesc_messages">"Czytanie i zapisywanie wiadomości SMS, e-mail i innych"</string>
+    <string name="permgrouplab_personalInfo">"Informacje osobiste"</string>
+    <string name="permgroupdesc_personalInfo">"Bezpośredni dostęp do kontaktów i kalendarza zapisanych w telefonie."</string>
+    <string name="permgrouplab_location">"Twoje położenie"</string>
+    <string name="permgroupdesc_location">"Monitorowanie fizycznego położenia"</string>
+    <string name="permgrouplab_network">"Połączenia sieciowe"</string>
+    <string name="permgroupdesc_network">"Pozwól aplikacjom na dostęp do różnych funkcji sieci."</string>
+    <string name="permgrouplab_accounts">"Twoje konta Google"</string>
+    <string name="permgroupdesc_accounts">"Uzyskaj dostęp do dostępnych kont Google."</string>
+    <string name="permgrouplab_hardwareControls">"Sterowanie sprzętowe"</string>
+    <string name="permgroupdesc_hardwareControls">"Bezpośredni dostęp do elementów sprzętowych telefonu."</string>
+    <string name="permgrouplab_phoneCalls">"Połączenia telefoniczne"</string>
+    <string name="permgroupdesc_phoneCalls">"Monitorowanie, nagrywanie i przetwarzanie połączeń telefonicznych."</string>
+    <string name="permgrouplab_systemTools">"Narzędzia systemowe"</string>
+    <string name="permgroupdesc_systemTools">"Dostęp i kontrola systemu niższego poziomu."</string>
+    <string name="permgrouplab_developmentTools">"Narzędzia programistyczne"</string>
+    <string name="permgroupdesc_developmentTools">"Funkcje potrzebne jedynie programistom"</string>
+    <string name="permlab_statusBar">"wyłączanie lub zmienianie paska stanu"</string>
+    <string name="permdesc_statusBar">"Pozwala aplikacjom na wyłączenie paska stanu lub dodawanie i usuwanie ikon systemowych."</string>
+    <string name="permlab_expandStatusBar">"rozwijanie/zwijanie paska stanu"</string>
+    <string name="permdesc_expandStatusBar">"Pozwala aplikacji na rozwijanie lub zwijanie paska stanu."</string>
+    <string name="permlab_processOutgoingCalls">"przechwytywanie połączeń wychodzących"</string>
+    <string name="permdesc_processOutgoingCalls">"Pozwala aplikacji na przetwarzanie połączeń wychodzących i zmianę wybieranego numeru. Szkodliwe aplikacje mogą monitorować, przekierowywać lub blokować połączenia wychodzące."</string>
+    <string name="permlab_receiveSms">"odbieranie wiadomości SMS"</string>
+    <string name="permdesc_receiveSms">"Pozwala aplikacjom na odbieranie i przetwarzanie wiadomości SMS. Szkodliwe aplikacje mogą monitorować wiadomości lub usuwać je bez wyświetlania ich użytkownikowi."</string>
+    <string name="permlab_receiveMms">"odbieranie wiadomości MMS"</string>
+    <string name="permdesc_receiveMms">"Pozwala aplikacji na odbieranie i przetwarzanie wiadomości MMS. Szkodliwe aplikacje mogą monitorować wiadomości lub usuwać je bez pokazywania ich użytkownikowi."</string>
+    <string name="permlab_sendSms">"wysyłanie wiadomości SMS"</string>
+    <string name="permdesc_sendSms">"Pozwól aplikacjom na wysyłanie wiadomości SMS. Szkodliwe aplikacje mogą generować koszty, wysyłając wiadomości bez wiedzy użytkownika."</string>
+    <string name="permlab_readSms">"czytanie wiadomości SMS lub MMS"</string>
+    <string name="permdesc_readSms">"Pozwala aplikacji na czytanie wiadomości SMS zapisanych w telefonie lub na karcie SIM. Szkodliwe aplikacje mogą czytać poufne wiadomości."</string>
+    <string name="permlab_writeSms">"edytowanie wiadomości SMS lub MMS"</string>
+    <string name="permdesc_writeSms">"Pozwala aplikacji na zapisywanie wiadomości SMS przechowywanych w telefonie lub na karcie SIM. Szkodliwe aplikacje mogą usunąć wiadomości."</string>
+    <string name="permlab_receiveWapPush">"odbieranie WAP"</string>
+    <string name="permdesc_receiveWapPush">"Pozwala aplikacjom na odbieranie i przetwarzanie wiadomości WAP. Szkodliwe aplikacje mogą monitorować wiadomości lub usuwać je bez wyświetlania ich użytkownikowi."</string>
+    <string name="permlab_getTasks">"pobieranie uruchomionych aplikacji"</string>
+    <string name="permdesc_getTasks">"Umożliwia aplikacji pobieranie informacji na temat obecnie i ostatnio uruchomionych zadań. Może pozwolić szkodliwym aplikacjom na uzyskanie prywatnych informacji na temat innych aplikacji."</string>
+    <string name="permlab_reorderTasks">"zmienianie porządku uruchomionych aplikacji"</string>
+    <string name="permdesc_reorderTasks">"Pozwala aplikacji na przenoszenie zadań z tła na pierwszy plan. Szkodliwe aplikacje mogą wymusić działanie pierwszoplanowe bez kontroli użytkownika."</string>
+    <string name="permlab_setDebugApp">"włączenie debugowania aplikacji"</string>
+    <string name="permdesc_setDebugApp">"Pozwala aplikacji na włączenie debugowania innej aplikacji. Szkodliwe aplikacje mogą to wykorzystać do wyłączenia innych programów."</string>
+    <string name="permlab_changeConfiguration">"zmienianie ustawień interfejsu użytkownika"</string>
+    <string name="permdesc_changeConfiguration">"Pozwala aplikacji zmieniać bieżącą konfigurację, na przykład lokalny lub globalny rozmiar czcionki."</string>
+    <string name="permlab_restartPackages">"resetowanie innych aplikacji"</string>
+    <string name="permdesc_restartPackages">"Pozwala aplikacji na wymuszenie ponownego uruchomienia innych aplikacji."</string>
+    <string name="permlab_setProcessForeground">"zapobieganie zatrzymaniu"</string>
+    <string name="permdesc_setProcessForeground">"Pozwala aplikacji na uruchamianie dowolnego procesu na pierwszym planie tak, że nie można go wyłączyć. Nigdy nie powinno być potrzebne normalnym aplikacjom."</string>
+    <string name="permlab_forceBack">"wymuszanie zamknięcia aplikacji"</string>
+    <string name="permdesc_forceBack">"Pozwala aplikacji na wymuszenie zamknięcia i cofnięcia dowolnej operacji działającej na pierwszym planie. Nigdy nie powinno być potrzebne normalnym aplikacjom."</string>
+    <string name="permlab_dump">"pobieranie informacji o wewnętrznym stanie systemu"</string>
+    <string name="permdesc_dump">"Pozwala aplikacjom na pobieranie informacji o wewnętrznym stanie systemu. Szkodliwe aplikacje mogą pobrać szeroką gamę osobistych i zabezpieczonych informacji, które normalnie nie powinny im być nigdy potrzebne."</string>
+    <string name="permlab_addSystemService">"publikowanie usług niskiego poziomu"</string>
+    <string name="permdesc_addSystemService">"Pozwala aplikacji na publikowanie własnych usług systemowych niskiego poziomu. Szkodliwe aplikacje mogą przejąć kontrolę nad systemem oraz wykraść lub uszkodzić znajdujące się w nim dane."</string>
+    <string name="permlab_runSetActivityWatcher">"monitorowanie i kontrolowanie wszystkich uruchamianych aplikacji"</string>
+    <string name="permdesc_runSetActivityWatcher">"Pozwala aplikacji na monitorowanie i kontrolowanie sposobu, w jaki w systemie uruchamiane są różne działania. Szkodliwe aplikacje mogą całkowicie przejąć system. Te uprawnienia potrzebne są tylko programistom, nigdy w przypadku normalnego wykorzystywania telefonu."</string>
+    <string name="permlab_broadcastPackageRemoved">"wysyłanie transmisji informującej o usuniętym pakiecie"</string>
+    <string name="permdesc_broadcastPackageRemoved">"Pozwala aplikacji na wysyłanie powiadomienia, że pakiet aplikacji został usunięty. Szkodliwe aplikacje mogą z niego skorzystać w celu wyłączania innych działających aplikacji."</string>
+    <string name="permlab_broadcastSmsReceived">"wysyłanie transmisji otrzymanych w wiadomości SMS"</string>
+    <string name="permdesc_broadcastSmsReceived">"Pozwala aplikacji na wysyłanie powiadomienia, że została odebrana wiadomość SMS. Szkodliwe aplikacje mogą to wykorzystać do fałszowania przychodzących wiadomości SMS."</string>
+    <string name="permlab_broadcastWapPush">"wysyłanie transmisji informującej o otrzymaniu wiadomości WAP-PUSH"</string>
+    <string name="permdesc_broadcastWapPush">"Pozwala aplikacji na nadanie powiadomienia o otrzymaniu wiadomości WAP PUSH. Szkodliwe aplikacje mogą to wykorzystać do fałszowania potwierdzenia odbioru wiadomości MMS lub do niezauważalnego podmieniania zawartości dowolnej strony internetowej jej szkodliwymi wariantami."</string>
+    <string name="permlab_setProcessLimit">"ograniczanie liczby uruchomionych procesów"</string>
+    <string name="permdesc_setProcessLimit">"Pozwala aplikacji na kontrolowanie maksymalnej liczby uruchamianych procesów. Nigdy nie wykorzystywane przez normalne aplikacje."</string>
+    <string name="permlab_setAlwaysFinish">"zamykanie wszystkich aplikacji działających w tle"</string>
+    <string name="permdesc_setAlwaysFinish">"Pozwala aplikacji na kontrolowanie, czy czynności są zawsze kończone, kiedy zaczynają działać w tle. Nigdy nie jest potrzebne normalnym aplikacjom."</string>
+    <string name="permlab_fotaUpdate">"automatyczne instalowanie aktualizacji systemu"</string>
+    <string name="permdesc_fotaUpdate">"Pozwala aplikacji na otrzymywanie powiadomień o oczekujących aktualizacjach systemu i uruchamianie ich instalacji. Szkodliwe aplikacje mogą to wykorzystać do uszkodzenia systemu za pomocą nieuwierzytelnionych aktualizacji lub ogólnie wpłynąć na proces aktualizowania."</string>
+    <string name="permlab_batteryStats">"zmienianie statystyk dotyczących baterii"</string>
+    <string name="permdesc_batteryStats">"Pozwala na zmianę zebranych statystyk dotyczących baterii. Nie do wykorzystania przez normalne aplikacje."</string>
+    <string name="permlab_internalSystemWindow">"wyświetlanie nieuwierzytelnionych okien"</string>
+    <string name="permdesc_internalSystemWindow">"Pozwala na tworzenie okien, które przeznaczone są do wykorzystania przez wewnętrzny interfejs użytkownika systemu. Nie do wykorzystania przez normalne aplikacje."</string>
+    <string name="permlab_systemAlertWindow">"wyświetlanie ostrzeżeń systemowych"</string>
+    <string name="permdesc_systemAlertWindow">"Pozwala aplikacji na pokazywanie okien alarmów systemowych. Szkodliwe aplikacje mogą przejąć kontrolę nad całym ekranem telefonu."</string>
+    <string name="permlab_setAnimationScale">"zmienianie ogólnej prędkości animacji"</string>
+    <string name="permdesc_setAnimationScale">"Pozwala aplikacji na zmianę ogólnej prędkości animacji (szybsze lub wolniejsze animacje) w dowolnym momencie."</string>
+    <string name="permlab_manageAppTokens">"zarządzanie tokenami aplikacji"</string>
+    <string name="permdesc_manageAppTokens">"Pozwala aplikacjom na tworzenie własnych tokenów i zarządzanie nimi z pominięciem zwykłego porządku warstw. Nigdy nie powinno być potrzebne normalnym aplikacjom."</string>
+    <string name="permlab_injectEvents">"naciskanie klawiszy oraz przycisków sterujących"</string>
+    <string name="permdesc_injectEvents">"Pozwala aplikacjom na dostarczanie własnych zdarzeń wprowadzania danych (naciśnięcie klawisza itp.) do innych aplikacji. Szkodliwe aplikacje mogą to wykorzystać do przejęcia kontroli nad telefonem."</string>
+    <string name="permlab_readInputState">"zapamiętywanie wpisywanych znaków oraz wykonywanych czynności"</string>
+    <string name="permdesc_readInputState">"Pozwala aplikacjom na śledzenie naciskanych klawiszy, nawet podczas pracy z innym programem (na przykład podczas wpisywania hasła). Nigdy nie powinno być potrzebne normalnym aplikacjom."</string>
+    <string name="permlab_bindInputMethod">"tworzenie powiązania z metodą wejściową"</string>
+    <string name="permdesc_bindInputMethod">"Pozwala na tworzenie powiązania z interfejsem najwyższego poziomu metody wejściowej. To uprawnienie nie powinno być nigdy wymagane przez zwykłe aplikacje."</string>
+    <string name="permlab_setOrientation">"zmienianie orientacji ekranu"</string>
+    <string name="permdesc_setOrientation">"Pozwala aplikacji na zmianę orientacji ekranu w dowolnym momencie. Nigdy nie powinno być potrzeby stosowania w normalnych aplikacjach."</string>
+    <string name="permlab_signalPersistentProcesses">"wysyłanie sygnałów systemu Linux do aplikacji"</string>
+    <string name="permdesc_signalPersistentProcesses">"Pozwala aplikacjom żądać, aby dostarczany sygnał był wysyłany do wszystkich trwających procesów."</string>
+    <string name="permlab_persistentActivity">"sprawianie, że aplikacja jest cały czas uruchomiona"</string>
+    <string name="permdesc_persistentActivity">"Dzięki temu uprawnieniu część elementów aplikacji może być trwała, przez co system nie może ich wykorzystać do innych aplikacji."</string>
+    <string name="permlab_deletePackages">"usuwanie aplikacji"</string>
+    <string name="permdesc_deletePackages">"Pozwala aplikacjom na usuwanie pakietów systemu Android. Szkodliwe aplikacje mogą wykorzystać to do usuwania ważnych aplikacji."</string>
+    <string name="permlab_clearAppUserData">"usuwanie danych innych aplikacji"</string>
+    <string name="permdesc_clearAppUserData">"Pozwala aplikacji na czyszczenie danych użytkowników."</string>
+    <string name="permlab_deleteCacheFiles">"usuwanie pamięci podręcznej innych aplikacji"</string>
+    <string name="permdesc_deleteCacheFiles">"Pozwala aplikacji na usuwanie plików z pamięci podręcznej."</string>
+    <string name="permlab_getPackageSize">"mierzenie rozmiaru pamięci aplikacji"</string>
+    <string name="permdesc_getPackageSize">"Pozwala aplikacji na pobieranie własnego kodu, danych oraz rozmiarów pamięci podręcznej"</string>
+    <string name="permlab_installPackages">"bezpośrednie instalowanie aplikacji"</string>
+    <string name="permdesc_installPackages">"Pozwala aplikacji na instalowanie nowych lub zaktualizowanych pakietów systemu Android. Szkodliwe aplikacje mogą to wykorzystać, aby dodać nowe aplikacje z arbitralnie nadanymi rozległymi uprawnieniami."</string>
+    <string name="permlab_clearAppCache">"usuwanie wszystkich danych aplikacji z pamięci podręcznej"</string>
+    <string name="permdesc_clearAppCache">"Pozwala aplikacji na zwalnianie pamięci telefonu przez usuwanie plików z katalogu pamięci podręcznej aplikacji. Dostęp jest bardzo ograniczony, z reguły do procesów systemu."</string>
+    <string name="permlab_readLogs">"czytanie plików dziennika systemu"</string>
+    <string name="permdesc_readLogs">"Umożliwia aplikacji czytanie różnych plików dziennika systemowego. Pozwala to na uzyskanie ogólnych informacji o czynnościach wykonywanych w telefonie, ale bez ujawniania danych osobowych lub osobistych informacji."</string>
+    <string name="permlab_diagnostic">"czytanie/zapisywanie w zasobach należących do diagnostyki"</string>
+    <string name="permdesc_diagnostic">"Pozwala aplikacji na czytanie i zapisywanie we wszystkich zasobach posiadanych przez diagnozowaną grupę, jak na przykład pliki w katalogu /dev. Może to potencjalnie wpłynąć na stabilność i bezpieczeństwo systemu. Powinno być wykorzystywane TYLKO w celach diagnozowania sprzętu przez producenta lub operatora."</string>
+    <string name="permlab_changeComponentState">"włączanie lub wyłączanie składników aplikacji"</string>
+    <string name="permdesc_changeComponentState">"Pozwala aplikacji na włączenie lub wyłączenie składnika innej aplikacji. Szkodliwe aplikacje mogą wykorzystać to uprawnienie do wyłączenia ważnych funkcji telefonu. Przy włączaniu uprawnienia należy zachować ostrożność, ponieważ istnieje możliwość wprowadzenia składników aplikacji w stan nieużywalności, niespójności lub niestabilności."</string>
+    <string name="permlab_setPreferredApplications">"ustawianie preferowanych aplikacji"</string>
+    <string name="permdesc_setPreferredApplications">"Umożliwia aplikacji zmianę preferowanych programów użytkownika. Może to pozwolić szkodliwym aplikacjom na niezauważalną podmianę uruchamianych programów, aby zbierać prywatne dane użytkownika."</string>
+    <string name="permlab_writeSettings">"modyfikowanie ogólnych ustawień systemu"</string>
+    <string name="permdesc_writeSettings">"Pozwala aplikacji na zmianę danych ustawień systemowych. Szkodliwe aplikacje mogą uszkodzić konfigurację systemu."</string>
+    <string name="permlab_writeSecureSettings">"modyfikowanie ustawień systemu dotyczących zabezpieczeń"</string>
+    <string name="permdesc_writeSecureSettings">"Pozwala aplikacji na modyfikowanie danych ustawień zabezpieczeń systemu. To uprawnienie nie jest wykorzystywane przez normalne aplikacje."</string>
+    <string name="permlab_writeGservices">"zmienianie mapy usług Google"</string>
+    <string name="permdesc_writeGservices">"Pozwala aplikacji na modyfikowanie mapy usług Google. Nie wykorzystywane przez normalne aplikacje."</string>
+    <string name="permlab_receiveBootCompleted">"automatyczne uruchamianie podczas uruchamiania urządzenia"</string>
+    <string name="permdesc_receiveBootCompleted">"Pozwala aplikacji na samoczynne uruchamianie zaraz po zakończeniu uruchamiania systemu. Może to spowodować, że telefon będzie się dłużej uruchamiał oraz może ogólnie spowolnić działanie urządzenia, ponieważ aplikacja będzie cały czas uruchomiona."</string>
+    <string name="permlab_broadcastSticky">"wysyłanie transmisji trwałej"</string>
+    <string name="permdesc_broadcastSticky">"Pozwala aplikacji na wysyłanie transmisji trwałych, które pozostają aktywne po zakończeniu połączenia. Szkodliwe aplikacje mogą spowolnić lub zdestabilizować telefon, przez wymuszenie zbyt dużego zużycia pamięci."</string>
+    <string name="permlab_readContacts">"czytanie danych kontaktów"</string>
+    <string name="permdesc_readContacts">"Pozwala aplikacji na czytanie wszystkich danych kontaktowych (adresowych) zapisanych w telefonie. Szkodliwe aplikacje mogą to wykorzystać, aby wysyłać dane użytkownika do innych ludzi."</string>
+    <string name="permlab_writeContacts">"zapisywanie danych kontaktowych"</string>
+    <string name="permdesc_writeContacts">"Pozwala aplikacji na zmianę danych kontaktowych (adresowych) zapisanych w telefonie. Szkodliwe aplikacje mogą to wykorzystać, aby usunąć lub zmienić dane kontaktowe."</string>
+    <string name="permlab_writeOwnerData">"zapisywanie danych właściciela"</string>
+    <string name="permdesc_writeOwnerData">"Pozwala aplikacji na zmianę danych właściciela zapisanych w telefonie. Szkodliwe aplikacje mogą to wykorzystać, aby wymazać lub zmienić dane właściciela."</string>
+    <string name="permlab_readOwnerData">"czytanie danych właściciela"</string>
+    <string name="permdesc_readOwnerData">"Pozwala aplikacji na czytanie danych właściciela zapisanych w telefonie. Szkodliwe aplikacje mogą to wykorzystać do odczytania danych właściciela."</string>
+    <string name="permlab_readCalendar">"czytanie danych kalendarza"</string>
+    <string name="permdesc_readCalendar">"Pozwala aplikacji na odczytywanie wszystkich wydarzeń z kalendarza, zapisanych w telefonie. Szkodliwe aplikacje mogą to wykorzystać do rozsyłania wydarzeń z kalendarza do innych ludzi."</string>
+    <string name="permlab_writeCalendar">"zapisywanie danych kalendarza"</string>
+    <string name="permdesc_writeCalendar">"Pozwala aplikacji na zmianę wydarzeń z kalendarza zapisanych w telefonie. Szkodliwe aplikacje mogą to wykorzystać, aby usunąć lub zmienić dane w kalendarzu."</string>
+    <string name="permlab_accessMockLocation">"udawanie źródeł położenia dla testów"</string>
+    <string name="permdesc_accessMockLocation">"Tworzenie pozorowanych źródeł ustalania położenia dla testów. Szkodliwe aplikacje mogą to wykorzystać, aby zastąpić prawdziwe położenie i/lub stan zwracany przez prawdziwe źródła, takie jak GPS lub dostawcy usługi sieciowej."</string>
+    <string name="permlab_accessLocationExtraCommands">"dostęp do dodatkowych poleceń dostawcy informacji o położeniu"</string>
+    <string name="permdesc_accessLocationExtraCommands">"Dostęp do dodatkowych poleceń dostawcy informacji o położeniu. Szkodliwe aplikacje mogą go wykorzystać, aby wpływać na działanie urządzenia GPS lub innych źródeł ustalania położenia."</string>
+    <string name="permlab_accessFineLocation">"dokładne położenie (GPS)"</string>
+    <string name="permdesc_accessFineLocation">"Uzyskiwanie dostępu do dokładnych źródeł ustalania położenia w telefonie, takich jak system GPS, tam, gdzie są one dostępne. Szkodliwe aplikacje mogą to wykorzystać do określenia położenia użytkownika oraz mogą zużywać więcej energii baterii."</string>
+    <string name="permlab_accessCoarseLocation">"zgrubne (oparte o sieć) ustalanie położenia"</string>
+    <string name="permdesc_accessCoarseLocation">"Dostęp do źródeł, takich jak bazy danych sieci komórkowych, jeśli są dostępne, które pozwalają określić przybliżone położenie telefonu. Szkodliwe aplikacje mogą go wykorzystać do określenia, gdzie w przybliżeniu znajduje się użytkownik."</string>
+    <string name="permlab_accessSurfaceFlinger">"dostęp do usługi SurfaceFlinger"</string>
+    <string name="permdesc_accessSurfaceFlinger">"Pozwala aplikacji na wykorzystanie funkcji niskiego poziomu usługi SurfaceFlinger."</string>
+    <string name="permlab_readFrameBuffer">"czytanie bufora ramki"</string>
+    <string name="permdesc_readFrameBuffer">"Pozwala aplikacji na wykorzystanie odczytanej zawartości bufora ramki."</string>
+    <string name="permlab_modifyAudioSettings">"zmienianie ustawień audio"</string>
+    <string name="permdesc_modifyAudioSettings">"Pozwala aplikacjom na zmianę globalnych ustawień audio, takich jak głośność i routing."</string>
+    <string name="permlab_recordAudio">"nagrywanie dźwięku"</string>
+    <string name="permdesc_recordAudio">"Pozwala aplikacji na dostęp do ścieżki nagrywania dźwięku."</string>
+    <string name="permlab_camera">"robienie zdjęć"</string>
+    <string name="permdesc_camera">"Pozwala aplikacji na wykonywanie zdjęć za pomocą aparatu. Dzięki temu może ona pobierać zdjęcia z aparatu w dowolnym momencie."</string>
+    <string name="permlab_brick">"wyłączenie telefonu na stałe"</string>
+    <string name="permdesc_brick">"Pozwala aplikacji na wyłączenie całego telefonu na stałe. Jest to bardzo niebezpieczne."</string>
+    <string name="permlab_reboot">"wymuszanie ponownego uruchomienia telefonu"</string>
+    <string name="permdesc_reboot">"Pozwala aplikacji na wymuszenie ponownego uruchomienia telefonu."</string>
+    <string name="permlab_mount_unmount_filesystems">"montowanie i odmontowanie systemów plików"</string>
+    <string name="permdesc_mount_unmount_filesystems">"Pozwala aplikacjom na podłączanie i odłączanie systemów plików w pamięciach przenośnych."</string>
+    <string name="permlab_vibrate">"kontrolowanie wibracji"</string>
+    <string name="permdesc_vibrate">"Pozwala aplikacjom na kontrolowanie wibracji."</string>
+    <string name="permlab_flashlight">"kontrolowanie latarki"</string>
+    <string name="permdesc_flashlight">"Pozwala aplikacji kontrolować latarkę."</string>
+    <string name="permlab_hardware_test">"testowanie sprzętu"</string>
+    <string name="permdesc_hardware_test">"Pozwala aplikacji na kontrolowanie różnych urządzeń peryferyjnych w celu testowania sprzętu."</string>
+    <string name="permlab_callPhone">"bezpośrednie wybieranie numerów telefonów"</string>
+    <string name="permdesc_callPhone">"Pozwala aplikacjom na dzwonienie pod numery telefonów bez interwencji użytkownika. Szkodliwe aplikacje mogą powodować występowanie niespodziewanych połączeń na rachunku telefonicznym. Należy zauważyć, że aplikacje nie mogą dzwonić na numery alarmowe."</string>
+    <string name="permlab_callPrivileged">"bezpośrednie wybieranie dowolnych numerów telefonu"</string>
+    <string name="permdesc_callPrivileged">"Pozwala aplikacji dzwonić na dowolny numer telefonu, włącznie z numerami alarmowymi, bez interwencji użytkownika. Szkodliwe aplikacje mogą wykonywać niepotrzebne i nielegalne połączenia z usługami alarmowymi."</string>
+    <string name="permlab_locationUpdates">"kontrolowanie powiadomień o aktualizacji położenia"</string>
+    <string name="permdesc_locationUpdates">"Pozwala włączyć/wyłączyć powiadomienia o aktualizacji położenia przez radio. Nie wykorzystywane przez normalne aplikacje."</string>
+    <string name="permlab_checkinProperties">"dostęp do właściwości usługi rezerwacji"</string>
+    <string name="permdesc_checkinProperties">"Pozwala na dostęp z uprawnieniami do odczytu/zapisu do właściwości przesłanych przez usługę rezerwacji. Nie wykorzystywane przez normalne aplikacje."</string>
+    <string name="permlab_modifyPhoneState">"zmiana stanu telefonu"</string>
+    <string name="permdesc_modifyPhoneState">"Pozwala aplikacji na kontrolowanie funkcji telefonu w urządzeniu. Aplikacja z tymi uprawnieniami może przełączać sieci, włączać i wyłączać radio itp. bez informowania użytkownika."</string>
+    <string name="permlab_readPhoneState">"czytanie stanu telefonu"</string>
+    <string name="permdesc_readPhoneState">"Pozwala aplikacji na dostęp do funkcji telefonu w urządzeniu. Aplikacja z takim uprawnieniem może określić numer tego telefonu, czy jest nawiązane połączenie, numer, z którym jest ono nawiązane, itp."</string>
+    <string name="permlab_wakeLock">"zapobieganie przejściu telefonu w stan uśpienia"</string>
+    <string name="permdesc_wakeLock">"Pozwala aplikacji na zapobieganie przejściu telefonu w stan uśpienia."</string>
+    <string name="permlab_devicePower">"włączanie lub wyłączanie telefonu"</string>
+    <string name="permdesc_devicePower">"Pozwala aplikacji włączać i wyłączać telefon."</string>
+    <string name="permlab_factoryTest">"uruchamianie w trybie testu fabrycznego"</string>
+    <string name="permdesc_factoryTest">"Uruchom jako niskopoziomowy test producenta, pozwalając na całkowity dostęp do elementów sprzętowych telefonu. Dostępne tylko jeśli telefon działa w trybie testu producenta."</string>
+    <string name="permlab_setWallpaper">"ustawianie tapety"</string>
+    <string name="permdesc_setWallpaper">"Pozwala aplikacji na ustawianie tapety systemu."</string>
+    <string name="permlab_setWallpaperHints">"ustawianie wskazówek dotyczących rozmiaru tapety"</string>
+    <string name="permdesc_setWallpaperHints">"Pozwala aplikacji na ustawianie wskazówek dotyczących rozmiaru tapety."</string>
+    <string name="permlab_masterClear">"resetowanie systemu do ustawień fabrycznych"</string>
+    <string name="permdesc_masterClear">"Pozwala aplikacji na całkowite zresetowanie systemu do ustawień fabrycznych, z wymazaniem wszystkich danych, konfiguracji oraz zainstalowanych aplikacji."</string>
+    <string name="permlab_setTimeZone">"ustawianie strefy czasowej"</string>
+    <string name="permdesc_setTimeZone">"Pozwala aplikacji na zmianę strefy czasowej w telefonie."</string>
+    <string name="permlab_getAccounts">"wykrywanie znanych kont"</string>
+    <string name="permdesc_getAccounts">"Pozwala aplikacji na pobranie listy kont zapisanych w telefonie."</string>
+    <string name="permlab_accessNetworkState">"wyświetlanie stanu sieci"</string>
+    <string name="permdesc_accessNetworkState">"Pozwala aplikacji na wyświetlanie stanu wszystkich sieci."</string>
+    <string name="permlab_createNetworkSockets">"pełen dostęp do Internetu"</string>
+    <string name="permdesc_createNetworkSockets">"Pozwala aplikacji na tworzenie gniazd sieciowych."</string>
+    <string name="permlab_writeApnSettings">"zapisywanie ustawień nazwy punktu dostępowego (APN, Access Point Name)"</string>
+    <string name="permdesc_writeApnSettings">"Pozwala aplikacji na zmianę ustawień APN, takich jak serwer proxy oraz port dowolnego APN."</string>
+    <string name="permlab_changeNetworkState">"zmienianie połączeń sieci"</string>
+    <string name="permdesc_changeNetworkState">"Pozwala aplikacji na zmianę stanu połączeń sieciowych."</string>
+    <string name="permlab_accessWifiState">"wyświetlanie stanu Wi-Fi"</string>
+    <string name="permdesc_accessWifiState">"Pozwala aplikacji na wyświetlanie informacji o stanie Wi-Fi."</string>
+    <string name="permlab_changeWifiState">"zmiana stanu Wi-Fi"</string>
+    <string name="permdesc_changeWifiState">"Pozwala aplikacji na łączenie i rozłączanie z punktami dostępowymi Wi-Fi oraz na dokonywanie zmian skonfigurowanych sieci Wi-Fi."</string>
+    <string name="permlab_bluetoothAdmin">"administrowanie Bluetooth"</string>
+    <string name="permdesc_bluetoothAdmin">"Pozwala aplikacji na konfigurowanie lokalnego telefonu Bluetooth, wyszukiwanie urządzeń zdalnych i łączenie się z nimi."</string>
+    <string name="permlab_bluetooth">"tworzenie połączeń Bluetooth"</string>
+    <string name="permdesc_bluetooth">"Pozwala aplikacji na wyświetlanie konfiguracji lokalnego telefonu Bluetooth oraz na tworzenie i akceptowanie połączeń ze sparowanymi urządzeniami."</string>
+    <string name="permlab_disableKeyguard">"wyłączanie blokady klawiatury"</string>
+    <string name="permdesc_disableKeyguard">"Pozwala aplikacji na wyłączenie blokady klawiatury i wszystkich związanych z tym haseł zabezpieczających. Typowym przykładem takiego działania jest wyłączanie blokady klawiatury, gdy pojawia się połączenie przychodzące, a następnie ponowne jej włączanie po zakończeniu połączenia."</string>
+    <string name="permlab_readSyncSettings">"czytanie ustawień synchronizowania"</string>
+    <string name="permdesc_readSyncSettings">"Pozwala aplikacji na czytanie ustawień synchronizacji, takich jak informacje, czy synchronizacja kontaktów jest włączona."</string>
+    <string name="permlab_writeSyncSettings">"zapisywanie ustawień synchronizowania"</string>
+    <string name="permdesc_writeSyncSettings">"Pozwala aplikacji na zmianę ustawień synchronizowania, takich jak ustalenie, czy synchronizacja dla kontaktów ma być włączona."</string>
+    <string name="permlab_readSyncStats">"czytanie statystyk dotyczących synchronizowania"</string>
+    <string name="permdesc_readSyncStats">"Pozwala aplikacji na czytanie statystyk synchronizowania, np. historii przeprowadzonych synchronizacji."</string>
+    <string name="permlab_subscribedFeedsRead">"czytanie subskrybowanych źródeł"</string>
+    <string name="permdesc_subscribedFeedsRead">"Pozwala aplikacjom na pobieranie informacji szczegółowych na temat obecnie zsynchronizowanych źródeł."</string>
+    <string name="permlab_subscribedFeedsWrite">"zapisywanie subskrybowanych źródeł"</string>
+    <string name="permdesc_subscribedFeedsWrite">"Umożliwia aplikacji zmianę obecnie zsynchronizowanych źródeł. Może to pozwolić szkodliwej aplikacji na zmianę zsynchronizowanych źródeł."</string>
+  <string-array name="phoneTypes">
+    <item>"Strona główna"</item>
+    <item>"Komórka"</item>
+    <item>"Praca"</item>
+    <item>"Faks w pracy"</item>
+    <item>"Faks domowy"</item>
+    <item>"Pager"</item>
+    <item>"Inny"</item>
+    <item>"Niestandardowy"</item>
+  </string-array>
+  <string-array name="emailAddressTypes">
+    <item>"Strona główna"</item>
+    <item>"Praca"</item>
+    <item>"Inne"</item>
+    <item>"Niestandardowy"</item>
+  </string-array>
+  <string-array name="postalAddressTypes">
+    <item>"Strona główna"</item>
+    <item>"Praca"</item>
+    <item>"Inny"</item>
+    <item>"Niestandardowy"</item>
+  </string-array>
+  <string-array name="imAddressTypes">
+    <item>"Strona główna"</item>
+    <item>"Praca"</item>
+    <item>"Inne"</item>
+    <item>"Niestandardowy"</item>
+  </string-array>
+  <string-array name="organizationTypes">
+    <item>"Praca"</item>
+    <item>"Inne"</item>
+    <item>"Niestandardowy"</item>
+  </string-array>
+  <string-array name="imProtocols">
+    <item>"AIM"</item>
+    <item>"Windows Live"</item>
+    <item>"Yahoo"</item>
+    <item>"Skype"</item>
+    <item>"QQ"</item>
+    <item>"Google Talk"</item>
+    <item>"ICQ"</item>
+    <item>"Jabber"</item>
+  </string-array>
+    <string name="keyguard_password_enter_pin_code">"Wprowadź kod PIN"</string>
+    <string name="keyguard_password_wrong_pin_code">"Błędny kod PIN!"</string>
+    <string name="keyguard_label_text">"Aby odblokować, naciśnij przycisk Menu, a następnie 0."</string>
+    <string name="emergency_call_dialog_number_for_display">"Numer alarmowy"</string>
+    <string name="lockscreen_carrier_default">"(Brak usługi)"</string>
+    <string name="lockscreen_screen_locked">"Ekran zablokowany."</string>
+    <string name="lockscreen_instructions_when_pattern_enabled">"Naciśnij przycisk Menu, aby odblokować lub wykonać połączenie alarmowe."</string>
+    <string name="lockscreen_instructions_when_pattern_disabled">"Naciśnij przycisk Menu, aby odblokować."</string>
+    <string name="lockscreen_pattern_instructions">"Narysuj wzór, aby odblokować"</string>
+    <string name="lockscreen_emergency_call">"Połączenie alarmowe"</string>
+    <string name="lockscreen_pattern_correct">"Poprawnie!"</string>
+    <string name="lockscreen_pattern_wrong">"Niestety, spróbuj ponownie"</string>
+    <string name="lockscreen_plugged_in">"Ładowanie (<xliff:g id="NUMBER">%d%%</xliff:g>)"</string>
+    <string name="lockscreen_low_battery">"Podłącz ładowarkę."</string>
+    <string name="lockscreen_missing_sim_message_short">"Brak karty SIM."</string>
+    <string name="lockscreen_missing_sim_message">"Brak karty SIM w telefonie."</string>
+    <string name="lockscreen_missing_sim_instructions">"Włóż kartę SIM."</string>
+    <string name="lockscreen_network_locked_message">"Sieć zablokowana"</string>
+    <string name="lockscreen_sim_puk_locked_message">"Karta SIM jest zablokowana kodem PUK."</string>
+    <string name="lockscreen_sim_puk_locked_instructions">"Skontaktuj się z działem obsługi klienta."</string>
+    <string name="lockscreen_sim_locked_message">"Karta SIM jest zablokowana."</string>
+    <string name="lockscreen_sim_unlock_progress_dialog_message">"Odblokowywanie karty SIM..."</string>
+    <string name="lockscreen_too_many_failed_attempts_dialog_message">"Wzór odblokowania został nieprawidłowo narysowany <xliff:g id="NUMBER_0">%d</xliff:g> razy. "\n\n"Spróbuj ponownie za <xliff:g id="NUMBER_1">%d</xliff:g> sekund."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin">"Wzór odblokowania został narysowany nieprawidłowo <xliff:g id="NUMBER_0">%d</xliff:g> razy. Po kolejnych <xliff:g id="NUMBER_1">%d</xliff:g> nieudanych próbach telefon trzeba będzie odblokować przez zalogowanie na koncie Google."\n\n" Spróbuj ponownie za <xliff:g id="NUMBER_2">%d</xliff:g> sekund."</string>
+    <string name="lockscreen_too_many_failed_attempts_countdown">"Spróbuj ponownie za <xliff:g id="NUMBER">%d</xliff:g> sekund."</string>
+    <string name="lockscreen_forgot_pattern_button_text">"Zapomniałeś wzoru?"</string>
+    <string name="lockscreen_glogin_too_many_attempts">"Zbyt wiele prób narysowania wzoru!"</string>
+    <string name="lockscreen_glogin_instructions">"Aby odblokować,"\n"zaloguj się na koncie Google"</string>
+    <string name="lockscreen_glogin_username_hint">"Nazwa użytkownika (e-mail)"</string>
+    <string name="lockscreen_glogin_password_hint">"Hasło"</string>
+    <string name="lockscreen_glogin_submit_button">"Zaloguj"</string>
+    <string name="lockscreen_glogin_invalid_input">"Błędna nazwa użytkownika lub hasło."</string>
+    <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
+    <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+    <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+    <!-- no translation found for hour_ampm (7618670480400517084) -->
+    <skip />
+    <!-- no translation found for hour_cap_ampm (5117798389811605468) -->
+    <skip />
+    <string name="status_bar_clear_all_button">"Wyczyść powiadomienia"</string>
+    <string name="status_bar_no_notifications_title">"Brak powiadomień"</string>
+    <string name="status_bar_ongoing_events_title">"Trwające"</string>
+    <string name="status_bar_latest_events_title">"Powiadomienia"</string>
+    <!-- no translation found for battery_status_text_percent_format (8818848472818880005) -->
+    <skip />
+    <string name="battery_status_charging">"Ładowanie..."</string>
+    <string name="battery_low_title">"Podłącz ładowarkę"</string>
+    <string name="battery_low_subtitle">"Bateria się rozładowuje:"</string>
+    <string name="battery_low_percent_format">"pozostało mniej niż <xliff:g id="NUMBER">%d%%</xliff:g>."</string>
+    <string name="factorytest_failed">"Nieudany test fabryczny"</string>
+    <string name="factorytest_not_system">"Czynność FACTORY_TEST jest obsługiwana tylko dla pakietów zainstalowanych w katalogu /system/app."</string>
+    <string name="factorytest_no_action">"Nie znaleziono żadnego pakietu, który zapewnia działanie FACTORY_TEST."</string>
+    <string name="factorytest_reboot">"Uruchom ponownie"</string>
+    <string name="save_password_label">"Potwierdź"</string>
+    <string name="save_password_message">"Czy chcesz, aby zapamiętać to hasło w przeglądarce?"</string>
+    <string name="save_password_notnow">"Nie teraz"</string>
+    <string name="save_password_remember">"Zapamiętaj"</string>
+    <string name="save_password_never">"Nigdy"</string>
+    <string name="open_permission_deny">"Brak uprawnień do otwierania tej strony."</string>
+    <string name="text_copied">"Tekst został skopiowany do schowka."</string>
+    <string name="more_item_label">"Więcej"</string>
+    <string name="prepend_shortcut_label">"Menu+"</string>
+    <string name="menu_space_shortcut_label">"spacja"</string>
+    <string name="menu_enter_shortcut_label">"enter"</string>
+    <string name="menu_delete_shortcut_label">"usuń"</string>
+    <string name="search_go">"Szukaj"</string>
+    <string name="today">"Dzisiaj"</string>
+    <string name="yesterday">"Wczoraj"</string>
+    <string name="tomorrow">"Jutro"</string>
+    <string name="oneMonthDurationPast">"miesiąc temu"</string>
+    <string name="beforeOneMonthDurationPast">"Ponad 1 miesiąc temu"</string>
+  <plurals name="num_seconds_ago">
+    <item quantity="one">"sekundę temu"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> sekund temu"</item>
+  </plurals>
+  <plurals name="num_minutes_ago">
+    <item quantity="one">"1 minutę temu"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> minut temu"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one">"godzinę temu"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> godzin temu"</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one">"wczoraj"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> dni temu"</item>
+  </plurals>
+  <plurals name="in_num_seconds">
+    <item quantity="one">"za sekundę"</item>
+    <item quantity="other">"za <xliff:g id="COUNT">%d</xliff:g> sekund"</item>
+  </plurals>
+  <plurals name="in_num_minutes">
+    <item quantity="one">"za minutę"</item>
+    <item quantity="other">"za <xliff:g id="COUNT">%d</xliff:g> minut"</item>
+  </plurals>
+  <plurals name="in_num_hours">
+    <item quantity="one">"za godzinę"</item>
+    <item quantity="other">"za <xliff:g id="COUNT">%d</xliff:g> godzin"</item>
+  </plurals>
+  <plurals name="in_num_days">
+    <item quantity="one">"jutro"</item>
+    <item quantity="other">"za <xliff:g id="COUNT">%d</xliff:g> dni"</item>
+  </plurals>
+    <!-- no translation found for abbrev_num_seconds_ago:one (1849036840200069118) -->
+    <!-- no translation found for abbrev_num_seconds_ago:other (3699169366650930415) -->
+    <!-- no translation found for abbrev_num_minutes_ago:one (6361490147113871545) -->
+    <!-- no translation found for abbrev_num_minutes_ago:other (851164968597150710) -->
+    <!-- no translation found for abbrev_num_hours_ago:one (4796212039724722116) -->
+    <!-- no translation found for abbrev_num_hours_ago:other (6889970745748538901) -->
+    <!-- no translation found for abbrev_num_days_ago:one (8463161711492680309) -->
+    <!-- no translation found for abbrev_num_days_ago:other (3453342639616481191) -->
+    <!-- no translation found for abbrev_in_num_seconds:one (5842225370795066299) -->
+    <!-- no translation found for abbrev_in_num_seconds:other (5495880108825805108) -->
+    <!-- no translation found for abbrev_in_num_minutes:one (562786149928284878) -->
+    <!-- no translation found for abbrev_in_num_minutes:other (4216113292706568726) -->
+    <!-- no translation found for abbrev_in_num_hours:one (3274708118124045246) -->
+    <!-- no translation found for abbrev_in_num_hours:other (3705373766798013406) -->
+    <!-- no translation found for abbrev_in_num_days:one (2178576254385739855) -->
+    <!-- no translation found for abbrev_in_num_days:other (2973062968038355991) -->
+    <string name="preposition_for_date">"dnia %s"</string>
+    <string name="preposition_for_time">"o %s"</string>
+    <string name="preposition_for_year">"w %s"</string>
+    <string name="day">"dzień"</string>
+    <string name="days">"dni"</string>
+    <string name="hour">"godzina"</string>
+    <string name="hours">"godzin"</string>
+    <string name="minute">"min"</string>
+    <string name="minutes">"minut"</string>
+    <string name="second">"s"</string>
+    <string name="seconds">"S"</string>
+    <string name="week">"tydzień"</string>
+    <string name="weeks">"tygodni"</string>
+    <string name="year">"rok"</string>
+    <string name="years">"lat"</string>
+    <string name="sunday">"Niedziela"</string>
+    <string name="monday">"Poniedziałek"</string>
+    <string name="tuesday">"Wtorek"</string>
+    <string name="wednesday">"Środa"</string>
+    <string name="thursday">"Czwartek"</string>
+    <string name="friday">"Piątek"</string>
+    <string name="saturday">"Sobota"</string>
+    <string name="every_weekday">"W każdy dzień roboczy (pon–pt)"</string>
+    <string name="daily">"Codziennie"</string>
+    <string name="weekly">"Co tydzień w <xliff:g id="DAY">%s</xliff:g>"</string>
+    <string name="monthly">"Miesięcznie"</string>
+    <string name="yearly">"Co roku"</string>
+    <string name="VideoView_error_title">"Nie można odtworzyć filmu wideo"</string>
+    <string name="VideoView_error_text_unknown">"Niestety, nie można odtworzyć tego filmu wideo."</string>
+    <string name="VideoView_error_button">"OK"</string>
+    <string name="am">"rano"</string>
+    <string name="pm">"po południu"</string>
+    <string name="numeric_date">"<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
+    <string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string>
+    <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
+    <string name="date1_date2">"<xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>"</string>
+    <string name="time1_time2">"<xliff:g id="TIME1">%1$s</xliff:g> – <xliff:g id="TIME2">%2$s</xliff:g>"</string>
+    <string name="time_wday_date">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>, <xliff:g id="DATE">%3$s</xliff:g>"</string>
+    <string name="wday_date">"<xliff:g id="WEEKDAY">%2$s</xliff:g>, <xliff:g id="DATE">%3$s</xliff:g>"</string>
+    <string name="time_date">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="DATE">%3$s</xliff:g>"</string>
+    <!-- no translation found for date_time (6104442718633642836) -->
+    <skip />
+    <!-- no translation found for relative_time (1818557177829411417) -->
+    <skip />
+    <string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string>
+    <string name="full_date_month_first">"<xliff:g id="MONTH">MMMM</xliff:g> <xliff:g id="DAY">dd</xliff:g>, <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="full_date_day_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMMM</xliff:g>, <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="medium_date_month_first">"<xliff:g id="MONTH">MMM</xliff:g> <xliff:g id="DAY">dd</xliff:g>, <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="medium_date_day_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMM</xliff:g>, <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="twelve_hour_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">a</xliff:g>"</string>
+    <string name="twenty_four_hour_time_format">"<xliff:g id="HOUR">H</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g>"</string>
+    <string name="noon">"południe"</string>
+    <string name="Noon">"Południe"</string>
+    <string name="midnight">"północ"</string>
+    <string name="Midnight">"Północ"</string>
+    <!-- no translation found for month_day (5565829181417740906) -->
+    <skip />
+    <!-- no translation found for month (7026169712234774086) -->
+    <skip />
+    <string name="month_day_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <!-- no translation found for month_year (9219019380312413367) -->
+    <skip />
+    <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
+    <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <string name="same_year_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>"</string>
+    <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>"</string>
+    <string name="same_year_mdy1_mdy2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR">%9$s</xliff:g>"</string>
+    <string name="same_year_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="YEAR">%9$s</xliff:g>"</string>
+    <string name="same_year_md1_time1_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_year_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_year_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>"</string>
+    <string name="numeric_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>"</string>
+    <string name="numeric_mdy1_mdy2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="numeric_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="numeric_md1_time1_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>"</string>
+    <string name="same_month_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>"</string>
+    <string name="same_month_mdy1_mdy2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="same_month_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="same_month_md1_time1_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="abbrev_month_day_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <!-- no translation found for abbrev_month_year (3856424847226891943) -->
+    <skip />
+    <!-- no translation found for abbrev_month_day (5028815883653985933) -->
+    <skip />
+    <!-- no translation found for abbrev_month (3131032032850777433) -->
+    <skip />
+    <string name="day_of_week_long_sunday">"Niedziela"</string>
+    <string name="day_of_week_long_monday">"Poniedziałek"</string>
+    <string name="day_of_week_long_tuesday">"Wtorek"</string>
+    <string name="day_of_week_long_wednesday">"Środa"</string>
+    <string name="day_of_week_long_thursday">"Czwartek"</string>
+    <string name="day_of_week_long_friday">"Piątek"</string>
+    <string name="day_of_week_long_saturday">"Sobota"</string>
+    <string name="day_of_week_medium_sunday">"Nie"</string>
+    <string name="day_of_week_medium_monday">"Pon"</string>
+    <string name="day_of_week_medium_tuesday">"Wt"</string>
+    <string name="day_of_week_medium_wednesday">"Śro"</string>
+    <string name="day_of_week_medium_thursday">"Czw"</string>
+    <string name="day_of_week_medium_friday">"Pią"</string>
+    <string name="day_of_week_medium_saturday">"Sob"</string>
+    <string name="day_of_week_short_sunday">"Nd"</string>
+    <string name="day_of_week_short_monday">"Pn"</string>
+    <string name="day_of_week_short_tuesday">"Wt"</string>
+    <string name="day_of_week_short_wednesday">"Śr"</string>
+    <string name="day_of_week_short_thursday">"Czw"</string>
+    <string name="day_of_week_short_friday">"Pt"</string>
+    <string name="day_of_week_short_saturday">"So"</string>
+    <string name="day_of_week_shorter_sunday">"Nd"</string>
+    <string name="day_of_week_shorter_monday">"Pon"</string>
+    <string name="day_of_week_shorter_tuesday">"Wt"</string>
+    <string name="day_of_week_shorter_wednesday">"Śr"</string>
+    <string name="day_of_week_shorter_thursday">"Czw"</string>
+    <string name="day_of_week_shorter_friday">"Pt"</string>
+    <string name="day_of_week_shorter_saturday">"So"</string>
+    <string name="day_of_week_shortest_sunday">"Nd"</string>
+    <string name="day_of_week_shortest_monday">"Pon"</string>
+    <string name="day_of_week_shortest_tuesday">"Czw"</string>
+    <string name="day_of_week_shortest_wednesday">"Śr"</string>
+    <string name="day_of_week_shortest_thursday">"Czw"</string>
+    <string name="day_of_week_shortest_friday">"Pt"</string>
+    <string name="day_of_week_shortest_saturday">"Sob"</string>
+    <string name="month_long_january">"Styczeń"</string>
+    <string name="month_long_february">"Luty"</string>
+    <string name="month_long_march">"Marzec"</string>
+    <string name="month_long_april">"Kwiecień"</string>
+    <string name="month_long_may">"Maj"</string>
+    <string name="month_long_june">"Czerwiec"</string>
+    <string name="month_long_july">"Lipiec"</string>
+    <string name="month_long_august">"Sierpień"</string>
+    <string name="month_long_september">"Wrzesień"</string>
+    <string name="month_long_october">"Październik"</string>
+    <string name="month_long_november">"Listopad"</string>
+    <string name="month_long_december">"Grudzień"</string>
+    <string name="month_medium_january">"Sty"</string>
+    <string name="month_medium_february">"Lut"</string>
+    <string name="month_medium_march">"Mar"</string>
+    <string name="month_medium_april">"Kwi"</string>
+    <string name="month_medium_may">"Maj"</string>
+    <string name="month_medium_june">"Cze"</string>
+    <string name="month_medium_july">"Lip"</string>
+    <string name="month_medium_august">"Sie"</string>
+    <string name="month_medium_september">"Wrz"</string>
+    <string name="month_medium_october">"Paź"</string>
+    <string name="month_medium_november">"Lis"</string>
+    <string name="month_medium_december">"Gru"</string>
+    <string name="month_shortest_january">"Sty"</string>
+    <string name="month_shortest_february">"Lut"</string>
+    <string name="month_shortest_march">"Pon"</string>
+    <string name="month_shortest_april">"Kwi"</string>
+    <string name="month_shortest_may">"Maj"</string>
+    <string name="month_shortest_june">"Cze"</string>
+    <string name="month_shortest_july">"Lip"</string>
+    <string name="month_shortest_august">"Sie"</string>
+    <string name="month_shortest_september">"Wrz"</string>
+    <string name="month_shortest_october">"Paź"</string>
+    <string name="month_shortest_november">"Lis"</string>
+    <string name="month_shortest_december">"Gru"</string>
+    <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+    <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
+    <string name="selectAll">"Zaznacz wszystko"</string>
+    <string name="selectText">"Wybierz tekst"</string>
+    <string name="stopSelectingText">"Zatrzymaj wybieranie tekstu"</string>
+    <string name="cut">"Wytnij"</string>
+    <string name="cutAll">"Wytnij wszystko"</string>
+    <string name="copy">"Kopiuj"</string>
+    <string name="copyAll">"Kopiuj wszystko"</string>
+    <string name="paste">"Wklej"</string>
+    <string name="copyUrl">"Kopiuj adres URL"</string>
+    <string name="inputMethod">"Metoda wejściowa"</string>
+    <string name="editTextMenuTitle">"Edytuj tekst"</string>
+    <string name="low_internal_storage_view_title">"Mało miejsca"</string>
+    <string name="low_internal_storage_view_text">"Maleje ilość dostępnej pamięci telefonu."</string>
+    <string name="ok">"OK"</string>
+    <string name="cancel">"Anuluj"</string>
+    <string name="yes">"OK"</string>
+    <string name="no">"Anuluj"</string>
+    <string name="capital_on">"Włącz"</string>
+    <string name="capital_off">"Wyłącz"</string>
+    <string name="whichApplication">"Zakończ działanie, korzystając z"</string>
+    <string name="alwaysUse">"Używaj domyślnie dla tej czynności."</string>
+    <string name="clearDefaultHintMsg">"Wyczyść domyślne w: Ustawienia strony głównej &gt; Aplikacje &gt; Zarządzaj aplikacjami."</string>
+    <string name="chooseActivity">"Wybierz czynność"</string>
+    <string name="noApplications">"Żadna z aplikacji nie może wykonać tej czynności."</string>
+    <string name="aerr_title">"Przepraszamy!"</string>
+    <string name="aerr_application">"Aplikacja <xliff:g id="APPLICATION">%1$s</xliff:g> (proces <xliff:g id="PROCESS">%2$s</xliff:g>) została niespodziewanie zatrzymana. Spróbuj ponownie."</string>
+    <string name="aerr_process">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> został niespodziewanie zatrzymany. Spróbuj ponownie."</string>
+    <string name="anr_title">"Przepraszamy!"</string>
+    <string name="anr_activity_application">"Działanie <xliff:g id="ACTIVITY">%1$s</xliff:g> (w aplikacji <xliff:g id="APPLICATION">%2$s</xliff:g>) nie odpowiada."</string>
+    <string name="anr_activity_process">"Działanie <xliff:g id="ACTIVITY">%1$s</xliff:g> (w procesie <xliff:g id="PROCESS">%2$s</xliff:g>) nie odpowiada."</string>
+    <string name="anr_application_process">"Aplikacja <xliff:g id="APPLICATION">%1$s</xliff:g> (w procesie <xliff:g id="PROCESS">%2$s</xliff:g>) nie odpowiada."</string>
+    <string name="anr_process">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> nie odpowiada."</string>
+    <string name="force_close">"Wymuś zamknięcie"</string>
+    <string name="wait">"Czekaj"</string>
+    <string name="debug">"Debuguj"</string>
+    <string name="sendText">"Wybierz czynność dla wpisanego tekstu"</string>
+    <string name="volume_ringtone">"Głośność dzwonka"</string>
+    <string name="volume_music">"Głośność multimediów"</string>
+    <string name="volume_music_hint_playing_through_bluetooth">"Odtwarzanie przez Bluetooth"</string>
+    <string name="volume_call">"Głośność podczas połączenia"</string>
+    <string name="volume_call_hint_playing_through_bluetooth">"Odtwarzanie przez Bluetooth"</string>
+    <string name="volume_alarm">"Głośność alarmu"</string>
+    <string name="volume_notification">"Głośność powiadomienia"</string>
+    <string name="volume_unknown">"Głośność"</string>
+    <string name="ringtone_default">"Domyślny dzwonek"</string>
+    <string name="ringtone_default_with_actual">"Domyślny dzwonek (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+    <string name="ringtone_silent">"Cichy"</string>
+    <string name="ringtone_picker_title">"Dzwonki"</string>
+    <string name="ringtone_unknown">"Nieznany dzwonek"</string>
+  <plurals name="wifi_available">
+    <item quantity="one">"Sieć Wi-Fi jest dostępna"</item>
+    <item quantity="other">"Dostępne sieci Wi-Fi"</item>
+  </plurals>
+  <plurals name="wifi_available_detailed">
+    <item quantity="one">"Otwórz dostępne sieci Wi-Fi"</item>
+    <item quantity="other">"Otwórz dostępne sieci Wi-Fi"</item>
+  </plurals>
+    <string name="select_character">"Wstaw znak"</string>
+    <string name="sms_control_default_app_name">"Nieznana aplikacja"</string>
+    <string name="sms_control_title">"Wysyłanie wiadomości SMS"</string>
+    <string name="sms_control_message">"Wysyłana jest duża liczba wiadomości SMS. Wybierz „OK”, aby kontynuować, lub „Anuluj”, aby zatrzymać wysyłanie."</string>
+    <string name="sms_control_yes">"OK"</string>
+    <string name="sms_control_no">"Anuluj"</string>
+    <string name="date_time_set">"Ustaw"</string>
+    <string name="default_permission_group">"Domyślne"</string>
+    <string name="no_permissions">"Nie są wymagane żadne uprawnienia"</string>
+    <string name="perms_hide"><b>"Ukryj"</b></string>
+    <string name="perms_show_all"><b>"Pokaż wszystko"</b></string>
+    <string name="googlewebcontenthelper_loading">"Ładowanie..."</string>
+    <string name="usb_storage_title">"Połączenie przez USB"</string>
+    <string name="usb_storage_message">"Telefon został podłączony do komputera przez port USB. Wybierz polecenie „Montuj”, jeśli chcesz skopiować pliki między komputerem a kartą SD w telefonie."</string>
+    <string name="usb_storage_button_mount">"Zamontuj"</string>
+    <string name="usb_storage_button_unmount">"Nie montuj"</string>
+    <string name="usb_storage_error_message">"Wystąpił problem z wykorzystaniem karty SD dla pamięci USB."</string>
+    <string name="usb_storage_notification_title">"Połączenie przez USB"</string>
+    <string name="usb_storage_notification_message">"Wybierz, aby skopiować pliki do/z komputera"</string>
+    <string name="select_input_method">"Wybierz metodę wejściową"</string>
+    <string name="fast_scroll_alphabet">"AĄBCĆDEĘFGHIJKLŁMNŃOÓPQRSŚTUVWXYZŹŻ"</string>
+    <string name="fast_scroll_numeric_alphabet">"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="candidates_style"><font fgcolor="#ff000000" bgcolor="#ff8080ff"><u>"kandydaci"</u></font></string>
+</resources>
diff --git a/core/res/res/values-ru/arrays.xml b/core/res/res/values-ru/arrays.xml
new file mode 100644 (file)
index 0000000..f9c904b
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
new file mode 100644 (file)
index 0000000..8d362bd
--- /dev/null
@@ -0,0 +1,724 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="byteShort">"б"</string>
+    <string name="kilobyteShort">"Кб"</string>
+    <string name="megabyteShort">"Мб"</string>
+    <string name="gigabyteShort">"Гб"</string>
+    <string name="terabyteShort">"Тб"</string>
+    <string name="petabyteShort">"Пб"</string>
+    <string name="untitled">"&lt;без названия&gt;"</string>
+    <string name="ellipsis">"…"</string>
+    <string name="emptyPhoneNumber">"(Нет номера телефона)"</string>
+    <string name="unknownName">"(Неизвестно)"</string>
+    <string name="defaultVoiceMailAlphaTag">"Голосовая почта"</string>
+    <string name="defaultMsisdnAlphaTag">"MSISDN1"</string>
+    <string name="mmiError">"Проблема с подключением или недействительный код MMI."</string>
+    <string name="serviceEnabled">"Служба включена."</string>
+    <string name="serviceEnabledFor">"Служба включена для следующего:"</string>
+    <string name="serviceDisabled">"Служба отключена."</string>
+    <string name="serviceRegistered">"Регистрация прошла успешно."</string>
+    <string name="serviceErased">"Удаление прошло успешно."</string>
+    <string name="passwordIncorrect">"Неверный пароль."</string>
+    <string name="mmiComplete">"Код MMI завершен."</string>
+    <string name="badPin">"Указан неверный старый PIN."</string>
+    <string name="badPuk">"Указан неверный PUK."</string>
+    <string name="mismatchPin">"Указанные PIN-коды не совпадают."</string>
+    <string name="invalidPin">"Введите PIN, содержащий от 4 до 8 цифр."</string>
+    <string name="needPuk">"Ваша SIM-карта заблокирована PUK-кодом. Введите PUK, чтобы разблокировать ее."</string>
+    <string name="needPuk2">"Введите PUK2 для разблокирования SIM-карты."</string>
+    <string name="ClipMmi">"Идентификатор звонящего"</string>
+    <string name="ClirMmi">"Идентификатор принимающего вызов"</string>
+    <string name="CfMmi">"Перенаправление вызовов"</string>
+    <string name="CwMmi">"Ожидание вызова"</string>
+    <string name="BaMmi">"Запрет вызовов"</string>
+    <string name="PwdMmi">"Изменение пароля"</string>
+    <string name="PinMmi">"Изменение PIN"</string>
+    <string name="CLIRDefaultOnNextCallOn">"Идентификатор звонящего по умолчанию ограничен. Следующий вызов: ограничен"</string>
+    <string name="CLIRDefaultOnNextCallOff">"Идентификатор звонящего по умолчанию ограничен. Следующий вызов: не ограничен"</string>
+    <string name="CLIRDefaultOffNextCallOn">"Идентификатор звонящего по умолчанию не ограничен. Следующий вызов: ограничен"</string>
+    <string name="CLIRDefaultOffNextCallOff">"Идентификатор звонящего по умолчанию не ограничен. Следующий вызов: не ограничен"</string>
+    <string name="serviceNotProvisioned">"Услуга не предоставляется."</string>
+    <string name="CLIRPermanent">"Нельзя изменить настройки идентификатора звонящего."</string>
+    <string name="serviceClassVoice">"Голос"</string>
+    <string name="serviceClassData">"Данные"</string>
+    <string name="serviceClassFAX">"ФАКС"</string>
+    <string name="serviceClassSMS">"SMS"</string>
+    <string name="serviceClassDataAsync">"Асинхр."</string>
+    <string name="serviceClassDataSync">"Синхронизация"</string>
+    <string name="serviceClassPacket">"Пакетные данные"</string>
+    <string name="serviceClassPAD">"PAD"</string>
+    <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: не перенаправлено"</string>
+    <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+    <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> через <xliff:g id="TIME_DELAY">{2}</xliff:g> сек."</string>
+    <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: не перенаправлено"</string>
+    <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: не перенаправлено"</string>
+    <string name="httpErrorOk">"ОК"</string>
+    <string name="httpError">"Веб-страница содержит ошибку."</string>
+    <string name="httpErrorLookup">"Не удается найти URL."</string>
+    <string name="httpErrorUnsupportedAuthScheme">"Схема аутентификации сайта не поддерживается."</string>
+    <string name="httpErrorAuth">"Не удалось выполнить аутентификацию."</string>
+    <string name="httpErrorProxyAuth">"Не удалось выполнить аутентификацию через прокси-сервер."</string>
+    <string name="httpErrorConnect">"Не удалось связаться с сервером."</string>
+    <string name="httpErrorIO">"Сервер не отвечает. Повторите попытку позже."</string>
+    <string name="httpErrorTimeout">"Время подключения к серверу истекло."</string>
+    <string name="httpErrorRedirectLoop">"Страница содержит слишком много перенаправлений."</string>
+    <string name="httpErrorUnsupportedScheme">"Протокол не поддерживается"</string>
+    <string name="httpErrorFailedSslHandshake">"Невозможно установить безопасное соединение."</string>
+    <string name="httpErrorBadUrl">"Невозможно открыть страницу, поскольку URL недействителен."</string>
+    <string name="httpErrorFile">"Нет доступа к файлу."</string>
+    <string name="httpErrorFileNotFound">"Нужный файл не найден."</string>
+    <string name="httpErrorTooManyRequests">"Обрабатывается слишком много запросов. Повторите попытку позже."</string>
+    <string name="contentServiceSync">"Синхронизация"</string>
+    <string name="contentServiceSyncNotificationTitle">"Синхронизация"</string>
+    <string name="contentServiceTooManyDeletesNotificationDesc">"Слишком много удалений <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+    <string name="low_memory">"Память телефона полна! Удалите какие-нибудь файлы, чтобы освободить место."</string>
+    <string name="me">"Я"</string>
+    <string name="power_dialog">"Параметры телефона"</string>
+    <string name="silent_mode">"Беззвучный режим"</string>
+    <string name="turn_on_radio">"Включить беспроводную связь"</string>
+    <string name="turn_off_radio">"Отключить беспроводную связь"</string>
+    <string name="screen_lock">"Заблокировать экран"</string>
+    <string name="power_off">"Отключить питание"</string>
+    <string name="shutdown_progress">"Идет выключение…"</string>
+    <string name="shutdown_confirm">"Телефон будет выключен."</string>
+    <string name="no_recent_tasks">"Нет новых приложений."</string>
+    <string name="global_actions">"Параметры телефона"</string>
+    <string name="global_action_lock">"Заблокировать экран"</string>
+    <string name="global_action_power_off">"Отключить питание"</string>
+    <string name="global_action_toggle_silent_mode">"Беззвучный режим"</string>
+    <string name="global_action_silent_mode_on_status">"Звук выключен"</string>
+    <string name="global_action_silent_mode_off_status">"Звук включен"</string>
+    <string name="safeMode">"Безопасный режим"</string>
+    <string name="permgrouplab_costMoney">"Платные службы"</string>
+    <string name="permgroupdesc_costMoney">"Разрешить приложениям выполнять действия, за которые может взиматься плата."</string>
+    <string name="permgrouplab_messages">"Сообщения"</string>
+    <string name="permgroupdesc_messages">"Чтение и запись SMS, электронной почты и других сообщений."</string>
+    <string name="permgrouplab_personalInfo">"Личная информация"</string>
+    <string name="permgroupdesc_personalInfo">"Прямой доступ к вашим контактам и календарю, сохраненным на телефоне."</string>
+    <string name="permgrouplab_location">"Ваше местоположение"</string>
+    <string name="permgroupdesc_location">"Наблюдение за вашим местоположением"</string>
+    <string name="permgrouplab_network">"Связь с сетью"</string>
+    <string name="permgroupdesc_network">"Разрешить приложениям использовать сетевые функции."</string>
+    <string name="permgrouplab_accounts">"Ваши аккаунты Google"</string>
+    <string name="permgroupdesc_accounts">"Доступ к имеющимся аккаунтам Google."</string>
+    <string name="permgrouplab_hardwareControls">"Управление оборудованием"</string>
+    <string name="permgroupdesc_hardwareControls">"Прямой доступ к оборудованию телефона."</string>
+    <string name="permgrouplab_phoneCalls">"Телефонные вызовы"</string>
+    <string name="permgroupdesc_phoneCalls">"Слежение, запись и обработка вызовов."</string>
+    <string name="permgrouplab_systemTools">"Системные инструменты"</string>
+    <string name="permgroupdesc_systemTools">"Доступ и управление системой на низком уровне."</string>
+    <string name="permgrouplab_developmentTools">"Средства для разработки"</string>
+    <string name="permgroupdesc_developmentTools">"Функции, необходимые только разработчикам приложений."</string>
+    <string name="permlab_statusBar">"отключать или изменять панель состояния"</string>
+    <string name="permdesc_statusBar">"Разрешает приложению отключать панель состояния или добавлять и удалять системные значки."</string>
+    <string name="permlab_expandStatusBar">"разворачивать/сворачивать панель состояния"</string>
+    <string name="permdesc_expandStatusBar">"Разрешает приложению разворачивать и сворачивать панель состояния."</string>
+    <string name="permlab_processOutgoingCalls">"перехватывать исходящие вызовы"</string>
+    <string name="permdesc_processOutgoingCalls">"Разрешает приложению обрабатывать исходящие вызовы и изменять набираемый номер. Вредоносное ПО может следить, перенаправлять или блокировать исходящие вызовы."</string>
+    <string name="permlab_receiveSms">"получать SMS"</string>
+    <string name="permdesc_receiveSms">"Разрешает приложениям получать и обрабатывать сообщения SMS. Вредоносное ПО может отслеживать ваши сообщения или удалять до того, как вы их увидите."</string>
+    <string name="permlab_receiveMms">"получать MMS"</string>
+    <string name="permdesc_receiveMms">"Разрешает приложениям получать и обрабатывать сообщения MMS. Вредоносное ПО может отслеживать ваши сообщения или удалять их, не показав вам."</string>
+    <string name="permlab_sendSms">"отправлять SMS"</string>
+    <string name="permdesc_sendSms">"Разрешает приложениям отправлять SMS. Вредоносное ПО может тратить ваши деньги, отправляя сообщения без вашего ведома."</string>
+    <string name="permlab_readSms">"читать SMS и MMS"</string>
+    <string name="permdesc_readSms">"Разрешает приложению записывать SMS, сохраненные в телефоне или на SIM-карте. Вредоносное ПО может читать конфиденциальные сообщения."</string>
+    <string name="permlab_writeSms">"изменять SMS и MMS"</string>
+    <string name="permdesc_writeSms">"Разрешает приложению записывать данные в SMS, сохраненные в телефоне или на SIM-карте. Вредоносное ПО может удалять сообщения."</string>
+    <string name="permlab_receiveWapPush">"получать через WAP"</string>
+    <string name="permdesc_receiveWapPush">"Разрешает приложениям получать и обрабатывать сообщения WAP. Вредоносное ПО может отслеживать ваши сообщения или удалять до того, как вы их увидите."</string>
+    <string name="permlab_getTasks">"получать работающие приложения"</string>
+    <string name="permdesc_getTasks">"Разрешает приложению получать информацию о работающих и недавно выполненных задачах. Может позволить вредоносному ПО получать конфиденциальную информацию о других приложениях."</string>
+    <string name="permlab_reorderTasks">"переупорядочивать работающие приложения"</string>
+    <string name="permdesc_reorderTasks">"Разрешает приложению изменять приоритет задач. Вредоносное ПО может выходить на передний план без вашего разрешения."</string>
+    <string name="permlab_setDebugApp">"включать отладку приложений"</string>
+    <string name="permdesc_setDebugApp">"Разрешает приложению включать отладку других приложений. Вредоносное ПО может таким образом закрывать другие приложения."</string>
+    <string name="permlab_changeConfiguration">"изменять настройки интерфейса"</string>
+    <string name="permdesc_changeConfiguration">"Позволяет приложению изменять текущую конфигурацию, например локаль и общий размер шрифта."</string>
+    <string name="permlab_restartPackages">"перезапускать другие приложения"</string>
+    <string name="permdesc_restartPackages">"Разрешает приложению принудительно перезапускать другие приложения."</string>
+    <string name="permlab_setProcessForeground">"предотвращать остановку"</string>
+    <string name="permdesc_setProcessForeground">"Разрешает приложению запускать любые процессы на переднем плане так, что их нельзя прекратить. Не требуется обычным приложениям."</string>
+    <string name="permlab_forceBack">"принудительно закрывать приложения"</string>
+    <string name="permdesc_forceBack">"Позволяет приложению принудительно закрывать и переводить в фоновый режим действия, работающие на переднем плане. Не требуется обычным приложениям."</string>
+    <string name="permlab_dump">"получать внутреннее состояние системы"</string>
+    <string name="permdesc_dump">"Разрешает приложениям получать внутреннее состояние системы. Вредоносное ПО может получать множество личной и защищенной информации, которая обычно не была бы им доступна."</string>
+    <string name="permlab_addSystemService">"публиковать службы низкого уровня"</string>
+    <string name="permdesc_addSystemService">"Разрешает приложению публиковать собственные системные службы низкого уровня. Вредоносное ПО может взломать систему и украсть или повредить данные в ней."</string>
+    <string name="permlab_runSetActivityWatcher">"наблюдать и управлять запуском всех приложений"</string>
+    <string name="permdesc_runSetActivityWatcher">"Разрешает приложению следить и управлять тем, как система запускает действия. Вредоносное ПО может полностью нарушить работу системы. Это разрешение нужно только для разработки, но не при обычном использовании телефона."</string>
+    <string name="permlab_broadcastPackageRemoved">"отправлять оповещения об удалении пакетов"</string>
+    <string name="permdesc_broadcastPackageRemoved">"Позволяет приложению распространять уведомление об удалении пакета приложения. Вредоносное ПО может использовать это для остановки любых других работающих приложений."</string>
+    <string name="permlab_broadcastSmsReceived">"отправлять оповещения о получении SMS"</string>
+    <string name="permdesc_broadcastSmsReceived">"Разрешает приложению распространять уведомление о том, что получено сообщение SMS. Вредоносное ПО может пользоваться этим для фальсификации входящих сообщений SMS."</string>
+    <string name="permlab_broadcastWapPush">"отправлять оповещения о получении WAP-PUSH"</string>
+    <string name="permdesc_broadcastWapPush">"Разрешает приложению распространять уведомление о получении сообщения WAP PUSH. Вредоносное ПО может использовать это для подделки отчета о получении MMS или просто заменять содержание любой веб-страницы вредоносными вариантами."</string>
+    <string name="permlab_setProcessLimit">"ограничивать количество выполняемых процессов"</string>
+    <string name="permdesc_setProcessLimit">"Позволяет приложению контролировать максимальное количество выполняемых процессов. Не требуется обычным приложениям."</string>
+    <string name="permlab_setAlwaysFinish">"закрывать все фоновые приложения"</string>
+    <string name="permdesc_setAlwaysFinish">"Разрешает приложению следить, чтобы действия всегда завершались после перехода в фоновый режим. Не требуется обычным приложениям."</string>
+    <string name="permlab_fotaUpdate">"автоматически устанавливать системные обновления"</string>
+    <string name="permdesc_fotaUpdate">"Разрешает приложению получать уведомления о предстоящих обновлениях системы и запускать их установку. Это дает вредоносному ПО возможность повредить систему неавторизованными обновлениями или помешать выполнению обновления."</string>
+    <string name="permlab_batteryStats">"изменять данные о батарее"</string>
+    <string name="permdesc_batteryStats">"Разрешает изменять данные о батарее. Не используется обычными приложениями."</string>
+    <string name="permlab_internalSystemWindow">"отображать неавторизованные окна"</string>
+    <string name="permdesc_internalSystemWindow">"Разрешает создавать окна, используемые внутренним системным интерфейсом пользователя. Не для использования обычными программами."</string>
+    <string name="permlab_systemAlertWindow">"отображать системные предупреждения"</string>
+    <string name="permdesc_systemAlertWindow">"Разрешает приложению показывать окна системных предупреждений. Вредоносное ПО может захватить весь экран телефона."</string>
+    <string name="permlab_setAnimationScale">"изменять общую скорость анимации"</string>
+    <string name="permdesc_setAnimationScale">"Позволяет приложению в любой момент изменять общую скорость анимации (ускорять и замедлять анимацию)."</string>
+    <string name="permlab_manageAppTokens">"управлять маркерами приложений"</string>
+    <string name="permdesc_manageAppTokens">"Разрешает приложениям создавать и управлять собственными маркерами вместо обычного порядка Z. Не требуется обычным приложениям."</string>
+    <string name="permlab_injectEvents">"нажимать на клавиши и кнопки управления"</string>
+    <string name="permdesc_injectEvents">"Позволяет приложению передавать другим приложениям собственные события ввода (нажатия клавиш и т.д.). Вредоносное ПО может воспользоваться этим для захвата телефона."</string>
+    <string name="permlab_readInputState">"записывать нажимаемые клавиши и действия"</string>
+    <string name="permdesc_readInputState">"Разрешает приложениям отслеживать нажимаемые клавиши даже при работе в другом приложении (например набор пароля). Никогда не используется обычными приложениями."</string>
+    <string name="permlab_bindInputMethod">"выполнять привязку к способу ввода"</string>
+    <string name="permdesc_bindInputMethod">"Разрешает владельцу привязку к интерфейсу верхнего уровня способа ввода. Не требуется обычным приложениям."</string>
+    <string name="permlab_setOrientation">"изменять положение экрана"</string>
+    <string name="permdesc_setOrientation">"Позволяет приложению в любой момент изменять положение экрана. Не требуется обычным приложениям."</string>
+    <string name="permlab_signalPersistentProcesses">"отправлять приложениям Linux-сигналы"</string>
+    <string name="permdesc_signalPersistentProcesses">"Разрешает приложению запрашивать отправку поступающего сигнала всем постоянным процессам."</string>
+    <string name="permlab_persistentActivity">"выполнять приложение постоянно"</string>
+    <string name="permdesc_persistentActivity">"Позволяет приложению переводить свои компоненты в постоянное состояние так, что система не сможет использовать их для других приложений."</string>
+    <string name="permlab_deletePackages">"удалять приложения"</string>
+    <string name="permdesc_deletePackages">"Разрешает приложению удалять пакеты Android. Вредоносное ПО может воспользоваться этим для удаления важных приложений."</string>
+    <string name="permlab_clearAppUserData">"удалять данные других приложений"</string>
+    <string name="permdesc_clearAppUserData">"Разрешает приложению удалять данные пользователя."</string>
+    <string name="permlab_deleteCacheFiles">"удалять кэш других приложений"</string>
+    <string name="permdesc_deleteCacheFiles">"Позволяет приложению удалять файлы из кэша."</string>
+    <string name="permlab_getPackageSize">"измерять место для хранения данных приложений"</string>
+    <string name="permdesc_getPackageSize">"Разрешает приложению получать размеры своего кода, данных и кэша"</string>
+    <string name="permlab_installPackages">"напрямую устанавливать приложения"</string>
+    <string name="permdesc_installPackages">"Разрешает приложению устанавливать новые или обновленные пакеты Android. Вредоносное ПО может использовать это для добавления новых приложений с абсолютными полномочиями."</string>
+    <string name="permlab_clearAppCache">"удалять все данные из кэша приложений"</string>
+    <string name="permdesc_clearAppCache">"Разрешает приложению освобождать место на телефоне, удаляя файлы из каталога кэша приложения. Обычно доступ разрешен только системным процессам."</string>
+    <string name="permlab_readLogs">"читать файлы системного журнала"</string>
+    <string name="permdesc_readLogs">"Разрешает приложению считывать различные файлы журналов системы. Это позволяет получать сведения о том, что вы делаете с телефоном, но в этих файлах не должно быть личной или конфиденциальной информации."</string>
+    <string name="permlab_diagnostic">"считывать и записывать ресурсы, принадлежащих diag"</string>
+    <string name="permdesc_diagnostic">"Разрешает приложению считывать и записывать в любой ресурс, принадлежащий группе diag, например файлы в /dev. Это может влиять на стабильность и безопасность системы. Следует использовать ТОЛЬКО при диагностике оборудования производителем или оператором."</string>
+    <string name="permlab_changeComponentState">"включать и выключать компоненты приложений"</string>
+    <string name="permdesc_changeComponentState">"Разрешает приложению включать или отключать компоненты другого приложения. Вредоносное ПО сможет отключать важные функции телефона. Эту возможность следует использовать с осторожностью, так как можно привести компоненты приложений в нерабочее, несовместимое или нестабильное состояние."</string>
+    <string name="permlab_setPreferredApplications">"задавать предпочитаемые приложения"</string>
+    <string name="permdesc_setPreferredApplications">"Позволяет приложению изменять предпочитаемые приложения. Это может позволить вредоносному ПО незаметно изменить работающие приложения поддельными  и собрать ваши личные данные."</string>
+    <string name="permlab_writeSettings">"изменять глобальные настройки системы"</string>
+    <string name="permdesc_writeSettings">"Разрешает приложению изменять данные настройки системы. Вредоносное ПО может повредить конфигурацию вашей системы."</string>
+    <string name="permlab_writeSecureSettings">"изменять защищенные настройки системы"</string>
+    <string name="permdesc_writeSecureSettings">"Разрешает приложению изменять данные в защищенных настройках системы. Не используется обычными приложениями."</string>
+    <string name="permlab_writeGservices">"изменять карту служб Google"</string>
+    <string name="permdesc_writeGservices">"Разрешает приложению изменять карту служб Google. Не используется обычными приложениями."</string>
+    <string name="permlab_receiveBootCompleted">"автоматически запускаться при загрузке"</string>
+    <string name="permdesc_receiveBootCompleted">"Разрешает приложению запускаться сразу после загрузки системы. Это может увеличить время запуска телефона, а постоянная работа приложения может снизить общую скорость работы."</string>
+    <string name="permlab_broadcastSticky">"отправлять постоянное оповещение"</string>
+    <string name="permdesc_broadcastSticky">"Разрешает приложению отправлять постоянные оповещения, остающиеся после окончания рассылки. Вредоносное ПО может замедлить работу телефона или привести к нестабильности, используя слишком много памяти."</string>
+    <string name="permlab_readContacts">"считывать данные контактов"</string>
+    <string name="permdesc_readContacts">"Разрешает приложению считывать полную контактную информацию (адрес), сохраненную в вашем телефоне. Может использоваться вредоносным ПО для отправки этих данных другим людям."</string>
+    <string name="permlab_writeContacts">"записывать данные контактов"</string>
+    <string name="permdesc_writeContacts">"Разрешает приложению изменять контактную информацию (адрес), сохраненную в телефоне. Вредоносное ПО может использовать это для удаления или изменения данных контактов."</string>
+    <string name="permlab_writeOwnerData">"записывать данные о владельце"</string>
+    <string name="permdesc_writeOwnerData">"Разрешает приложению изменять данные о владельце, сохраненные в телефоне. Вредоносное ПО может использовать это для удаления или изменения данных о владельце."</string>
+    <string name="permlab_readOwnerData">"считывать данные о владельце"</string>
+    <string name="permdesc_readOwnerData">"Разрешает приложению считывать данные о владельце, сохраненные в телефоне. Вредоносное ПО может использовать это для чтения данных о владельце."</string>
+    <string name="permlab_readCalendar">"считывать данные календаря"</string>
+    <string name="permdesc_readCalendar">"Разрешает приложению считывать все события календаря, сохраненные в телефоне. Вредоносное ПО может использовать это для отправки событий вашего календаря другим людям."</string>
+    <string name="permlab_writeCalendar">"записывать данные календаря"</string>
+    <string name="permdesc_writeCalendar">"Позволяет приложению изменять сохраненные в телефоне события календаря. Вредоносное ПО сможет стирать или изменять данные календаря."</string>
+    <string name="permlab_accessMockLocation">"имитировать источники данных о положении для тестирования"</string>
+    <string name="permdesc_accessMockLocation">"Создание имитаций источников данных о местоположении для тестирования. Вредоносное ПО может использовать это для изменения данных о местоположении и/или состоянии, сообщаемых настоящими источниками таких данных, например GPS или оператором связи."</string>
+    <string name="permlab_accessLocationExtraCommands">"получать доступ к дополнительным командам местоположения от поставщика связи"</string>
+    <string name="permdesc_accessLocationExtraCommands">"Доступ к дополнительным командам местоположения от поставщика связи. Это дает вредоносному ПО возможность мешать работе GPS или других источников данных о местоположении."</string>
+    <string name="permlab_accessFineLocation">"определять точное местоположение (GPS)"</string>
+    <string name="permdesc_accessFineLocation">"Доступ к имеющимся источникам точных данных о местоположении телефона, например к GPS. Вредоносное ПО сможет узнать, где вы находитесь, а также истратить заряд батареи."</string>
+    <string name="permlab_accessCoarseLocation">"определять приблизительное местоположение (на основе данных сети)"</string>
+    <string name="permdesc_accessCoarseLocation">"Доступ (при наличии) к источникам сведений о приблизительном расположении, например базам данных сотовой сети. Вредоносное ПО может использовать эту функцию для того, чтобы определять ваше местоположение."</string>
+    <string name="permlab_accessSurfaceFlinger">"открывать SurfaceFlinger"</string>
+    <string name="permdesc_accessSurfaceFlinger">"Разрешает приложению использовать функции SurfaceFlinger низкого уровня."</string>
+    <string name="permlab_readFrameBuffer">"считывать данные из буфера фреймов"</string>
+    <string name="permdesc_readFrameBuffer">"Разрешает приложению считывать содержание буфера фрейма."</string>
+    <string name="permlab_modifyAudioSettings">"изменять настройки звука"</string>
+    <string name="permdesc_modifyAudioSettings">"Разрешает приложениям изменять глобальные настройки звука, например громкость и маршрут сигнала."</string>
+    <string name="permlab_recordAudio">"записывать звук"</string>
+    <string name="permdesc_recordAudio">"Разрешает приложению получать доступ к пути записи звука."</string>
+    <string name="permlab_camera">"снимать фотографии"</string>
+    <string name="permdesc_camera">"Разрешает приложению делать снимки с помощью камеры. Это позволяет приложению в любой момент записывать то, что видно через камеру."</string>
+    <string name="permlab_brick">"отключать телефон навсегда"</string>
+    <string name="permdesc_brick">"Разрешает приложению навсегда отключить телефон. Это очень опасно."</string>
+    <string name="permlab_reboot">"принудительно перезагружать телефон"</string>
+    <string name="permdesc_reboot">"Разрешает приложению принудительно перезагружать телефон."</string>
+    <string name="permlab_mount_unmount_filesystems">"подключаться и отключаться от файловых систем"</string>
+    <string name="permdesc_mount_unmount_filesystems">"Разрешает приложению подключаться и отключаться от файловых систем съемных устройств хранения."</string>
+    <string name="permlab_vibrate">"управлять вибрацией"</string>
+    <string name="permdesc_vibrate">"Разрешает приложению управлять вибровызовом."</string>
+    <string name="permlab_flashlight">"управлять фонарем"</string>
+    <string name="permdesc_flashlight">"Разрешает приложению управлять фонарем."</string>
+    <string name="permlab_hardware_test">"проверять оборудование"</string>
+    <string name="permdesc_hardware_test">"Разрешает приложению управлять внешними устройствами для тестирования оборудования."</string>
+    <string name="permlab_callPhone">"напрямую вызывать телефонные номера"</string>
+    <string name="permdesc_callPhone">"Разрешает приложениям вызывать телефонные номера без вашего участия. Вредоносное ПО может выполнять вызовы, за которые придется платить. Заметьте, что это не разрешает приложению вызывать номера экстренных служб."</string>
+    <string name="permlab_callPrivileged">"напрямую вызывать любые телефонные номера"</string>
+    <string name="permdesc_callPrivileged">"Разрешает приложению вызывать любой номер, включая экстренные, без вашего участия. Вредоносное ПО может совершать ненужные и незаконные вызовы в службы неотложной помощи."</string>
+    <string name="permlab_locationUpdates">"управлять уведомлениями об обновлении местоположения"</string>
+    <string name="permdesc_locationUpdates">"Разрешает включение/отключение уведомлений о местоположении по радиосвязи. Не используется обычными приложениями."</string>
+    <string name="permlab_checkinProperties">"открывать свойства проверки"</string>
+    <string name="permdesc_checkinProperties">"Разрешает доступ на чтение и запись к свойствам, загруженным службой проверки. Не используется обычными приложениями."</string>
+    <string name="permlab_modifyPhoneState">"изменять состояние телефона"</string>
+    <string name="permdesc_modifyPhoneState">"Позволяет приложению управлять телефонными функциями устройства. Приложение с такими полномочиями может переключать сети, включать и выключать радиосвязь и т.д., не сообщая вам об этом."</string>
+    <string name="permlab_readPhoneState">"считывать состояние телефона"</string>
+    <string name="permdesc_readPhoneState">"Разрешает приложению использовать телефонные функции устройства. Приложение с такими полномочиями может определить номер данного телефона, наличие вызова, номер, с которым связан вызов и так далее."</string>
+    <string name="permlab_wakeLock">"предотвращать переход телефона в режим ожидания"</string>
+    <string name="permdesc_wakeLock">"Разрешает приложению блокировать переход телефона в режим ожидания."</string>
+    <string name="permlab_devicePower">"включать и отключать телефон"</string>
+    <string name="permdesc_devicePower">"Позволяет приложениям включать и выключать телефон."</string>
+    <string name="permlab_factoryTest">"работа в режиме заводского тестирования"</string>
+    <string name="permdesc_factoryTest">"Работа в качестве теста производителя низкого уровня, что дает полный доступ к оборудованию телефона. Доступно только при работе телефона в режиме теста производителя."</string>
+    <string name="permlab_setWallpaper">"устанавливать фоновый рисунок"</string>
+    <string name="permdesc_setWallpaper">"Разрешает приложению устанавливать системный фоновый рисунок."</string>
+    <string name="permlab_setWallpaperHints">"устанавливать подсказки по размеру фонового рисунка"</string>
+    <string name="permdesc_setWallpaperHints">"Разрешает приложению устанавливать системные подсказки по размеру фонового рисунка."</string>
+    <string name="permlab_masterClear">"выполнять сброс системы и восстановление заводских настроек"</string>
+    <string name="permdesc_masterClear">"Разрешает приложению полностью сбрасывать настройки системы до заводских, удаляя все данные, конфигурацию и установленные приложения."</string>
+    <string name="permlab_setTimeZone">"устанавливать часовой пояс"</string>
+    <string name="permdesc_setTimeZone">"Разрешает приложению изменять часовой пояс телефона."</string>
+    <string name="permlab_getAccounts">"обнаруживать известные аккаунты"</string>
+    <string name="permdesc_getAccounts">"Разрешает приложению получать список аккаунтов, известных телефону."</string>
+    <string name="permlab_accessNetworkState">"просматривать состояние сети"</string>
+    <string name="permdesc_accessNetworkState">"Позволяет приложению видеть состояние всех сетей."</string>
+    <string name="permlab_createNetworkSockets">"обладать полным доступом в Интернет"</string>
+    <string name="permdesc_createNetworkSockets">"Позволяет приложению создавать сетевые сокеты."</string>
+    <string name="permlab_writeApnSettings">"записывать настройки названий точек доступа"</string>
+    <string name="permdesc_writeApnSettings">"Разрешает приложению изменять настройки APN, например прокси и порт любого APN."</string>
+    <string name="permlab_changeNetworkState">"изменять подключение к сети"</string>
+    <string name="permdesc_changeNetworkState">"Позволяет приложению изменять подключение к сети."</string>
+    <string name="permlab_accessWifiState">"просматривать состояние Wi-Fi"</string>
+    <string name="permdesc_accessWifiState">"Разрешает приложению просматривать сведения о состоянии Wi-Fi."</string>
+    <string name="permlab_changeWifiState">"изменять состояние Wi-Fi"</string>
+    <string name="permdesc_changeWifiState">"Разрешает приложению подключаться и отключаться от точек доступа Wi-Fi и вносить изменения в настроенные сети Wi-Fi."</string>
+    <string name="permlab_bluetoothAdmin">"управлять Bluetooth"</string>
+    <string name="permdesc_bluetoothAdmin">"Разрешает приложению настраивать локальный телефон с Bluetooth, а также обнаруживать удаленные устройства и соединяться с ними."</string>
+    <string name="permlab_bluetooth">"создавать Bluetooth-подключения"</string>
+    <string name="permdesc_bluetooth">"Позволяет приложению просматривать конфигурацию локального телефона Bluetooth, создавать и разрешать подключение к связанным устройствам."</string>
+    <string name="permlab_disableKeyguard">"отключать блокировку клавиатуры"</string>
+    <string name="permdesc_disableKeyguard">"Разрешает приложению отключать блокировку клавиш и связанную с ней защиту паролем. Пример нормального использования – отключение блокировки телефоном, когда он принимает вызов, и ее включение после окончания вызова."</string>
+    <string name="permlab_readSyncSettings">"считывать настройки синхронизации"</string>
+    <string name="permdesc_readSyncSettings">"Разрешает приложению считывать настройки синхронизации, например наличие синхронизации контактов."</string>
+    <string name="permlab_writeSyncSettings">"записывать настройки синхронизации"</string>
+    <string name="permdesc_writeSyncSettings">"Разрешает приложению изменять настройки синхронизации, например синхронизацию контактов."</string>
+    <string name="permlab_readSyncStats">"считывать данные о синхронизации"</string>
+    <string name="permdesc_readSyncStats">"Разрешает приложению считывать данные о синхронизации, например историю выполненных синхронизаций."</string>
+    <string name="permlab_subscribedFeedsRead">"считывать фиды с подпиской"</string>
+    <string name="permdesc_subscribedFeedsRead">"Позволяет приложению получать сведения о синхронизированных фидах."</string>
+    <string name="permlab_subscribedFeedsWrite">"записывать фиды с подпиской"</string>
+    <string name="permdesc_subscribedFeedsWrite">"Разрешает приложению изменять ваши синхронизированные фиды. Это может позволить вредоносному ПО изменять ваши синхронизированные фиды."</string>
+  <string-array name="phoneTypes">
+    <item>"Домашний"</item>
+    <item>"Мобильный"</item>
+    <item>"Рабочий"</item>
+    <item>"Рабочий факс"</item>
+    <item>"Домашний факс"</item>
+    <item>"Пейджер"</item>
+    <item>"Другое"</item>
+    <item>"Другой"</item>
+  </string-array>
+  <string-array name="emailAddressTypes">
+    <item>"Домашний"</item>
+    <item>"Рабочий"</item>
+    <item>"Другое"</item>
+    <item>"Другой"</item>
+  </string-array>
+  <string-array name="postalAddressTypes">
+    <item>"Домашний"</item>
+    <item>"Рабочий"</item>
+    <item>"Другое"</item>
+    <item>"Другой"</item>
+  </string-array>
+  <string-array name="imAddressTypes">
+    <item>"Домашний"</item>
+    <item>"Рабочий"</item>
+    <item>"Другое"</item>
+    <item>"Другой"</item>
+  </string-array>
+  <string-array name="organizationTypes">
+    <item>"Рабочий"</item>
+    <item>"Другое"</item>
+    <item>"Другой"</item>
+  </string-array>
+  <string-array name="imProtocols">
+    <item>"AIM"</item>
+    <item>"Windows Live"</item>
+    <item>"Yahoo"</item>
+    <item>"Skype"</item>
+    <item>"QQ"</item>
+    <item>"Google Talk"</item>
+    <item>"ICQ"</item>
+    <item>"Jabber"</item>
+  </string-array>
+    <string name="keyguard_password_enter_pin_code">"Введите PIN-код"</string>
+    <string name="keyguard_password_wrong_pin_code">"Неверный PIN-код!"</string>
+    <string name="keyguard_label_text">"Для разблокировки нажмите Menu и 0."</string>
+    <string name="emergency_call_dialog_number_for_display">"Номер экстренной службы"</string>
+    <string name="lockscreen_carrier_default">"(Вне зоны обслуживания)"</string>
+    <string name="lockscreen_screen_locked">"Экран заблокирован."</string>
+    <string name="lockscreen_instructions_when_pattern_enabled">"Нажмите Menu для разблокировки или выполните экстренный вызов."</string>
+    <string name="lockscreen_instructions_when_pattern_disabled">"Чтобы снять блокировку, нажмите Menu."</string>
+    <string name="lockscreen_pattern_instructions">"Для разблокировки воспроизведите комбинацию"</string>
+    <string name="lockscreen_emergency_call">"Экстренный вызов"</string>
+    <string name="lockscreen_pattern_correct">"Верно!"</string>
+    <string name="lockscreen_pattern_wrong">"Неверно, попробуйте еще раз"</string>
+    <string name="lockscreen_plugged_in">"Зарядка (<xliff:g id="NUMBER">%d%%</xliff:g>)"</string>
+    <string name="lockscreen_low_battery">"Подключите зарядное устройство."</string>
+    <string name="lockscreen_missing_sim_message_short">"Нет SIM-карты."</string>
+    <string name="lockscreen_missing_sim_message">"В телефоне нет SIM-карты."</string>
+    <string name="lockscreen_missing_sim_instructions">"Вставьте SIM-карту."</string>
+    <string name="lockscreen_network_locked_message">"Заблокирована сетью"</string>
+    <string name="lockscreen_sim_puk_locked_message">"SIM-карта заблокирована PUK-кодом."</string>
+    <string name="lockscreen_sim_puk_locked_instructions">"Свяжитесь со службой поддержки."</string>
+    <string name="lockscreen_sim_locked_message">"SIM-карта заблокирована."</string>
+    <string name="lockscreen_sim_unlock_progress_dialog_message">"Разблокировка SIM-карты..."</string>
+    <string name="lockscreen_too_many_failed_attempts_dialog_message">"Вы неправильно воспроизвели комбинацию разблокировки <xliff:g id="NUMBER_0">%d</xliff:g> раз. "\n\n"Повторите попытку через <xliff:g id="NUMBER_1">%d</xliff:g> сек."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin">"Вы неверно воспроизвели комбинацию разблокировки <xliff:g id="NUMBER_0">%d</xliff:g> раз(а). После <xliff:g id="NUMBER_1">%d</xliff:g> неудачных попыток(ки) придется разблокировать телефон с помощью входа Google."\n\n" Повторите попытку через <xliff:g id="NUMBER_2">%d</xliff:g> сек."</string>
+    <string name="lockscreen_too_many_failed_attempts_countdown">"Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> сек."</string>
+    <string name="lockscreen_forgot_pattern_button_text">"Забыли комбинацию?"</string>
+    <string name="lockscreen_glogin_too_many_attempts">"Слишком много попыток ввести комбинацию!"</string>
+    <string name="lockscreen_glogin_instructions">"Для разблокировки"\n"войдите с помощью своего аккаунта Google"</string>
+    <string name="lockscreen_glogin_username_hint">"Имя пользователя (адрес электронной почты)"</string>
+    <string name="lockscreen_glogin_password_hint">"Пароль"</string>
+    <string name="lockscreen_glogin_submit_button">"Войти"</string>
+    <string name="lockscreen_glogin_invalid_input">"Недействительное имя пользователя или пароль."</string>
+    <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
+    <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+    <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+    <!-- no translation found for hour_ampm (7618670480400517084) -->
+    <skip />
+    <!-- no translation found for hour_cap_ampm (5117798389811605468) -->
+    <skip />
+    <string name="status_bar_clear_all_button">"Очистить уведомления"</string>
+    <string name="status_bar_no_notifications_title">"Нет уведомлений"</string>
+    <string name="status_bar_ongoing_events_title">"Текущие"</string>
+    <string name="status_bar_latest_events_title">"Уведомления"</string>
+    <!-- no translation found for battery_status_text_percent_format (8818848472818880005) -->
+    <skip />
+    <string name="battery_status_charging">"Идет зарядка..."</string>
+    <string name="battery_low_title">"Подключите зарядное устройство"</string>
+    <string name="battery_low_subtitle">"Батарея садится:"</string>
+    <string name="battery_low_percent_format">"осталось менее <xliff:g id="NUMBER">%d%%</xliff:g>."</string>
+    <string name="factorytest_failed">"Ошибка заводского теста"</string>
+    <string name="factorytest_not_system">"Действие FACTORY_TEST поддерживается только для пакетов, установленных в папке /system/app."</string>
+    <string name="factorytest_no_action">"Пакет, предоставляющий действие FACTORY_TEST, не найден."</string>
+    <string name="factorytest_reboot">"Перезагрузить"</string>
+    <string name="save_password_label">"Подтверждение"</string>
+    <string name="save_password_message">"Сохранить этот пароль в браузере?"</string>
+    <string name="save_password_notnow">"Не сейчас"</string>
+    <string name="save_password_remember">"Запомнить"</string>
+    <string name="save_password_never">"Никогда"</string>
+    <string name="open_permission_deny">"У вас нет разрешения открывать эту страницу."</string>
+    <string name="text_copied">"Текст скопирован в буфер обмена."</string>
+    <string name="more_item_label">"Еще"</string>
+    <string name="prepend_shortcut_label">"Мenu+"</string>
+    <string name="menu_space_shortcut_label">"место"</string>
+    <string name="menu_enter_shortcut_label">"ввод"</string>
+    <string name="menu_delete_shortcut_label">"удалить"</string>
+    <string name="search_go">"Поиск"</string>
+    <string name="today">"Сегодня"</string>
+    <string name="yesterday">"Вчера"</string>
+    <string name="tomorrow">"Завтра"</string>
+    <string name="oneMonthDurationPast">"1 месяц назад"</string>
+    <string name="beforeOneMonthDurationPast">"Больше 1 месяца назад"</string>
+  <plurals name="num_seconds_ago">
+    <item quantity="one">"1 секунду назад"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> сек. назад"</item>
+  </plurals>
+  <plurals name="num_minutes_ago">
+    <item quantity="one">"1 минуту назад"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> мин. назад"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one">"1 час назад"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> ч. назад"</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one">"вчера"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> дн. назад"</item>
+  </plurals>
+  <plurals name="in_num_seconds">
+    <item quantity="one">"через 1 секунду"</item>
+    <item quantity="other">"через <xliff:g id="COUNT">%d</xliff:g> сек."</item>
+  </plurals>
+  <plurals name="in_num_minutes">
+    <item quantity="one">"через 1 минуту"</item>
+    <item quantity="other">"через <xliff:g id="COUNT">%d</xliff:g> мин."</item>
+  </plurals>
+  <plurals name="in_num_hours">
+    <item quantity="one">"через 1 час"</item>
+    <item quantity="other">"через <xliff:g id="COUNT">%d</xliff:g> час."</item>
+  </plurals>
+  <plurals name="in_num_days">
+    <item quantity="one">"завтра"</item>
+    <item quantity="other">"через <xliff:g id="COUNT">%d</xliff:g> дн."</item>
+  </plurals>
+    <!-- no translation found for abbrev_num_seconds_ago:one (1849036840200069118) -->
+    <!-- no translation found for abbrev_num_seconds_ago:other (3699169366650930415) -->
+    <!-- no translation found for abbrev_num_minutes_ago:one (6361490147113871545) -->
+    <!-- no translation found for abbrev_num_minutes_ago:other (851164968597150710) -->
+    <!-- no translation found for abbrev_num_hours_ago:one (4796212039724722116) -->
+    <!-- no translation found for abbrev_num_hours_ago:other (6889970745748538901) -->
+    <!-- no translation found for abbrev_num_days_ago:one (8463161711492680309) -->
+    <!-- no translation found for abbrev_num_days_ago:other (3453342639616481191) -->
+    <!-- no translation found for abbrev_in_num_seconds:one (5842225370795066299) -->
+    <!-- no translation found for abbrev_in_num_seconds:other (5495880108825805108) -->
+    <!-- no translation found for abbrev_in_num_minutes:one (562786149928284878) -->
+    <!-- no translation found for abbrev_in_num_minutes:other (4216113292706568726) -->
+    <!-- no translation found for abbrev_in_num_hours:one (3274708118124045246) -->
+    <!-- no translation found for abbrev_in_num_hours:other (3705373766798013406) -->
+    <!-- no translation found for abbrev_in_num_days:one (2178576254385739855) -->
+    <!-- no translation found for abbrev_in_num_days:other (2973062968038355991) -->
+    <string name="preposition_for_date">"%s"</string>
+    <string name="preposition_for_time">"в %s"</string>
+    <string name="preposition_for_year">"в %s"</string>
+    <string name="day">"день"</string>
+    <string name="days">"дни"</string>
+    <string name="hour">"час"</string>
+    <string name="hours">"часы"</string>
+    <string name="minute">"мин"</string>
+    <string name="minutes">"мин."</string>
+    <string name="second">"сек"</string>
+    <string name="seconds">"сек."</string>
+    <string name="week">"неделя"</string>
+    <string name="weeks">"недели"</string>
+    <string name="year">"год"</string>
+    <string name="years">"годы"</string>
+    <string name="sunday">"воскресенье"</string>
+    <string name="monday">"понедельник"</string>
+    <string name="tuesday">"вторник"</string>
+    <string name="wednesday">"среда"</string>
+    <string name="thursday">"четверг"</string>
+    <string name="friday">"пятница"</string>
+    <string name="saturday">"суббота"</string>
+    <string name="every_weekday">"По рабочим дням (пн-пт)"</string>
+    <string name="daily">"Ежедневно"</string>
+    <string name="weekly">"Еженедельно в: <xliff:g id="DAY">%s</xliff:g>"</string>
+    <string name="monthly">"Ежемесячно"</string>
+    <string name="yearly">"Ежегодно"</string>
+    <string name="VideoView_error_title">"Не удается воспроизвести видео"</string>
+    <string name="VideoView_error_text_unknown">"К сожалению, это видео нельзя воспроизвести."</string>
+    <string name="VideoView_error_button">"ОК"</string>
+    <string name="am">"AM"</string>
+    <string name="pm">"PM"</string>
+    <string name="numeric_date">"<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
+    <string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string>
+    <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
+    <string name="date1_date2">"<xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>"</string>
+    <string name="time1_time2">"<xliff:g id="TIME1">%1$s</xliff:g> – <xliff:g id="TIME2">%2$s</xliff:g>"</string>
+    <string name="time_wday_date">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>, <xliff:g id="DATE">%3$s</xliff:g>"</string>
+    <string name="wday_date">"<xliff:g id="WEEKDAY">%2$s</xliff:g>, <xliff:g id="DATE">%3$s</xliff:g>"</string>
+    <string name="time_date">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="DATE">%3$s</xliff:g>"</string>
+    <!-- no translation found for date_time (6104442718633642836) -->
+    <skip />
+    <!-- no translation found for relative_time (1818557177829411417) -->
+    <skip />
+    <string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string>
+    <string name="full_date_month_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="full_date_day_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="medium_date_month_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="medium_date_day_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="twelve_hour_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">a</xliff:g>"</string>
+    <string name="twenty_four_hour_time_format">"<xliff:g id="HOUR">H</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g>"</string>
+    <string name="noon">"полдень"</string>
+    <string name="Noon">"Полдень"</string>
+    <string name="midnight">"полночь"</string>
+    <string name="Midnight">"Полночь"</string>
+    <!-- no translation found for month_day (5565829181417740906) -->
+    <skip />
+    <!-- no translation found for month (7026169712234774086) -->
+    <skip />
+    <string name="month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <!-- no translation found for month_year (9219019380312413367) -->
+    <skip />
+    <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
+    <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <string name="same_year_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
+    <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
+    <string name="same_year_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR">%9$s</xliff:g>"</string>
+    <string name="same_year_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR">%9$s</xliff:g>"</string>
+    <string name="same_year_md1_time1_md2_time2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_year_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_year_mdy1_time1_mdy2_time2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>"</string>
+    <string name="numeric_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>"</string>
+    <string name="numeric_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="numeric_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="numeric_md1_time1_md2_time2">"<xliff:g id="DAY1">%3$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_mdy1_time1_mdy2_time2">"<xliff:g id="DAY1">%3$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>"</string>
+    <string name="same_month_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
+    <string name="same_month_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="same_month_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="same_month_md1_time1_md2_time2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <!-- no translation found for abbrev_month_year (3856424847226891943) -->
+    <skip />
+    <!-- no translation found for abbrev_month_day (5028815883653985933) -->
+    <skip />
+    <!-- no translation found for abbrev_month (3131032032850777433) -->
+    <skip />
+    <string name="day_of_week_long_sunday">"воскресенье"</string>
+    <string name="day_of_week_long_monday">"понедельник"</string>
+    <string name="day_of_week_long_tuesday">"вторник"</string>
+    <string name="day_of_week_long_wednesday">"среда"</string>
+    <string name="day_of_week_long_thursday">"четверг"</string>
+    <string name="day_of_week_long_friday">"пятница"</string>
+    <string name="day_of_week_long_saturday">"суббота"</string>
+    <string name="day_of_week_medium_sunday">"вс"</string>
+    <string name="day_of_week_medium_monday">"пн"</string>
+    <string name="day_of_week_medium_tuesday">"вт"</string>
+    <string name="day_of_week_medium_wednesday">"ср"</string>
+    <string name="day_of_week_medium_thursday">"чт"</string>
+    <string name="day_of_week_medium_friday">"пт"</string>
+    <string name="day_of_week_medium_saturday">"сб"</string>
+    <string name="day_of_week_short_sunday">"вс"</string>
+    <string name="day_of_week_short_monday">"пн"</string>
+    <string name="day_of_week_short_tuesday">"вт"</string>
+    <string name="day_of_week_short_wednesday">"ср"</string>
+    <string name="day_of_week_short_thursday">"чт"</string>
+    <string name="day_of_week_short_friday">"пт"</string>
+    <string name="day_of_week_short_saturday">"сб"</string>
+    <string name="day_of_week_shorter_sunday">"вс"</string>
+    <string name="day_of_week_shorter_monday">"пн"</string>
+    <string name="day_of_week_shorter_tuesday">"вт"</string>
+    <string name="day_of_week_shorter_wednesday">"с"</string>
+    <string name="day_of_week_shorter_thursday">"чт"</string>
+    <string name="day_of_week_shorter_friday">"пт"</string>
+    <string name="day_of_week_shorter_saturday">"сб"</string>
+    <string name="day_of_week_shortest_sunday">"в"</string>
+    <string name="day_of_week_shortest_monday">"п"</string>
+    <string name="day_of_week_shortest_tuesday">"в"</string>
+    <string name="day_of_week_shortest_wednesday">"с"</string>
+    <string name="day_of_week_shortest_thursday">"ч"</string>
+    <string name="day_of_week_shortest_friday">"п"</string>
+    <string name="day_of_week_shortest_saturday">"с"</string>
+    <string name="month_long_january">"январь"</string>
+    <string name="month_long_february">"февраль"</string>
+    <string name="month_long_march">"март"</string>
+    <string name="month_long_april">"апрель"</string>
+    <string name="month_long_may">"май"</string>
+    <string name="month_long_june">"июнь"</string>
+    <string name="month_long_july">"июль"</string>
+    <string name="month_long_august">"август"</string>
+    <string name="month_long_september">"сентябрь"</string>
+    <string name="month_long_october">"октябрь"</string>
+    <string name="month_long_november">"ноябрь"</string>
+    <string name="month_long_december">"декабрь"</string>
+    <string name="month_medium_january">"янв"</string>
+    <string name="month_medium_february">"фев"</string>
+    <string name="month_medium_march">"мар"</string>
+    <string name="month_medium_april">"апр"</string>
+    <string name="month_medium_may">"май"</string>
+    <string name="month_medium_june">"июн"</string>
+    <string name="month_medium_july">"июл"</string>
+    <string name="month_medium_august">"авг"</string>
+    <string name="month_medium_september">"сен"</string>
+    <string name="month_medium_october">"окт"</string>
+    <string name="month_medium_november">"ноя"</string>
+    <string name="month_medium_december">"дек"</string>
+    <string name="month_shortest_january">"Я"</string>
+    <string name="month_shortest_february">"ф"</string>
+    <string name="month_shortest_march">"м"</string>
+    <string name="month_shortest_april">"а"</string>
+    <string name="month_shortest_may">"м"</string>
+    <string name="month_shortest_june">"и"</string>
+    <string name="month_shortest_july">"и"</string>
+    <string name="month_shortest_august">"а"</string>
+    <string name="month_shortest_september">"с"</string>
+    <string name="month_shortest_october">"о"</string>
+    <string name="month_shortest_november">"н"</string>
+    <string name="month_shortest_december">"д"</string>
+    <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+    <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
+    <string name="selectAll">"Выбрать все"</string>
+    <string name="selectText">"Выбрать текст"</string>
+    <string name="stopSelectingText">"Прекратить выбор текста"</string>
+    <string name="cut">"Вырезать"</string>
+    <string name="cutAll">"Вырезать все"</string>
+    <string name="copy">"Копировать"</string>
+    <string name="copyAll">"Копировать все"</string>
+    <string name="paste">"Вставить"</string>
+    <string name="copyUrl">"Копировать URL"</string>
+    <string name="inputMethod">"Способ ввода"</string>
+    <string name="editTextMenuTitle">"Правка текста"</string>
+    <string name="low_internal_storage_view_title">"Недостаточно места"</string>
+    <string name="low_internal_storage_view_text">"В памяти телефона осталось мало места."</string>
+    <string name="ok">"ОК"</string>
+    <string name="cancel">"Отмена"</string>
+    <string name="yes">"ОК"</string>
+    <string name="no">"Отмена"</string>
+    <string name="capital_on">"ВКЛ"</string>
+    <string name="capital_off">"ВЫКЛ"</string>
+    <string name="whichApplication">"Выполнить действие с помощью"</string>
+    <string name="alwaysUse">"Использовать для этого действия по умолчанию."</string>
+    <string name="clearDefaultHintMsg">"Значения по умолчанию можно сбросить в разделе Настройки главного экрана &gt; Приложения &gt; Управление приложениями."</string>
+    <string name="chooseActivity">"Выберите действие"</string>
+    <string name="noApplications">"Нет приложений, которые могли бы выполнить это действие."</string>
+    <string name="aerr_title">"Ой!"</string>
+    <string name="aerr_application">"Приложение <xliff:g id="APPLICATION">%1$s</xliff:g> (процесс <xliff:g id="PROCESS">%2$s</xliff:g>) неожиданно остановилось. Повторите попытку."</string>
+    <string name="aerr_process">"Процесс <xliff:g id="PROCESS">%1$s</xliff:g> неожиданно остановился. Повторите попытку."</string>
+    <string name="anr_title">"Ой!"</string>
+    <string name="anr_activity_application">"Действие <xliff:g id="ACTIVITY">%1$s</xliff:g> (в приложении <xliff:g id="APPLICATION">%2$s</xliff:g>) не отвечает."</string>
+    <string name="anr_activity_process">"Действие <xliff:g id="ACTIVITY">%1$s</xliff:g> (в процессе <xliff:g id="PROCESS">%2$s</xliff:g>) не отвечает."</string>
+    <string name="anr_application_process">"Приложение <xliff:g id="APPLICATION">%1$s</xliff:g> (в процессе <xliff:g id="PROCESS">%2$s</xliff:g>) не отвечает."</string>
+    <string name="anr_process">"Процесс <xliff:g id="PROCESS">%1$s</xliff:g> не отвечает."</string>
+    <string name="force_close">"Закрыть принудительно"</string>
+    <string name="wait">"Подождать"</string>
+    <string name="debug">"Отладка"</string>
+    <string name="sendText">"Выберите действие для текста"</string>
+    <string name="volume_ringtone">"Громкость звонка"</string>
+    <string name="volume_music">"Громкость звука мультимедиа"</string>
+    <string name="volume_music_hint_playing_through_bluetooth">"Воспроизводится через Bluetooth"</string>
+    <string name="volume_call">"Громкость звонка"</string>
+    <string name="volume_call_hint_playing_through_bluetooth">"Воспроизводится через Bluetooth"</string>
+    <string name="volume_alarm">"Громкость будильника"</string>
+    <string name="volume_notification">"Громкость уведомления"</string>
+    <string name="volume_unknown">"Громкость"</string>
+    <string name="ringtone_default">"Мелодия звонка по умолчанию"</string>
+    <string name="ringtone_default_with_actual">"Мелодия звонка по умолчанию (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+    <string name="ringtone_silent">"Тишина"</string>
+    <string name="ringtone_picker_title">"Мелодии звонка"</string>
+    <string name="ringtone_unknown">"Неизвестная мелодия звонка"</string>
+  <plurals name="wifi_available">
+    <item quantity="one">"Доступна сеть Wi-Fi"</item>
+    <item quantity="other">"Доступны сети Wi-Fi"</item>
+  </plurals>
+  <plurals name="wifi_available_detailed">
+    <item quantity="one">"Доступна открытая сеть Wi-Fi"</item>
+    <item quantity="other">"Доступны открытые сети Wi-Fi"</item>
+  </plurals>
+    <string name="select_character">"Вставка символа"</string>
+    <string name="sms_control_default_app_name">"Неизвестное приложение"</string>
+    <string name="sms_control_title">"Отправка SMS"</string>
+    <string name="sms_control_message">"Отправляется большое количество сообщений SMS. Выберите \"ОК\", чтобы продолжить, или \"Отмена\", чтобы остановить отправку."</string>
+    <string name="sms_control_yes">"ОК"</string>
+    <string name="sms_control_no">"Отмена"</string>
+    <string name="date_time_set">"Установить"</string>
+    <string name="default_permission_group">"По умолчанию"</string>
+    <string name="no_permissions">"Не требуется разрешений"</string>
+    <string name="perms_hide"><b>"Скрыть"</b></string>
+    <string name="perms_show_all"><b>"Показать все"</b></string>
+    <string name="googlewebcontenthelper_loading">"Идет загрузка…"</string>
+    <string name="usb_storage_title">"Подключение через USB"</string>
+    <string name="usb_storage_message">"Вы подключили телефон к компьютеру через USB. Выберите \"Подключиться\" для копирования файлов между компьютером и картой SD телефона."</string>
+    <string name="usb_storage_button_mount">"Подключиться"</string>
+    <string name="usb_storage_button_unmount">"Не подключаться"</string>
+    <string name="usb_storage_error_message">"Не удается использовать карту SD в качестве USB-хранилища."</string>
+    <string name="usb_storage_notification_title">"Подключение через USB"</string>
+    <string name="usb_storage_notification_message">"Выберите для копирования файлов на/с компьютера."</string>
+    <string name="select_input_method">"Выбор способа ввода"</string>
+    <string name="fast_scroll_alphabet">"АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ"</string>
+    <string name="fast_scroll_numeric_alphabet">"0123456789АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ"</string>
+    <string name="candidates_style"><font fgcolor="#ff000000" bgcolor="#ff8080ff"><u>"кандидаты"</u>"u&gt;"</font></string>
+</resources>
index e30e31b..27b8fea 100644 (file)
     <string name="serviceEnabledFor">"已针对以下内容启用了服务:"</string>
     <string name="serviceDisabled">"服务已被禁用。"</string>
     <string name="serviceRegistered">"注册成功。"</string>
-    <string name="serviceErased">"清除成功"</string>
+    <string name="serviceErased">"清除已成功。"</string>
     <string name="passwordIncorrect">"密码不正确。"</string>
-    <string name="mmiComplete">"MMI 已完成。"</string>
-    <string name="badPin">"您键入的旧 PIN 不正确。"</string>
-    <string name="badPuk">"您键入的 PUK 不正确。"</string>
-    <string name="mismatchPin">"您输入的 PIN 不匹配。"</string>
-    <string name="invalidPin">"键入一个 4 到 8 位数的 PIN。"</string>
-    <!-- no translation found for needPuk (919668385956251611) -->
-    <skip />
-    <string name="needPuk2">"键入 PUK2 以解锁 SIM 卡。"</string>
+    <string name="mmiComplete">"MMI 码已完成。"</string>
+    <string name="badPin">"您键入的旧 PIN 码不正确。"</string>
+    <string name="badPuk">"您键入的 PUK 码不正确。"</string>
+    <string name="mismatchPin">"您输入的 PIN 码不匹配。"</string>
+    <string name="invalidPin">"键入一个 4 到 8 位数的 PIN 码。"</string>
+    <string name="needPuk">"已对 SIM 卡进行 PUK 码锁定。键入 PUK 码将其解锁。"</string>
+    <string name="needPuk2">"键入 PUK2 码以解锁 SIM 卡。"</string>
     <string name="ClipMmi">"来电者 ID"</string>
     <string name="ClirMmi">"去电者 ID"</string>
     <string name="CfMmi">"呼叫转移"</string>
     <string name="CwMmi">"呼叫等待"</string>
     <string name="BaMmi">"呼叫限制"</string>
     <string name="PwdMmi">"密码更改"</string>
-    <string name="PinMmi">"PIN 更改"</string>
+    <string name="PinMmi">"PIN 更改"</string>
     <string name="CLIRDefaultOnNextCallOn">"呼叫者 ID 默认情况下受限制。下一个呼叫:受限制"</string>
     <string name="CLIRDefaultOnNextCallOff">"呼叫者 ID 默认情况下受限制。下一个呼叫:不受限制"</string>
     <string name="CLIRDefaultOffNextCallOn">"呼叫者 ID 默认情况下不受限制。下一个呼叫:受限制"</string>
     <string name="screen_lock">"屏幕锁定"</string>
     <string name="power_off">"关机"</string>
     <string name="shutdown_progress">"正在关机..."</string>
-    <string name="shutdown_confirm">"您的手机会关。"</string>
+    <string name="shutdown_confirm">"您的手机会关。"</string>
     <string name="no_recent_tasks">"没有最近的应用程序。"</string>
     <string name="global_actions">"手机选项"</string>
     <string name="global_action_lock">"屏幕锁定"</string>
     <string name="global_action_power_off">"关机"</string>
     <string name="global_action_toggle_silent_mode">"静音模式"</string>
     <string name="global_action_silent_mode_on_status">"声音已关闭"</string>
-    <string name="global_action_silent_mode_off_status">"声音已“开启”"</string>
+    <string name="global_action_silent_mode_off_status">"声音已开启"</string>
     <string name="safeMode">"安全模式"</string>
     <string name="permgrouplab_costMoney">"需要您支付费用的服务"</string>
     <string name="permgroupdesc_costMoney">"允许应用程序执行可能需要您支付费用的操作。"</string>
-    <string name="permgrouplab_messages">"您的息"</string>
+    <string name="permgrouplab_messages">"您的息"</string>
     <string name="permgroupdesc_messages">"阅读并编写您的短信、电子邮件和其他消息。"</string>
     <string name="permgrouplab_personalInfo">"您的个人信息"</string>
     <string name="permgroupdesc_personalInfo">"直接访问手机中存储的联系人和日历。"</string>
     <string name="permlab_expandStatusBar">"展开/收拢状态栏"</string>
     <string name="permdesc_expandStatusBar">"允许应用程序展开或收拢状态栏。"</string>
     <string name="permlab_processOutgoingCalls">"拦截去电"</string>
-    <string name="permdesc_processOutgoingCalls">"允许应用程序处理去电和更改要拨打的号码。恶意应用程序可能会监视、重定向或阻止去电。"</string>
+    <string name="permdesc_processOutgoingCalls">"允许应用程序处理去电和更改要拨打的号码。恶意应用程序可能会借此监视、重定向或阻止去电。"</string>
     <string name="permlab_receiveSms">"接收短信"</string>
-    <string name="permdesc_receiveSms">"允许应用程序接收和处理短信。恶意应用程序可能监视您的消息,或将消息删除,而不向您显示。"</string>
+    <string name="permdesc_receiveSms">"允许应用程序接收和处理短信。恶意应用程序可能会借此监视您的信息,或将信息删除,而不向您显示。"</string>
     <string name="permlab_receiveMms">"接收彩信"</string>
     <string name="permdesc_receiveMms">"允许应用程序接收和处理彩信。恶意应用程序可能会借此监视您的信息,或在您尚未看到的情况下就将其删除。"</string>
     <string name="permlab_sendSms">"发送短信"</string>
-    <string name="permdesc_sendSms">"å\85\81许åº\94ç\94¨ç¨\8båº\8få\8f\91é\80\81ç\9f­ä¿¡ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\9c¨æ\9cªç»\8fæ\82¨ç¡®è®¤ç\9a\84æ\83\85å\86µä¸\8bå\8f\91é\80\81æ¶\88息从而让您支付费用。"</string>
+    <string name="permdesc_sendSms">"å\85\81许åº\94ç\94¨ç¨\8båº\8få\8f\91é\80\81ç\9f­ä¿¡ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\80\9fæ­¤å\9c¨æ\9cªç»\8fæ\82¨ç¡®è®¤ç\9a\84æ\83\85å\86µä¸\8bå\8f\91é\80\81ä¿¡息从而让您支付费用。"</string>
     <string name="permlab_readSms">"读取短信或彩信"</string>
-    <string name="permdesc_readSms">"允许应用程序读取您的手机或 SIM 卡中存储的短信。恶意应用程序可能会读取您的机密消息。"</string>
+    <string name="permdesc_readSms">"允许应用程序读取您的手机或 SIM 卡中存储的短信。恶意应用程序可能会借此读取您的机密信息。"</string>
     <string name="permlab_writeSms">"编辑短信或彩信"</string>
-    <string name="permdesc_writeSms">"允许应用程序写入手机或 SIM 卡中存储的短信。恶意应用程序可能会借此删除您的息。"</string>
+    <string name="permdesc_writeSms">"允许应用程序写入手机或 SIM 卡中存储的短信。恶意应用程序可能会借此删除您的息。"</string>
     <string name="permlab_receiveWapPush">"接收 WAP"</string>
-    <string name="permdesc_receiveWapPush">"允许应用程序接收和处理 WAP 消息。恶意应用程序可能监视您的消息,或将消息删除,而不向您显示。"</string>
-    <string name="permlab_getTasks">"检索运行的应用程序"</string>
-    <string name="permdesc_getTasks">"允许应用程序检索有关当前和最近运行的任务的信息。恶意应用程序可能会利用此权限发现有关其他应用程序的私有信息。"</string>
+    <string name="permdesc_receiveWapPush">"允许应用程序接收和处理 WAP 信息。恶意应用程序可能会借此监视您的信息,或将信息删除,而不向您显示。"</string>
+    <string name="permlab_getTasks">"检索正在运行的应用程序"</string>
+    <string name="permdesc_getTasks">"恶意应用程序可能会借此找到有关其他应用程序的私有信息。恶意应用程序可能会借此发现有关其他应用程序的私有信息。"</string>
     <string name="permlab_reorderTasks">"对正在运行的应用程序重新排序"</string>
     <string name="permdesc_reorderTasks">"允许应用程序将任务移至前端和后台。恶意应用程序可能会借此强行进到前台,而不受您的控制。"</string>
     <string name="permlab_setDebugApp">"启用应用程序调试"</string>
-    <string name="permdesc_setDebugApp">"允许应用程序启动对其他应用程序的调试。恶意应用程序可能利用此权限终止其他应用程序。"</string>
-    <string name="permlab_changeConfiguration">"更改 UI 设置"</string>
+    <string name="permdesc_setDebugApp">"允许应用程序启动对其他应用程序的调试。恶意应用程序可能会借此终止其他应用程序。"</string>
+    <string name="permlab_changeConfiguration">"更改您的 UI 设置"</string>
     <string name="permdesc_changeConfiguration">"允许应用程序更改当前配置,例如语言设置或整体的字体大小。"</string>
     <string name="permlab_restartPackages">"重新启动其他应用程序"</string>
     <string name="permdesc_restartPackages">"允许应用程序强制重新启动其他应用程序。"</string>
     <string name="permlab_forceBack">"强制应用程序关闭"</string>
     <string name="permdesc_forceBack">"允许应用程序强制前台的任何活动关闭和重新开始。普通应用程序从不需要使用此权限。"</string>
     <string name="permlab_dump">"检索系统内部状态"</string>
-    <string name="permdesc_dump">"允许应用程序检索系统的内部状态。恶意应用程序可能会检索通常它们本不需要的各种私有和安全信息。"</string>
+    <string name="permdesc_dump">"允许应用程序检索系统的内部状态。恶意应用程序可能会借此检索通常它们本不需要的各种私有和安全信息。"</string>
     <string name="permlab_addSystemService">"发布低级服务"</string>
-    <string name="permdesc_addSystemService">"允许应用程序发布自己的低级系统服务。恶意应用程序可能会攻击系统,以及盗取或破坏系统中的任何数据。"</string>
+    <string name="permdesc_addSystemService">"允许应用程序发布自己的低级系统服务。恶意应用程序可能会借此攻击系统,以及盗取或破坏系统中的任何数据。"</string>
     <string name="permlab_runSetActivityWatcher">"监视和控制所有应用程序启动"</string>
-    <string name="permdesc_runSetActivityWatcher">"允许应用程序监视和控制系统启动活动的方式。恶意应用程序可能会彻底损坏系统。此权限仅在开发时才需要,普通的手机应用不需要。"</string>
+    <string name="permdesc_runSetActivityWatcher">"å\85\81许åº\94ç\94¨ç¨\8båº\8fç\9b\91è§\86å\92\8cæ\8e§å\88¶ç³»ç»\9få\90¯å\8a¨æ´»å\8a¨ç\9a\84æ\96¹å¼\8fã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\80\9f此彻åº\95æ\8d\9få\9d\8fç³»ç»\9fã\80\82æ­¤æ\9d\83é\99\90ä»\85å\9c¨å¼\80å\8f\91æ\97¶æ\89\8dé\9c\80è¦\81ï¼\8cæ\99®é\80\9aç\9a\84æ\89\8bæ\9cºåº\94ç\94¨ä¸\8dé\9c\80è¦\81ã\80\82"</string>
     <string name="permlab_broadcastPackageRemoved">"发送包删除的广播"</string>
-    <string name="permdesc_broadcastPackageRemoved">"å\85\81许åº\94ç\94¨ç¨\8båº\8f广æ\92­å·²å\88 é\99¤æ\9f\90åº\94ç\94¨ç¨\8båº\8få\8c\85ç\9a\84é\80\9aç\9f¥ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\88©ç\94¨æ­¤æ\9d\83é\99\90终止任何其他正在运行的应用程序。"</string>
+    <string name="permdesc_broadcastPackageRemoved">"å\85\81许åº\94ç\94¨ç¨\8båº\8f广æ\92­å·²å\88 é\99¤æ\9f\90åº\94ç\94¨ç¨\8båº\8få\8c\85ç\9a\84é\80\9aç\9f¥ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\80\9fæ­¤æ\9d¥终止任何其他正在运行的应用程序。"</string>
     <string name="permlab_broadcastSmsReceived">"发送短信收到的广播"</string>
-    <string name="permdesc_broadcastSmsReceived">"å\85\81许åº\94ç\94¨ç¨\8båº\8f广æ\92­å·²æ\94¶å\88°ç\9f­ä¿¡ç\9a\84é\80\9aç\9f¥ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\88©ç\94¨æ­¤æ\9d\83é\99\90伪造收到的短信。"</string>
+    <string name="permdesc_broadcastSmsReceived">"å\85\81许åº\94ç\94¨ç¨\8båº\8f广æ\92­å·²æ\94¶å\88°ç\9f­ä¿¡ç\9a\84é\80\9aç\9f¥ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\80\9fæ­¤伪造收到的短信。"</string>
     <string name="permlab_broadcastWapPush">"发送 WAP-PUSH 收到的广播"</string>
-    <string name="permdesc_broadcastWapPush">"å\85\81许åº\94ç\94¨ç¨\8båº\8fæ\92­æ\8a¥æ\94¶å\88° WAP PUSH æ¶\88æ\81¯ç\9a\84é\80\9aç\9f¥ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\88©ç\94¨æ­¤æ\9d\83é\99\90乱发彩信或暗中用恶意内容替换任意网页中的内容。"</string>
-    <string name="permlab_setProcessLimit">"限制运行进程的数量"</string>
-    <string name="permdesc_setProcessLimit">"允许应用程序控制运行的最大进程数。普通应用程序从不需要使用此权限。"</string>
+    <string name="permdesc_broadcastWapPush">"å\85\81许åº\94ç\94¨ç¨\8båº\8fæ\92­æ\8a¥æ\94¶å\88° WAP PUSH æ¶\88æ\81¯ç\9a\84é\80\9aç\9f¥ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\80\9fæ­¤乱发彩信或暗中用恶意内容替换任意网页中的内容。"</string>
+    <string name="permlab_setProcessLimit">"限制正在运行的进程数"</string>
+    <string name="permdesc_setProcessLimit">"允许应用程序控制运行的进程数上限。普通应用程序从不需要使用此权限。"</string>
     <string name="permlab_setAlwaysFinish">"关闭所有后台应用程序"</string>
     <string name="permdesc_setAlwaysFinish">"允许应用程序控制活动是否始终是一转至后台就完成。普通应用程序从不需要使用此权限。"</string>
     <string name="permlab_fotaUpdate">"自动安装系统更新"</string>
-    <string name="permdesc_fotaUpdate">"å\85\81许åº\94ç\94¨ç¨\8båº\8fæ\8e¥æ\94¶æ\9c\89å\85³æ\9cªå\86³ç³»ç»\9fæ\9b´æ\96°ç\9a\84é\80\9aç\9f¥å¹¶å®\89è£\85è¿\99äº\9bæ\9b´æ\96°ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\88©ç\94¨æ­¤æ\9d\83é\99\90通过未经授权的更新破坏系统,通常情况下,它们会干扰更新过程。"</string>
+    <string name="permdesc_fotaUpdate">"å\85\81许åº\94ç\94¨ç¨\8båº\8fæ\8e¥æ\94¶æ\9c\89å\85³æ\9cªå\86³ç³»ç»\9fæ\9b´æ\96°ç\9a\84é\80\9aç\9f¥å¹¶å®\89è£\85è¿\99äº\9bæ\9b´æ\96°ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\80\9fæ­¤通过未经授权的更新破坏系统,通常情况下,它们会干扰更新过程。"</string>
     <string name="permlab_batteryStats">"修改电池统计信息"</string>
     <string name="permdesc_batteryStats">"允许修改收集的电池统计信息。普通应用程序不能使用此权限。"</string>
     <string name="permlab_internalSystemWindow">"显示未授权的窗口"</string>
     <string name="permdesc_internalSystemWindow">"允许创建专用于内部系统用户界面的窗口。普通应用程序不能使用此权限。"</string>
     <string name="permlab_systemAlertWindow">"显示系统级警报"</string>
-    <string name="permdesc_systemAlertWindow">"允许应用程序显示系统警报窗口。恶意应用程序可能借此掌控整个手机屏幕。"</string>
+    <string name="permdesc_systemAlertWindow">"允许应用程序显示系统警报窗口。恶意应用程序可能借此掌控整个手机屏幕。"</string>
     <string name="permlab_setAnimationScale">"修改全局动画速度"</string>
     <string name="permdesc_setAnimationScale">"允许应用程序随时更改全局动画速度(加快或减慢动画)。"</string>
     <string name="permlab_manageAppTokens">"管理应用程序令牌"</string>
     <string name="permdesc_manageAppTokens">"允许应用程序创建和管理自己的令牌,从而绕开其常规的 Z 方向。普通应用程序从不需要使用此权限。"</string>
     <string name="permlab_injectEvents">"按键和控制按钮"</string>
-    <string name="permdesc_injectEvents">"å\85\81许åº\94ç\94¨ç¨\8båº\8få°\86å\85¶è\87ªå·±ç\9a\84è¾\93å\85¥æ´»å\8a¨ï¼\88æ\8c\89é\94®ç­\89ï¼\89æ\8f\90ä¾\9bç»\99å\85¶ä»\96åº\94ç\94¨ç¨\8båº\8fã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\88©ç\94¨æ­¤æ\9d\83é\99\90掌控手机。"</string>
+    <string name="permdesc_injectEvents">"å\85\81许åº\94ç\94¨ç¨\8båº\8få°\86å\85¶è\87ªå·±ç\9a\84è¾\93å\85¥æ´»å\8a¨ï¼\88æ\8c\89é\94®ç­\89ï¼\89æ\8f\90ä¾\9bç»\99å\85¶ä»\96åº\94ç\94¨ç¨\8båº\8fã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\80\9fæ­¤掌控手机。"</string>
     <string name="permlab_readInputState">"记录您键入的内容和执行的操作"</string>
     <string name="permdesc_readInputState">"即使在与其他应用程序交互时(例如输入密码),也允许应用程序查看您按的键。普通应用程序从不需要使用此权限。"</string>
-    <!-- no translation found for permlab_bindInputMethod (3360064620230515776) -->
-    <skip />
-    <!-- no translation found for permdesc_bindInputMethod (3734838321027317228) -->
-    <skip />
+    <string name="permlab_bindInputMethod">"绑定到输入方法"</string>
+    <string name="permdesc_bindInputMethod">"允许持有者绑定到输入方法的顶级接口。普通应用程序从不需要使用此权限。"</string>
     <string name="permlab_setOrientation">"更改屏幕方向"</string>
     <string name="permdesc_setOrientation">"允许应用程序随时更改屏幕的旋转方向。普通应用程序从不需要使用此权限。"</string>
     <string name="permlab_signalPersistentProcesses">"向应用程序发送 Linux 信号"</string>
     <string name="permlab_persistentActivity">"让应用程序始终运行"</string>
     <string name="permdesc_persistentActivity">"允许应用程序部分持续运行,这样系统便不能将其用于其他应用程序。"</string>
     <string name="permlab_deletePackages">"删除应用程序"</string>
-    <string name="permdesc_deletePackages">"允许应用程序删除 Android 包。恶意应用程序可能利用此权限删除重要的应用程序。"</string>
+    <string name="permdesc_deletePackages">"允许应用程序删除 Android 包。恶意应用程序可能会借此删除重要的应用程序。"</string>
     <string name="permlab_clearAppUserData">"删除其他应用程序的数据"</string>
     <string name="permdesc_clearAppUserData">"允许应用程序清除用户数据。"</string>
     <string name="permlab_deleteCacheFiles">"删除其他应用程序的缓存"</string>
     <string name="permlab_getPackageSize">"计算应用程序存储空间"</string>
     <string name="permdesc_getPackageSize">"允许应用程序检索其代码、数据和缓存大小"</string>
     <string name="permlab_installPackages">"直接安装应用程序"</string>
-    <string name="permdesc_installPackages">"允许应用程序安装新的或更新的 Android 程序包。恶意应用程序可能会利用此权限添加其具有任意权限的新应用程序。"</string>
+    <string name="permdesc_installPackages">"允许应用程序安装新的或更新的 Android 包。恶意应用程序可能会借此添加其具有任意权限的新应用程序。"</string>
     <string name="permlab_clearAppCache">"删除所有应用程序缓存数据"</string>
     <string name="permdesc_clearAppCache">"允许应用程序通过删除应用程序缓存目录中的文件释放手机存储空间。通常只限于访问系统进程。"</string>
     <string name="permlab_readLogs">"读取系统日志文件"</string>
     <string name="permlab_diagnostic">"读取/写入诊断拥有的资源"</string>
     <string name="permdesc_diagnostic">"允许应用程序读取和写入诊断组拥有的任何资源;例如 /dev 中的文件。这可能会潜在地影响系统稳定性和安全性。此权限只应用于由制造商或操作员执行的硬件特定的诊断。"</string>
     <string name="permlab_changeComponentState">"启用或禁用应用程序组件"</string>
-    <!-- no translation found for permdesc_changeComponentState (4569107043246700630) -->
-    <skip />
+    <string name="permdesc_changeComponentState">"允许应用程序更改是否启用其他应用程序的组件。恶意应用程序可能会借此来禁用重要的手机功能。使用此权限时务必谨慎,因为这可能导致应用程序组件进入不可用、不一致或不稳定的状态。"</string>
     <string name="permlab_setPreferredApplications">"设置首选的应用程序"</string>
-    <string name="permdesc_setPreferredApplications">"å\85\81许åº\94ç\94¨ç¨\8båº\8fä¿®æ\94¹é¦\96é\80\89ç\9a\84åº\94ç\94¨ç¨\8båº\8fã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\88©ç\94¨æ­¤æ\9d\83é\99\90æ\9a\97中æ\9b´æ\94¹è¿\90è¡\8cç\9a\84åº\94ç\94¨ç¨\8båº\8fï¼\8cä»\8eè\80\8céª\97è¿\87æ\82¨ç\9a\84ç\8e°æ\9c\89åº\94ç\94¨ç¨\8båº\8fæ\9d¥æ\94¶é\9b\86æ\82¨ç\9a\84ç§\81å¯\86数据。"</string>
+    <string name="permdesc_setPreferredApplications">"å\85\81许åº\94ç\94¨ç¨\8båº\8fä¿®æ\94¹é¦\96é\80\89ç\9a\84åº\94ç\94¨ç¨\8båº\8fã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\80\9fæ­¤æ\9a\97中æ\9b´æ\94¹è¿\90è¡\8cç\9a\84åº\94ç\94¨ç¨\8båº\8fï¼\8cä»\8eè\80\8céª\97è¿\87æ\82¨ç\9a\84ç\8e°æ\9c\89åº\94ç\94¨ç¨\8båº\8fæ\9d¥æ\94¶é\9b\86æ\82¨ç\9a\84ç§\81æ\9c\89数据。"</string>
     <string name="permlab_writeSettings">"修改全局系统设置"</string>
-    <string name="permdesc_writeSettings">"允许应用程序修改系统的设置数据。恶意应用程序可能借此破坏您的系统配置。"</string>
-    <!-- no translation found for permlab_writeSecureSettings (204676251876718288) -->
-    <skip />
-    <!-- no translation found for permdesc_writeSecureSettings (4116616249170428132) -->
-    <skip />
+    <string name="permdesc_writeSettings">"允许应用程序修改系统的设置数据。恶意应用程序可能会借此破坏您的系统配置。"</string>
+    <string name="permlab_writeSecureSettings">"修改安全系统设置"</string>
+    <string name="permdesc_writeSecureSettings">"允许应用程序修改系统安全设置数据。普通应用程序不能使用此权限。"</string>
     <string name="permlab_writeGservices">"修改 Google 服务地图"</string>
     <string name="permdesc_writeGservices">"允许应用程序修改 Google 服务地图。普通应用程序不能使用此权限。"</string>
     <string name="permlab_receiveBootCompleted">"引导时自动启动"</string>
     <string name="permdesc_receiveBootCompleted">"允许应用程序在系统完成引导后即自行启动。这样会加长启动手机所需的时间,而且如果应用程序一直运行,会降低手机的整体速度。"</string>
     <string name="permlab_broadcastSticky">"发送顽固广播"</string>
-    <string name="permdesc_broadcastSticky">"允许应用程序发送顽固广播,这些广播在结束后仍会保留。恶意应用程序可能会使手机使用太多内存,从而降低其速度和稳定性。"</string>
+    <string name="permdesc_broadcastSticky">"允许应用程序发送顽固广播,这些广播在结束后仍会保留。恶意应用程序可能会借此使手机使用太多内存,从而降低其速度和稳定性。"</string>
     <string name="permlab_readContacts">"读取联系数据"</string>
-    <string name="permdesc_readContacts">"允许应用程序读取您手机中存储的所有联系(地址)数据。恶意应用程序可能利用此权限将您的数据发送给其他人。"</string>
+    <string name="permdesc_readContacts">"允许应用程序读取您手机中存储的所有联系(地址)数据。恶意应用程序可能会借此将您的数据发送给其他人。"</string>
     <string name="permlab_writeContacts">"写入联系数据"</string>
-    <string name="permdesc_writeContacts">"å\85\81许åº\94ç\94¨ç¨\8båº\8fä¿®æ\94¹æ\82¨æ\89\8bæ\9cºä¸­å­\98å\82¨ç\9a\84è\81\94ç³»ï¼\88å\9c°å\9d\80ï¼\89æ\95°æ\8d®ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\88©ç\94¨æ­¤æ\9d\83é\99\90清除或修改您的联系数据。"</string>
+    <string name="permdesc_writeContacts">"å\85\81许åº\94ç\94¨ç¨\8båº\8fä¿®æ\94¹æ\82¨æ\89\8bæ\9cºä¸­å­\98å\82¨ç\9a\84è\81\94ç³»ï¼\88å\9c°å\9d\80ï¼\89æ\95°æ\8d®ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\80\9fæ­¤清除或修改您的联系数据。"</string>
     <string name="permlab_writeOwnerData">"写入所有者数据"</string>
-    <string name="permdesc_writeOwnerData">"å\85\81许åº\94ç\94¨ç¨\8båº\8fä¿®æ\94¹æ\82¨æ\89\8bæ\9cºä¸­å­\98å\82¨ç\9a\84æ\89\8bæ\9cºæ\89\80æ\9c\89è\80\85æ\95°æ\8d®ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\88©ç\94¨æ­¤æ\9d\83é\99\90清除或修改所有者数据。"</string>
+    <string name="permdesc_writeOwnerData">"å\85\81许åº\94ç\94¨ç¨\8båº\8fä¿®æ\94¹æ\82¨æ\89\8bæ\9cºä¸­å­\98å\82¨ç\9a\84æ\89\8bæ\9cºæ\89\80æ\9c\89è\80\85æ\95°æ\8d®ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\80\9fæ­¤清除或修改所有者数据。"</string>
     <string name="permlab_readOwnerData">"读取所有者数据"</string>
-    <string name="permdesc_readOwnerData">"å\85\81许åº\94ç\94¨ç¨\8båº\8f读å\8f\96æ\82¨æ\89\8bæ\9cºä¸­å­\98å\82¨ç\9a\84æ\89\8bæ\9cºæ\89\80æ\9c\89è\80\85æ\95°æ\8d®ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\88©ç\94¨æ­¤æ\9d\83é\99\90读取手机所有者数据。"</string>
+    <string name="permdesc_readOwnerData">"å\85\81许åº\94ç\94¨ç¨\8båº\8f读å\8f\96æ\82¨æ\89\8bæ\9cºä¸­å­\98å\82¨ç\9a\84æ\89\8bæ\9cºæ\89\80æ\9c\89è\80\85æ\95°æ\8d®ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\80\9fæ­¤读取手机所有者数据。"</string>
     <string name="permlab_readCalendar">"读取日历数据"</string>
-    <string name="permdesc_readCalendar">"允许应用程序读取您手机中存储的所有日历活动。恶意应用程序可能利用此权限将您的日历活动发送给其他人。"</string>
+    <string name="permdesc_readCalendar">"允许应用程序读取您手机中存储的所有日历活动。恶意应用程序可能会借此将您的日历活动发送给其他人。"</string>
     <string name="permlab_writeCalendar">"写入日历数据"</string>
-    <string name="permdesc_writeCalendar">"å\85\81许åº\94ç\94¨ç¨\8båº\8fä¿®æ\94¹æ\82¨æ\89\8bæ\9cºä¸­å­\98å\82¨ç\9a\84æ\97¥å\8e\86æ´»å\8a¨ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\88©ç\94¨æ­¤æ\9d\83é\99\90清除或修改您的日历数据。"</string>
+    <string name="permdesc_writeCalendar">"å\85\81许åº\94ç\94¨ç¨\8båº\8fä¿®æ\94¹æ\82¨æ\89\8bæ\9cºä¸­å­\98å\82¨ç\9a\84æ\97¥å\8e\86æ´»å\8a¨ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\80\9fæ­¤清除或修改您的日历数据。"</string>
     <string name="permlab_accessMockLocation">"用于测试的模仿位置源"</string>
-    <string name="permdesc_accessMockLocation">"å\88\9b建ç\94¨äº\8eæµ\8bè¯\95ç\9a\84模仿ä½\8dç½®æº\90ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\88©ç\94¨æ­¤æ\9d\83é\99\90替代真正的位置源(例如 GPS 或网络提供商)返回的位置和/或状态。"</string>
+    <string name="permdesc_accessMockLocation">"å\88\9b建ç\94¨äº\8eæµ\8bè¯\95ç\9a\84模仿ä½\8dç½®æº\90ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\80\9fæ­¤替代真正的位置源(例如 GPS 或网络提供商)返回的位置和/或状态。"</string>
     <string name="permlab_accessLocationExtraCommands">"访问额外的位置提供程序命令"</string>
-    <string name="permdesc_accessLocationExtraCommands">"访é\97®é¢\9då¤\96ç\9a\84ä½\8dç½®æ\8f\90ä¾\9bç¨\8båº\8få\91½ä»¤ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\88©ç\94¨æ­¤æ\9d\83é\99\90干扰 GPS 或其他位置源的操作。"</string>
+    <string name="permdesc_accessLocationExtraCommands">"访é\97®é¢\9då¤\96ç\9a\84ä½\8dç½®æ\8f\90ä¾\9bç¨\8båº\8få\91½ä»¤ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\80\9fæ­¤干扰 GPS 或其他位置源的操作。"</string>
     <string name="permlab_accessFineLocation">"精准 (GPS) 位置"</string>
-    <string name="permdesc_accessFineLocation">"访é\97®ç²¾å\87\86ç\9a\84ä½\8dç½®æº\90ï¼\8cä¾\8bå¦\82æ\89\8bæ\9cºä¸\8aç\9a\84å\85¨ç\90\83å®\9aä½\8dç³»ç»\9fï¼\88å¦\82æ\9e\9cæ\9c\89ï¼\89ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\88©ç\94¨æ­¤æ\9d\83é\99\90确定您所处的位置,并可能消耗额外的电池电量。"</string>
+    <string name="permdesc_accessFineLocation">"访é\97®ç²¾å\87\86ç\9a\84ä½\8dç½®æº\90ï¼\8cä¾\8bå¦\82æ\89\8bæ\9cºä¸\8aç\9a\84å\85¨ç\90\83å®\9aä½\8dç³»ç»\9fï¼\88å¦\82æ\9e\9cæ\9c\89ï¼\89ã\80\82æ\81¶æ\84\8fåº\94ç\94¨ç¨\8båº\8få\8f¯è\83½ä¼\9aå\80\9fæ­¤确定您所处的位置,并可能消耗额外的电池电量。"</string>
     <string name="permlab_accessCoarseLocation">"粗略(基于网络的)位置"</string>
-    <string name="permdesc_accessCoarseLocation">"访问粗略的位置源(例如蜂窝网络数据库)以确定手机的大体位置(如果适用)。恶意应用程序可能利用此权限来确定您所处的大体位置。"</string>
+    <string name="permdesc_accessCoarseLocation">"访问粗略的位置源(例如蜂窝网络数据库)以确定手机的大体位置(如果适用)。恶意应用程序可能会借此来确定您的大体位置。"</string>
     <string name="permlab_accessSurfaceFlinger">"访问 SurfaceFlinger"</string>
     <string name="permdesc_accessSurfaceFlinger">"允许应用程序使用 SurfaceFlinger 低级功能。"</string>
     <string name="permlab_readFrameBuffer">"读取帧缓冲区"</string>
     <string name="permlab_recordAudio">"录音"</string>
     <string name="permdesc_recordAudio">"允许应用程序访问录音路径。"</string>
     <string name="permlab_camera">"拍照"</string>
-    <string name="permdesc_camera">"允许应用程序通过相机拍照。此权限使应用程序可随时收集相机正在拍摄的图片。"</string>
+    <string name="permdesc_camera">"允许应用程序通过相机拍照。这样应用程序可随时收集相机正在拍摄的图片。"</string>
     <string name="permlab_brick">"永久禁用手机"</string>
     <string name="permdesc_brick">"允许应用程序永久禁用整个手机,这是很危险的。"</string>
     <string name="permlab_reboot">"强制手机重新引导"</string>
     <string name="permlab_hardware_test">"测试硬件"</string>
     <string name="permdesc_hardware_test">"允许应用程序控制各外围设备以进行硬件测试。"</string>
     <string name="permlab_callPhone">"直接呼叫电话号码"</string>
-    <string name="permdesc_callPhone">"允许应用程序在没有您干预的情况下呼叫电话号码。恶意应用程序可能在您的电话帐单上产生意外呼叫。请注意,此权限不允许应用程序呼叫紧急电话号码。"</string>
+    <string name="permdesc_callPhone">"允许应用程序在没有您干预的情况下呼叫电话号码。恶意应用程序可能会借此在您的电话帐单上产生意外呼叫。请注意,此权限不允许应用程序呼叫紧急电话号码。"</string>
     <string name="permlab_callPrivileged">"直接呼叫任何电话号码"</string>
-    <string name="permdesc_callPrivileged">"允许应用程序在没有您干预的情况下呼叫任何电话号码(包括紧急电话号码)。恶意应用程序可能对紧急服务拨打骚扰电话和非法电话。"</string>
+    <string name="permdesc_callPrivileged">"允许应用程序在没有您干预的情况下呼叫任何电话号码(包括紧急电话号码)。恶意应用程序可能会借此对紧急服务拨打骚扰电话和非法电话。"</string>
     <string name="permlab_locationUpdates">"控制位置更新通知"</string>
     <string name="permdesc_locationUpdates">"允许启用/禁用来自收音机的位置更新通知。普通应用程序不能使用此权限。"</string>
     <string name="permlab_checkinProperties">"访问检入属性"</string>
     <string name="permlab_modifyPhoneState">"修改手机状态"</string>
     <string name="permdesc_modifyPhoneState">"允许应用程序控制设备的手机功能。具有此权限的应用程序可能会切换网络,打开和关闭手机收音机以及类似操作,而不会通知您。"</string>
     <string name="permlab_readPhoneState">"读取手机状态"</string>
-    <string name="permdesc_readPhoneState">"允许应用程序访问设备的电话功能。具有这种权限的应用程序可确定此电话的电话号码、是否在进行通话以及通话对方的号码等。"</string>
+    <string name="permdesc_readPhoneState">"允许应用程序访问设备的电话功能。具有权限的应用程序可确定此电话的电话号码、是否在进行通话以及通话对方的号码等。"</string>
     <string name="permlab_wakeLock">"防止手机休眠"</string>
     <string name="permdesc_wakeLock">"允许应用程序防止手机进入休眠状态。"</string>
     <string name="permlab_devicePower">"开机或关机"</string>
     <string name="permdesc_factoryTest">"作为一项低级制造商测试来运行,从而允许对手机硬件进行完全访问。此权限仅当手机在制造商测试模式下运行时才可用。"</string>
     <string name="permlab_setWallpaper">"设置壁纸"</string>
     <string name="permdesc_setWallpaper">"允许应用程序设置系统壁纸。"</string>
-    <string name="permlab_setWallpaperHints">"精确设置壁纸大小"</string>
-    <string name="permdesc_setWallpaperHints">"允许应用程序精确设置系统壁纸大小。"</string>
+    <string name="permlab_setWallpaperHints">"大体设置壁纸大小"</string>
+    <string name="permdesc_setWallpaperHints">"允许应用程序大体设置系统壁纸大小。"</string>
     <string name="permlab_masterClear">"将系统重设为出厂默认值"</string>
     <string name="permdesc_masterClear">"允许应用程序将系统完全重设为其出厂设置,即清除所有数据、配置和安装的应用程序。"</string>
     <string name="permlab_setTimeZone">"设置时区"</string>
     <string name="permlab_disableKeyguard">"禁用键锁"</string>
     <string name="permdesc_disableKeyguard">"允许应用程序禁用键锁和任何关联的密码安全措施。这种情况的一个恰当示例就是这样一个手机:当收到来电时禁用键锁,当通话结束后再重新启用键锁。"</string>
     <string name="permlab_readSyncSettings">"读取同步设置"</string>
-    <string name="permdesc_readSyncSettings">"允许应用程序读取同步设置,例如是否针对“联系人”启用同步。"</string>
+    <string name="permdesc_readSyncSettings">"允许应用程序读取同步设置,例如是否“联系人”启用同步。"</string>
     <string name="permlab_writeSyncSettings">"写入同步设置"</string>
     <string name="permdesc_writeSyncSettings">"允许应用程序修改同步设置,例如是否针对“联系人”启用同步。"</string>
     <string name="permlab_readSyncStats">"读取同步统计信息"</string>
     <string name="permdesc_subscribedFeedsRead">"允许应用程序获取有关当前同步的供稿的详情。"</string>
     <string name="permlab_subscribedFeedsWrite">"写入订阅的供稿"</string>
     <string name="permdesc_subscribedFeedsWrite">"允许应用程序修改您当前同步的供稿。这样恶意程序可以更改您同步的供稿。"</string>
-    <!-- no translation found for phoneTypes:7 (9192514806975898961) -->
-    <!-- no translation found for emailAddressTypes:3 (2374913952870110618) -->
-    <!-- no translation found for postalAddressTypes:3 (4932682847595299369) -->
-    <!-- no translation found for imAddressTypes:3 (3145118944639869809) -->
-    <!-- no translation found for organizationTypes:2 (3455047468583965104) -->
+  <string-array name="phoneTypes">
+    <item>"家庭"</item>
+    <item>"手机"</item>
+    <item>"工作"</item>
+    <item>"工作传真"</item>
+    <item>"家庭传真"</item>
+    <item>"寻呼机"</item>
+    <item>"其他"</item>
+    <item>"自定义"</item>
+  </string-array>
+  <string-array name="emailAddressTypes">
+    <item>"家庭"</item>
+    <item>"工作"</item>
+    <item>"其他"</item>
+    <item>"自定义"</item>
+  </string-array>
+  <string-array name="postalAddressTypes">
+    <item>"家庭"</item>
+    <item>"工作"</item>
+    <item>"其他"</item>
+    <item>"自定义"</item>
+  </string-array>
+  <string-array name="imAddressTypes">
+    <item>"家庭"</item>
+    <item>"工作"</item>
+    <item>"其他"</item>
+    <item>"自定义"</item>
+  </string-array>
+  <string-array name="organizationTypes">
+    <item>"工作"</item>
+    <item>"其他"</item>
+    <item>"自定义"</item>
+  </string-array>
   <string-array name="imProtocols">
     <item>"AIM"</item>
     <item>"Windows Live"</item>
     <item>"ICQ"</item>
     <item>"Jabber"</item>
   </string-array>
-    <!-- no translation found for keyguard_password_enter_pin_code (3731488827218876115) -->
-    <skip />
+    <string name="keyguard_password_enter_pin_code">"输入 PIN 码"</string>
     <string name="keyguard_password_wrong_pin_code">"PIN 码不正确!"</string>
     <string name="keyguard_label_text">"要解锁,请按“菜单”,然后按 0。"</string>
     <string name="emergency_call_dialog_number_for_display">"紧急电话号码"</string>
     <string name="lockscreen_carrier_default">"(无服务)"</string>
-    <!-- no translation found for lockscreen_screen_locked (7288443074806832904) -->
-    <skip />
+    <string name="lockscreen_screen_locked">"屏幕已锁定。"</string>
     <string name="lockscreen_instructions_when_pattern_enabled">"按“菜单”解锁或拨打紧急电话。"</string>
     <string name="lockscreen_instructions_when_pattern_disabled">"按“菜单”解锁。"</string>
-    <!-- no translation found for lockscreen_pattern_instructions (7478703254964810302) -->
-    <skip />
+    <string name="lockscreen_pattern_instructions">"绘制解锁图案"</string>
     <string name="lockscreen_emergency_call">"紧急电话"</string>
     <string name="lockscreen_pattern_correct">"正确!"</string>
-    <!-- no translation found for lockscreen_pattern_wrong (4817583279053112312) -->
-    <skip />
+    <string name="lockscreen_pattern_wrong">"很抱歉,请重试"</string>
     <string name="lockscreen_plugged_in">"正在充电 (<xliff:g id="NUMBER">%d%%</xliff:g>)"</string>
     <string name="lockscreen_low_battery">"连接您的充电器。"</string>
     <string name="lockscreen_missing_sim_message_short">"没有 SIM 卡。"</string>
     <string name="lockscreen_missing_sim_message">"手机中无 SIM 卡。"</string>
     <string name="lockscreen_missing_sim_instructions">"请插入 SIM 卡。"</string>
     <string name="lockscreen_network_locked_message">"网络已锁定"</string>
-    <string name="lockscreen_sim_puk_locked_message">"SIM 卡已被 PUK 锁定。"</string>
+    <string name="lockscreen_sim_puk_locked_message">"已对 SIM 卡进行 PUK 码锁定。"</string>
     <string name="lockscreen_sim_puk_locked_instructions">"请联系客服部门。"</string>
     <string name="lockscreen_sim_locked_message">"SIM 卡已被锁定。"</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message">"正在解锁 SIM 卡..."</string>
     <string name="lockscreen_too_many_failed_attempts_countdown">"<xliff:g id="NUMBER">%d</xliff:g> 秒后重试。"</string>
     <string name="lockscreen_forgot_pattern_button_text">"忘记了图案?"</string>
     <string name="lockscreen_glogin_too_many_attempts">"图案尝试次数太多!"</string>
-    <!-- no translation found for lockscreen_glogin_instructions (7400120254204758548) -->
-    <skip />
+    <string name="lockscreen_glogin_instructions">"要解锁,"\n"请用您的 Google 帐户登录"</string>
     <string name="lockscreen_glogin_username_hint">"用户名(电子邮件)"</string>
     <string name="lockscreen_glogin_password_hint">"密码"</string>
     <string name="lockscreen_glogin_submit_button">"登录"</string>
     <string name="lockscreen_glogin_invalid_input">"用户名或密码无效。"</string>
     <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
-    <!-- no translation found for hour_minute_ampm (7044207493989843593) -->
-    <skip />
-    <!-- no translation found for hour_minute_cap_ampm (5778825208801303756) -->
-    <skip />
+    <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+    <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <!-- no translation found for hour_ampm (7618670480400517084) -->
     <skip />
     <!-- no translation found for hour_cap_ampm (5117798389811605468) -->
     <string name="battery_status_charging">"正在充电..."</string>
     <string name="battery_low_title">"请连接充电器"</string>
     <string name="battery_low_subtitle">"电量在减少:"</string>
-    <string name="battery_low_percent_format">"剩余电量不足 <xliff:g id="NUMBER">%d%%</xliff:g>"</string>
+    <string name="battery_low_percent_format">"剩余电量不足 <xliff:g id="NUMBER">%d%%</xliff:g>"</string>
     <string name="factorytest_failed">"出厂测试失败"</string>
     <string name="factorytest_not_system">"只有在 /system/app 中安装的包支持 FACTORY_TEST 操作。"</string>
     <string name="factorytest_no_action">"未发现支持 FACTORY_TEST 操作的包。"</string>
     <string name="VideoView_error_title">"无法播放视频"</string>
     <string name="VideoView_error_text_unknown">"很抱歉,此视频不能播放。"</string>
     <string name="VideoView_error_button">"确定"</string>
-    <string name="am">"AM"</string>
-    <string name="pm">"PM"</string>
+    <string name="am">"上午"</string>
+    <string name="pm">"下午"</string>
     <string name="numeric_date">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%m</xliff:g> 月 <xliff:g id="DAY">%d</xliff:g> 日"</string>
     <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g><xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="TIME1">%3$s</xliff:g> 至 <xliff:g id="DATE2">%5$s</xliff:g><xliff:g id="WEEKDAY2">%4$s</xliff:g> <xliff:g id="TIME2">%6$s</xliff:g>"</string>
-    <string name="wday1_date1_wday2_date2">"<xliff:g id="DATE1">%2$s</xliff:g><xliff:g id="WEEKDAY1">%1$s</xliff:g>至<xliff:g id="DATE2">%5$s</xliff:g><xliff:g id="WEEKDAY2">%4$s</xliff:g>"</string>
+    <string name="wday1_date1_wday2_date2">"<xliff:g id="DATE1">%2$s</xliff:g><xliff:g id="WEEKDAY1">%1$s</xliff:g>至 <xliff:g id="DATE2">%5$s</xliff:g><xliff:g id="WEEKDAY2">%4$s</xliff:g>"</string>
     <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g> <xliff:g id="TIME1">%3$s</xliff:g> 至 <xliff:g id="DATE2">%5$s</xliff:g> <xliff:g id="TIME2">%6$s</xliff:g>"</string>
     <string name="date1_date2">"<xliff:g id="DATE1">%2$s</xliff:g>至 <xliff:g id="DATE2">%5$s</xliff:g>"</string>
     <string name="time1_time2">"<xliff:g id="TIME1">%1$s</xliff:g> 至 <xliff:g id="TIME2">%2$s</xliff:g>"</string>
     <string name="full_date_month_first">"<xliff:g id="YEAR">yyyy</xliff:g> 年 <xliff:g id="MONTH">MMMM</xliff:g> 月 <xliff:g id="DAY">dd</xliff:g> 日"</string>
     <string name="full_date_day_first">"<xliff:g id="YEAR">yyyy</xliff:g> 年 <xliff:g id="MONTH">MMMM</xliff:g> 月 <xliff:g id="DAY">dd</xliff:g> 日"</string>
     <string name="medium_date_month_first">"<xliff:g id="YEAR">yyyy</xliff:g> 年 <xliff:g id="MONTH">MMM</xliff:g> 月 <xliff:g id="DAY">dd</xliff:g> 日"</string>
-    <string name="medium_date_day_first">"<xliff:g id="YEAR">yyyy</xliff:g> 年 <xliff:g id="MONTH">MMM</xliff:g> 月 <xliff:g id="DAY">dd</xliff:g> 日"</string>
+    <string name="medium_date_day_first">"<xliff:g id="YEAR">yyyy</xliff:g> 年 <xliff:g id="DAY">dd</xliff:g> 月 <xliff:g id="MONTH">MMM</xliff:g> 日"</string>
     <string name="twelve_hour_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">a</xliff:g>"</string>
     <string name="twenty_four_hour_time_format">"<xliff:g id="HOUR">H</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g>"</string>
     <string name="noon">"中午"</string>
     <string name="same_year_md1_time1_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1">%3$s</xliff:g> 日 <xliff:g id="TIME1">%5$s</xliff:g> 至 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2">%8$s</xliff:g> 日 <xliff:g id="TIME2">%10$s</xliff:g>"</string>
     <string name="same_year_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1_0">%3$s</xliff:g> 日<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="TIME1">%5$s</xliff:g> 至 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2_1">%8$s</xliff:g> 日<xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="TIME2">%10$s</xliff:g>"</string>
     <string name="same_year_mdy1_time1_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1">%3$s</xliff:g> 日 <xliff:g id="TIME1">%5$s</xliff:g> 至 <xliff:g id="YEAR2">%9$s</xliff:g> 年 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2">%8$s</xliff:g> 日 <xliff:g id="TIME2">%10$s</xliff:g>"</string>
-    <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1_0">%3$s</xliff:g> 日<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="TIME1">%5$s</xliff:g> 至 <xliff:g id="YEAR2">%9$s</xliff:g> 年 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2_1">%8$s</xliff:g> 日<xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1_0">%3$s</xliff:g> 日<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="TIME1">%5$s</xliff:g> 至 – <xliff:g id="YEAR2">%9$s</xliff:g> 年 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2_1">%8$s</xliff:g> 日<xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="TIME2">%10$s</xliff:g>"</string>
     <string name="numeric_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1">%3$s</xliff:g> 日至 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2">%8$s</xliff:g> 日"</string>
     <string name="numeric_wday1_md1_wday2_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1_0">%3$s</xliff:g> 日<xliff:g id="WEEKDAY1">%1$s</xliff:g>至 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2_1">%8$s</xliff:g> 日<xliff:g id="WEEKDAY2">%6$s</xliff:g>"</string>
     <string name="numeric_mdy1_mdy2">"<xliff:g id="YEAR1">%4$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1">%3$s</xliff:g> 日至 <xliff:g id="YEAR2">%9$s</xliff:g> 年 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2">%8$s</xliff:g> 日"</string>
     <string name="numeric_md1_time1_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1">%3$s</xliff:g> 日 <xliff:g id="TIME1">%5$s</xliff:g> 至 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2">%8$s</xliff:g> 日 <xliff:g id="TIME2">%10$s</xliff:g>"</string>
     <string name="numeric_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1_0">%3$s</xliff:g> 日<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="TIME1">%5$s</xliff:g> 至 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2_1">%8$s</xliff:g> 日<xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="TIME2">%10$s</xliff:g>"</string>
     <string name="numeric_mdy1_time1_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1">%3$s</xliff:g> 日 <xliff:g id="TIME1">%5$s</xliff:g> 至 <xliff:g id="YEAR2">%9$s</xliff:g> 年 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2">%8$s</xliff:g> 日 <xliff:g id="TIME2">%10$s</xliff:g>"</string>
-    <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1_0">%3$s</xliff:g> 日<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="TIME1">%5$s</xliff:g> 至 <xliff:g id="YEAR2">%9$s</xliff:g> 年 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2_1">%8$s</xliff:g> 日<xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1_0">%3$s</xliff:g> 日<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="TIME1">%5$s</xliff:g> 至 <xliff:g id="YEAR2">%9$s</xliff:g> 年 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2_1">%8$s</xliff:g> 日<xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="TIME2">%10$s</xliff:g>"</string>
     <string name="same_month_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1">%3$s</xliff:g> 日至 <xliff:g id="DAY2">%8$s</xliff:g> 日"</string>
     <string name="same_month_wday1_md1_wday2_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1_0">%3$s</xliff:g> 日<xliff:g id="WEEKDAY1">%1$s</xliff:g>至<xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2_1">%8$s</xliff:g> 日<xliff:g id="WEEKDAY2">%6$s</xliff:g>"</string>
     <string name="same_month_mdy1_mdy2">"<xliff:g id="YEAR2">%9$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1">%3$s</xliff:g> 日至 <xliff:g id="DAY2">%8$s</xliff:g> 日"</string>
     <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
     <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
     <string name="selectAll">"全选"</string>
-    <!-- no translation found for selectText (3889149123626888637) -->
-    <skip />
-    <!-- no translation found for stopSelectingText (4157931463872320996) -->
-    <skip />
+    <string name="selectText">"选择文本"</string>
+    <string name="stopSelectingText">"停止选择文本"</string>
     <string name="cut">"剪切"</string>
     <string name="cutAll">"全部剪切"</string>
     <string name="copy">"复制"</string>
     <string name="copyAll">"全部复制"</string>
     <string name="paste">"粘贴"</string>
     <string name="copyUrl">"复制网址"</string>
-    <!-- no translation found for inputMethod (7673923508389094672) -->
-    <skip />
-    <!-- no translation found for editTextMenuTitle (1672989176958581452) -->
-    <skip />
+    <string name="inputMethod">"输入方法"</string>
+    <string name="editTextMenuTitle">"编辑文本"</string>
     <string name="low_internal_storage_view_title">"存储空间不足"</string>
     <string name="low_internal_storage_view_text">"手机存储空间在减少。"</string>
     <string name="ok">"正常"</string>
     <string name="wait">"等待"</string>
     <string name="debug">"调试"</string>
     <string name="sendText">"选择一个文本操作"</string>
-    <string name="volume_ringtone">"铃声音量"</string>
-    <!-- no translation found for volume_music (5421651157138628171) -->
-    <skip />
-    <!-- no translation found for volume_music_hint_playing_through_bluetooth (9165984379394601533) -->
-    <skip />
+    <string name="volume_ringtone">"响铃音量"</string>
+    <string name="volume_music">"媒体音量"</string>
+    <string name="volume_music_hint_playing_through_bluetooth">"正通过蓝牙播放"</string>
     <string name="volume_call">"来电音量"</string>
-    <!-- no translation found for volume_call_hint_playing_through_bluetooth (7750873841563910404) -->
-    <skip />
+    <string name="volume_call_hint_playing_through_bluetooth">"正通过蓝牙播放"</string>
     <string name="volume_alarm">"警告音量"</string>
-    <!-- no translation found for volume_notification (2422265656744276715) -->
-    <skip />
+    <string name="volume_notification">"通知音量"</string>
     <string name="volume_unknown">"音量"</string>
     <string name="ringtone_default">"默认的手机铃声"</string>
-    <string name="ringtone_default_with_actual">"删除手机铃声(<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+    <string name="ringtone_default_with_actual">"默认的手机铃声(<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
     <string name="ringtone_silent">"静音"</string>
-    <!-- no translation found for ringtone_picker_title (3515143939175119094) -->
-    <skip />
-    <string name="ringtone_unknown">"未知的手机铃声"</string>
+    <string name="ringtone_picker_title">"铃声"</string>
+    <string name="ringtone_unknown">"未知手机铃声"</string>
   <plurals name="wifi_available">
     <item quantity="one">"有可用的 Wi-Fi 网络"</item>
     <item quantity="other">"有可用的 Wi-Fi 网络"</item>
     <item quantity="one">"打开可用的 Wi-Fi 网络"</item>
     <item quantity="other">"打开可用的 Wi-Fi 网络"</item>
   </plurals>
-    <!-- no translation found for select_character (3365550120617701745) -->
-    <skip />
-    <string name="sms_control_default_app_name">"未知的应用程序"</string>
+    <string name="select_character">"插入字符"</string>
+    <string name="sms_control_default_app_name">"未知应用程序"</string>
     <string name="sms_control_title">"正在发送短信"</string>
     <string name="sms_control_message">"正在发送大量短信。选择“确定”继续,或选择“取消”停止发送。"</string>
     <string name="sms_control_yes">"确定"</string>
     <string name="usb_storage_error_message">"使用 SD 卡进行 USB 存储时出现问题。"</string>
     <string name="usb_storage_notification_title">"USB 已连接"</string>
     <string name="usb_storage_notification_message">"选择以将文件复制到计算机或从计算机复制文件。"</string>
-    <!-- no translation found for select_input_method (2086499663193509436) -->
-    <skip />
-    <!-- no translation found for fast_scroll_alphabet (5433275485499039199) -->
-    <skip />
-    <!-- no translation found for fast_scroll_numeric_alphabet (4030170524595123610) -->
-    <skip />
-    <!-- no translation found for candidates_style (5248064431114273041) -->
-    <skip />
+    <string name="select_input_method">"选择输入方法"</string>
+    <string name="fast_scroll_alphabet">"ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="fast_scroll_numeric_alphabet">"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="candidates_style"><font fgcolor="#ff000000" bgcolor="#ff8080ff"><u>"候选人"</u>"u&gt;"</font></string>
 </resources>
diff --git a/core/res/res/values-zh-rTW/arrays.xml b/core/res/res/values-zh-rTW/arrays.xml
new file mode 100644 (file)
index 0000000..f9c904b
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
new file mode 100644 (file)
index 0000000..b95ca98
--- /dev/null
@@ -0,0 +1,724 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="byteShort">"位元組"</string>
+    <string name="kilobyteShort">"KB"</string>
+    <string name="megabyteShort">"MB"</string>
+    <string name="gigabyteShort">"GB"</string>
+    <string name="terabyteShort">"TB"</string>
+    <string name="petabyteShort">"PB"</string>
+    <string name="untitled">"(未命名)"</string>
+    <string name="ellipsis">"..."</string>
+    <string name="emptyPhoneNumber">"(沒有電話號碼)"</string>
+    <string name="unknownName">"(未知的)"</string>
+    <string name="defaultVoiceMailAlphaTag">"語音信箱"</string>
+    <string name="defaultMsisdnAlphaTag">"MSISDN1"</string>
+    <string name="mmiError">"連線發生問題或錯誤的 MMI 碼。"</string>
+    <string name="serviceEnabled">"服務已啟動。"</string>
+    <string name="serviceEnabledFor">"已啟動服務:"</string>
+    <string name="serviceDisabled">"服務已停用。"</string>
+    <string name="serviceRegistered">"註冊成功。"</string>
+    <string name="serviceErased">"清除成功。"</string>
+    <string name="passwordIncorrect">"密碼錯誤。"</string>
+    <string name="mmiComplete">"MMI 完成。"</string>
+    <string name="badPin">"您輸入的舊 PIN 不正確。"</string>
+    <string name="badPuk">"您輸入的 PUK 不正確。"</string>
+    <string name="mismatchPin">"您輸入的 PIN 不符合。"</string>
+    <string name="invalidPin">"輸入 4~8 個數字的 PIN。"</string>
+    <string name="needPuk">"SIM 卡的 PUK 已鎖定。請輸入 PUK 碼解除鎖定。"</string>
+    <string name="needPuk2">"請輸入 PUK2 以解鎖 SIM 卡。"</string>
+    <string name="ClipMmi">"來電號碼"</string>
+    <string name="ClirMmi">"發話號碼"</string>
+    <string name="CfMmi">"通話指定轉接"</string>
+    <string name="CwMmi">"話中插接"</string>
+    <string name="BaMmi">"通話限制"</string>
+    <string name="PwdMmi">"變更密碼"</string>
+    <string name="PinMmi">"PIN 已變更"</string>
+    <string name="CLIRDefaultOnNextCallOn">"預設不顯示本機號碼,下一通也不顯示。"</string>
+    <string name="CLIRDefaultOnNextCallOff">"預設不顯示本機號碼,但下一通電話顯示。"</string>
+    <string name="CLIRDefaultOffNextCallOn">"預設顯示本機號碼,但下一通不顯示。"</string>
+    <string name="CLIRDefaultOffNextCallOff">"預設顯示本機號碼,下一通也顯示。"</string>
+    <string name="serviceNotProvisioned">"服務未設定完成。"</string>
+    <string name="CLIRPermanent">"本機號碼設定無法變更。"</string>
+    <string name="serviceClassVoice">"語音"</string>
+    <string name="serviceClassData">"資料"</string>
+    <string name="serviceClassFAX">"傳真"</string>
+    <string name="serviceClassSMS">"SMS"</string>
+    <string name="serviceClassDataAsync">"非同步"</string>
+    <string name="serviceClassDataSync">"同步處理"</string>
+    <string name="serviceClassPacket">"封包"</string>
+    <string name="serviceClassPAD">"按鍵"</string>
+    <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:未轉接"</string>
+    <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+    <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:<xliff:g id="TIME_DELAY">{2}</xliff:g> 秒後 <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+    <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:未轉接"</string>
+    <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:未轉接"</string>
+    <string name="httpErrorOk">"確定"</string>
+    <string name="httpError">"網頁內容錯誤。"</string>
+    <string name="httpErrorLookup">"找不到網址。"</string>
+    <string name="httpErrorUnsupportedAuthScheme">"不支援此網站驗證機制。"</string>
+    <string name="httpErrorAuth">"驗證失敗。"</string>
+    <string name="httpErrorProxyAuth">"透過 proxy 伺服器驗證失敗。"</string>
+    <string name="httpErrorConnect">"連線到伺服器失敗。"</string>
+    <string name="httpErrorIO">"無法與伺服器溝通,請稍後再試一次 。"</string>
+    <string name="httpErrorTimeout">"連線到伺服器逾時。"</string>
+    <string name="httpErrorRedirectLoop">"此網頁包含太多伺服器轉址。"</string>
+    <string name="httpErrorUnsupportedScheme">"不支援此通訊協定。"</string>
+    <string name="httpErrorFailedSslHandshake">"無法建立安全連線。"</string>
+    <string name="httpErrorBadUrl">"由於網址錯誤,無法開啟此網頁。"</string>
+    <string name="httpErrorFile">"無法存取此檔案。"</string>
+    <string name="httpErrorFileNotFound">"找不到要求的檔案。"</string>
+    <string name="httpErrorTooManyRequests">"太多執行要求。請稍後再試一次。"</string>
+    <string name="contentServiceSync">"同步處理"</string>
+    <string name="contentServiceSyncNotificationTitle">"同步處理"</string>
+    <string name="contentServiceTooManyDeletesNotificationDesc">"太多 <xliff:g id="CONTENT_TYPE">%s</xliff:g> 要刪除。"</string>
+    <string name="low_memory">"手機儲存空間已滿!請刪除一些檔案增加空間。"</string>
+    <string name="me">"我"</string>
+    <string name="power_dialog">"電話選項"</string>
+    <string name="silent_mode">"靜音模式"</string>
+    <string name="turn_on_radio">"開啟無線網路"</string>
+    <string name="turn_off_radio">"關閉無線網路"</string>
+    <string name="screen_lock">"螢幕鎖定"</string>
+    <string name="power_off">"關機"</string>
+    <string name="shutdown_progress">"關機中..."</string>
+    <string name="shutdown_confirm">"手機即將關機。"</string>
+    <string name="no_recent_tasks">"最近沒有存取應用程式。"</string>
+    <string name="global_actions">"電話選項"</string>
+    <string name="global_action_lock">"螢幕鎖定"</string>
+    <string name="global_action_power_off">"關機"</string>
+    <string name="global_action_toggle_silent_mode">"靜音模式"</string>
+    <string name="global_action_silent_mode_on_status">"音效已關閉"</string>
+    <string name="global_action_silent_mode_off_status">"聲音已開啟"</string>
+    <string name="safeMode">"安全模式"</string>
+    <string name="permgrouplab_costMoney">"需要額外費用的服務。"</string>
+    <string name="permgroupdesc_costMoney">"若您允許應用程式執行此操作,可能需要支付一些費用。"</string>
+    <string name="permgrouplab_messages">"您的簡訊"</string>
+    <string name="permgroupdesc_messages">"讀取編輯 SMS、電子郵件與其他簡訊。"</string>
+    <string name="permgrouplab_personalInfo">"您的個人資訊"</string>
+    <string name="permgroupdesc_personalInfo">"直接存取手機上的通訊錄與行事曆。"</string>
+    <string name="permgrouplab_location">"您的位置"</string>
+    <string name="permgroupdesc_location">"監視實際位置"</string>
+    <string name="permgrouplab_network">"網路通訊"</string>
+    <string name="permgroupdesc_network">"允許應用程式存取多項網路功能。"</string>
+    <string name="permgrouplab_accounts">"您的 Google 帳戶"</string>
+    <string name="permgroupdesc_accounts">"存取可用 Google 帳戶。"</string>
+    <string name="permgrouplab_hardwareControls">"硬體控制"</string>
+    <string name="permgroupdesc_hardwareControls">"在免持設備上直接存取硬體。"</string>
+    <string name="permgrouplab_phoneCalls">"撥打電話"</string>
+    <string name="permgroupdesc_phoneCalls">"監控、記錄與進行通話。"</string>
+    <string name="permgrouplab_systemTools">"系統工具"</string>
+    <string name="permgroupdesc_systemTools">"系統低階存取與控制。"</string>
+    <string name="permgrouplab_developmentTools">"開發工具"</string>
+    <string name="permgroupdesc_developmentTools">"只有開發者需要此功能。"</string>
+    <string name="permlab_statusBar">"停用或變更狀態列"</string>
+    <string name="permdesc_statusBar">"允許應用程式停用狀態列或新增、移除系統圖示。"</string>
+    <string name="permlab_expandStatusBar">"展開/收攏狀態列"</string>
+    <string name="permdesc_expandStatusBar">"允許應用程式展開或收攏狀態列。"</string>
+    <string name="permlab_processOutgoingCalls">"攔截發話"</string>
+    <string name="permdesc_processOutgoingCalls">"允許應用程式撥打電話、變更撥號號碼。惡意程式可能會以此監控,轉向或阻擋發話。"</string>
+    <string name="permlab_receiveSms">"接收 SMS"</string>
+    <string name="permdesc_receiveSms">"允許應用程式接收、處理 SMS 簡訊。惡意程式可使用此功能監控簡訊或在您讀取前擅自刪除。"</string>
+    <string name="permlab_receiveMms">"接收 MMS"</string>
+    <string name="permdesc_receiveMms">"允許應用程式接收、處理 MMS 簡訊。惡意程式可使用此功能監控簡訊或在您讀取前擅自刪除。"</string>
+    <string name="permlab_sendSms">"傳送 SMS 簡訊"</string>
+    <string name="permdesc_sendSms">"允許應用程式傳送 SMS 簡訊。惡意程式可能會擅自傳送簡訊,增加您的花費。"</string>
+    <string name="permlab_readSms">"讀取 SMS 或 MMS"</string>
+    <string name="permdesc_readSms">"允許應用程式讀取手機或 SIM 卡上的 SMS 簡訊。惡意程式可能會利用此功能讀取您的機密簡訊。"</string>
+    <string name="permlab_writeSms">"編輯 SMS 或 MMS"</string>
+    <string name="permdesc_writeSms">"允許應用程式編輯 SMS 簡訊,存入手機或 SIM 卡。惡意程式可能會刪除您的簡訊。"</string>
+    <string name="permlab_receiveWapPush">"接收 WAP"</string>
+    <string name="permdesc_receiveWapPush">"允許應用程式接收、處理 WAP 簡訊。惡意程式可使用此功能監控簡訊或在您讀取前擅自刪除。"</string>
+    <string name="permlab_getTasks">"取得執行中應用程式"</string>
+    <string name="permdesc_getTasks">"允許應用程式取得最近執行任務的資訊。惡意程式可利用此功能找出其他應用程式的隱私資訊。"</string>
+    <string name="permlab_reorderTasks">"重新安排執行中的應用程式"</string>
+    <string name="permdesc_reorderTasks">"允許應用程式將任務移至前端與背景處理。惡意程式可使用此功能將自己強制拉到前端。"</string>
+    <string name="permlab_setDebugApp">"啟動應用程式除錯"</string>
+    <string name="permdesc_setDebugApp">"允許應用程式為其他程式開啟除錯功能。惡意程式可利用此功能終止其他應用程式。"</string>
+    <string name="permlab_changeConfiguration">"變更介面設定"</string>
+    <string name="permdesc_changeConfiguration">"允許應用程式變更目前設定,例如:地區或字型大小。"</string>
+    <string name="permlab_restartPackages">"重新啟動其他應用程式"</string>
+    <string name="permdesc_restartPackages">"允許應用程式強制重新啟動其他應用程式。"</string>
+    <string name="permlab_setProcessForeground">"保持已停止狀態"</string>
+    <string name="permdesc_setProcessForeground">"允許應用程式在前端執行任何程序 (無法中止)。一般應用程式不需要此功能。"</string>
+    <string name="permlab_forceBack">"強制關閉應用程式"</string>
+    <string name="permdesc_forceBack">"允許應用程式強制關閉在前端運作的活動並返回。一般應用程式不需要此功能。"</string>
+    <string name="permlab_dump">"接收系統內部狀態"</string>
+    <string name="permdesc_dump">"允許應用程式取得系統內部狀態。惡意程式可利用此功能,取得他們應該不需要的私人、安全資料。"</string>
+    <string name="permlab_addSystemService">"發行低階服務"</string>
+    <string name="permdesc_addSystemService">"允許應用程式發行自有低階系統服務。惡意程式可利用此功能綁架系統或偷取、竄改資料內容。"</string>
+    <string name="permlab_runSetActivityWatcher">"監視控制所有應用程式啟動狀態。"</string>
+    <string name="permdesc_runSetActivityWatcher">"允許應用程式監控管理系統啟動活動。惡意程式可能因此癱瘓整個系統。此權限只在開發時需要,一般手機使用不需要此權限。"</string>
+    <string name="permlab_broadcastPackageRemoved">"傳送程式已移除廣播"</string>
+    <string name="permdesc_broadcastPackageRemoved">"允許應用程式在程式被移除時,發送廣播通知。惡意程式可利用此功能,關閉其他正在執行的程式。"</string>
+    <string name="permlab_broadcastSmsReceived">"傳送已接收 SMS 廣播"</string>
+    <string name="permdesc_broadcastSmsReceived">"允許應用程式收到 SMS 簡訊時,廣播收訊通知。惡意程式可利用此功能,偽造 SMS 簡訊。"</string>
+    <string name="permlab_broadcastWapPush">"送出「WAP PUSH 已接收」廣播"</string>
+    <string name="permdesc_broadcastWapPush">"允許應用程式收到 WAP PUSH 簡訊時,廣播收訊通知。惡意程式可利用此功能,偽造 MMS 簡訊回條或秘密更換網頁內容。"</string>
+    <string name="permlab_setProcessLimit">"執行程序限制數"</string>
+    <string name="permdesc_setProcessLimit">"允許應用程式控制可使用的最大執行緒。一般應用程式不需要此功能。"</string>
+    <string name="permlab_setAlwaysFinish">"關閉所有背景程式"</string>
+    <string name="permdesc_setAlwaysFinish">"允許應用程式控制哪些活動在被移到背景執行時,儘速結束。一般應用程式不需要此功能。"</string>
+    <string name="permlab_fotaUpdate">"自動安裝系統更新"</string>
+    <string name="permdesc_fotaUpdate">"允許應用程式接收系統更新擱置通知,並觸發安裝程序。惡意程式可使用未授權更新竄改系統,或干擾更新程序。"</string>
+    <string name="permlab_batteryStats">"編輯電池狀態"</string>
+    <string name="permdesc_batteryStats">"允許修改電池狀態。一般應用程式不會使用此功能。"</string>
+    <string name="permlab_internalSystemWindow">"顯示未授權視窗"</string>
+    <string name="permdesc_internalSystemWindow">"允許內部系統使用介面建立視窗。一般應用程式不會使用此功能。"</string>
+    <string name="permlab_systemAlertWindow">"顯示系統警告"</string>
+    <string name="permdesc_systemAlertWindow">"允許應用程式顯示系統警告視窗。惡意程式可使用此功能接管手機螢幕。"</string>
+    <string name="permlab_setAnimationScale">"編輯全域動畫速度"</string>
+    <string name="permdesc_setAnimationScale">"允許應用程式變更全域動畫速度 (更快或更慢)。"</string>
+    <string name="permlab_manageAppTokens">"管理應用程式 token"</string>
+    <string name="permdesc_manageAppTokens">"允許應用程式略過一般 Z-ordering,建立與管理自己的 token。一般應用程式不需要此功能。"</string>
+    <string name="permlab_injectEvents">"按下按鍵以及控制各按鈕"</string>
+    <string name="permdesc_injectEvents">"允許應用程式發送輸入事件 (按鍵等) 給其他應用程式。惡意程式可使用此功能接管手機。"</string>
+    <string name="permlab_readInputState">"錄製輸入的內容與動作"</string>
+    <string name="permdesc_readInputState">"允許應用程式在使用者操作其他程式時 (例如:輸入密碼),仍可監看輸入的按鍵。一般應用程式應不需要此功能。"</string>
+    <string name="permlab_bindInputMethod">"連結至輸入法"</string>
+    <string name="permdesc_bindInputMethod">"允許擁有人連結至輸入法的最頂層介面。一般應用程式不需使用此選項。"</string>
+    <string name="permlab_setOrientation">"變更螢幕顯示方向"</string>
+    <string name="permdesc_setOrientation">"允許應用程式隨時變更螢幕顯示方向。一般應用程式不需要此功能。"</string>
+    <string name="permlab_signalPersistentProcesses">"傳送 Linux 訊號到應用程式"</string>
+    <string name="permdesc_signalPersistentProcesses">"允許應用程式要求將支援的訊號傳送到所有持續的程序。"</string>
+    <string name="permlab_persistentActivity">"設定應用程式持續執行"</string>
+    <string name="permdesc_persistentActivity">"允許應用程式持續執行,避免系統將它應用到其他程式。"</string>
+    <string name="permlab_deletePackages">"刪除應用程式"</string>
+    <string name="permdesc_deletePackages">"允許應用程式刪除 Android 程式。惡意程式可利用此功能刪除重要應用程式。"</string>
+    <string name="permlab_clearAppUserData">"刪除其他應用程式資料"</string>
+    <string name="permdesc_clearAppUserData">"允許應用程式清除使用者資料。"</string>
+    <string name="permlab_deleteCacheFiles">"刪除其他應用程式快取"</string>
+    <string name="permdesc_deleteCacheFiles">"允許應用程式刪除快取檔案。"</string>
+    <string name="permlab_getPackageSize">"估算應用程式占用的儲存空間"</string>
+    <string name="permdesc_getPackageSize">"允許應用程式取得程式碼、資料與快取大小"</string>
+    <string name="permlab_installPackages">"直接安裝應用程式"</string>
+    <string name="permdesc_installPackages">"允許應用程式安裝新的 Android 程式或更新。惡意程式可利用此功能新增具有高權限的程式。"</string>
+    <string name="permlab_clearAppCache">"刪除所有應用程式快取資料。"</string>
+    <string name="permdesc_clearAppCache">"允許應用程式刪除快取目錄裡的檔案,釋放儲存空間。此操作通常受到系統程序嚴格限制。"</string>
+    <string name="permlab_readLogs">"讀取系統記錄檔"</string>
+    <string name="permdesc_readLogs">"允許應用程式讀取系統記錄檔。此項操作可讓應用程式了解目前手機操作狀態,但內容應不含任何個人或隱私資訊。"</string>
+    <string name="permlab_diagnostic">"讀寫 diag 擁有的資源"</string>
+    <string name="permdesc_diagnostic">"允許應用程式讀寫 diag 群組的資源;例如:/dev 裡的檔案。這可能會影響系統穩定性與安全性。此功能僅供製造商或技術人員用於硬體規格偵測。"</string>
+    <string name="permlab_changeComponentState">"啟用或停用應用程式元件"</string>
+    <string name="permdesc_changeComponentState">"允許應用程式變更是否啟用其他元件或應用程式。惡意程式可利用此功能,停用重要的手機功能。請在取得許可的狀態下小心使用,此功能可能導致應用程式元件無法使用、不一致或不穩定。"</string>
+    <string name="permlab_setPreferredApplications">"設定喜好的應用程式"</string>
+    <string name="permdesc_setPreferredApplications">"允許應用程式修改您偏好使用的應用程式。惡意程式可能依此秘密竄改執行的程式,偽造已存在的程式以收集私人資料。"</string>
+    <string name="permlab_writeSettings">"編輯全域系統設定"</string>
+    <string name="permdesc_writeSettings">"允許應用程式修改系統設定。惡意程式可使用此功能中斷系統設定。"</string>
+    <string name="permlab_writeSecureSettings">"編輯安全系統設定"</string>
+    <string name="permdesc_writeSecureSettings">"允許應用程式修改系統的安全設定資料。一般應用程式不會使用此功能。"</string>
+    <string name="permlab_writeGservices">"修改 Google 服務地圖"</string>
+    <string name="permdesc_writeGservices">"允許應用程式修改 Google 服務地圖。一般應用程式不會使用此功能。"</string>
+    <string name="permlab_receiveBootCompleted">"開機時自動啟用"</string>
+    <string name="permdesc_receiveBootCompleted">"允許應用程式在開機後盡快啟動。此項設定會讓開機時間拉長,並允許應用程式持續執行,因此拖慢手機速度。"</string>
+    <string name="permlab_broadcastSticky">"傳送附屬廣播"</string>
+    <string name="permdesc_broadcastSticky">"允許應用程式在廣播結束後,持續送出附屬廣播。惡意程式可利用此功能,佔據過多記憶體,讓手機變慢或不穩定。"</string>
+    <string name="permlab_readContacts">"讀取聯絡人資料"</string>
+    <string name="permdesc_readContacts">"允許應用程式讀取手機上所有聯絡人 (地址)。惡意程式可利用此功能將您的資料傳送給其他人。"</string>
+    <string name="permlab_writeContacts">"輸入聯絡人資料"</string>
+    <string name="permdesc_writeContacts">"允許應用程式更改聯絡資訊 (地址)。惡意程式可利用此功能,清除或修改聯絡資料。"</string>
+    <string name="permlab_writeOwnerData">"輸入擁有者資料"</string>
+    <string name="permdesc_writeOwnerData">"允許應用程式更改手機擁有者資料。惡意程式可利用此功能,清除或修改擁有者資料。"</string>
+    <string name="permlab_readOwnerData">"讀取擁有者資料"</string>
+    <string name="permdesc_readOwnerData">"允許應用程式讀取手機擁有者資料。惡意程式可利用此功能讀取擁有者資料。"</string>
+    <string name="permlab_readCalendar">"讀取行事曆資料"</string>
+    <string name="permdesc_readCalendar">"允許應用程式讀取手機上所有行事曆行程。惡意程式可利用此功能將您的行事曆行程傳送給其他人。"</string>
+    <string name="permlab_writeCalendar">"寫入行事曆資料"</string>
+    <string name="permdesc_writeCalendar">"允許應用程式更改行事曆行程。惡意程式可利用此功能,清除或修改行事曆資料。"</string>
+    <string name="permlab_accessMockLocation">"模擬位置來源以供測試"</string>
+    <string name="permdesc_accessMockLocation">"建立模擬位置來源以供測試。惡意程式可利用此功能覆寫 GPS 或網路服務商回傳的位置及/或狀態。"</string>
+    <string name="permlab_accessLocationExtraCommands">"存取額外位置提供者命令"</string>
+    <string name="permdesc_accessLocationExtraCommands">"存取額外位置提供者命令。惡意程式可利用此功能干擾 GPS 或其他位置來源。"</string>
+    <string name="permlab_accessFineLocation">"良好的 (GPS) 位置"</string>
+    <string name="permdesc_accessFineLocation">"存取正確位置來源,例如:手機 GPS。惡意程式可使用此功能知道您的位置,並且可能額外消耗電力。"</string>
+    <string name="permlab_accessCoarseLocation">"大略位置 (以網路為基準)"</string>
+    <string name="permdesc_accessCoarseLocation">"接收粗略的位置來源 (例如:行動網路資料庫),計算出目前大概位置。惡意程式可使用此功能得知您的所在地。"</string>
+    <string name="permlab_accessSurfaceFlinger">"存取 SurfaceFlinger"</string>
+    <string name="permdesc_accessSurfaceFlinger">"允許應用程式使用 SurfaceFlinger 低階功能。"</string>
+    <string name="permlab_readFrameBuffer">"讀取框架緩衝"</string>
+    <string name="permdesc_readFrameBuffer">"允許應用程式讀取框架緩衝的內容。"</string>
+    <string name="permlab_modifyAudioSettings">"變更音訊設定"</string>
+    <string name="permdesc_modifyAudioSettings">"允許應用程式編輯全域音訊設定,例如音量與路由。"</string>
+    <string name="permlab_recordAudio">"錄製音訊"</string>
+    <string name="permdesc_recordAudio">"允許應用程式存取音訊錄製路徑。"</string>
+    <string name="permlab_camera">"照相"</string>
+    <string name="permdesc_camera">"允許應用程式使用相機照相。此功能可讓應用程式隨時透過相機拍攝照片。"</string>
+    <string name="permlab_brick">"永久停用電話"</string>
+    <string name="permdesc_brick">"允許應用程式永久停用手機。此項操作非常危險。"</string>
+    <string name="permlab_reboot">"強制重開機"</string>
+    <string name="permdesc_reboot">"允許應用程式強制重開機。"</string>
+    <string name="permlab_mount_unmount_filesystems">"掛載/卸載檔案系統"</string>
+    <string name="permdesc_mount_unmount_filesystems">"允許應用程式掛載/卸載抽取式儲存設備的檔案系統。"</string>
+    <string name="permlab_vibrate">"控制震動器"</string>
+    <string name="permdesc_vibrate">"允許應用程式控制震動器。"</string>
+    <string name="permlab_flashlight">"控制閃光燈"</string>
+    <string name="permdesc_flashlight">"允許應用程式控制閃光燈。"</string>
+    <string name="permlab_hardware_test">"測試硬體"</string>
+    <string name="permdesc_hardware_test">"允許應用程式控制各種週邊設備,以供測試用。"</string>
+    <string name="permlab_callPhone">"直接撥打電話號碼"</string>
+    <string name="permdesc_callPhone">"允許應用程式自行撥打電話。惡意程式可能會撥打其他電話,造成額外支出。但請注意此選項不允許應用程式撥打緊急電話號碼。"</string>
+    <string name="permlab_callPrivileged">"直接撥打任何電話號碼"</string>
+    <string name="permdesc_callPrivileged">"允許應用程式自行撥打任何電話號碼,包括緊急電話號碼。惡意程式可利用此功能濫用緊急服務,撥打不需要或違法的電話。"</string>
+    <string name="permlab_locationUpdates">"控制位置更新通知"</string>
+    <string name="permdesc_locationUpdates">"允許啟用/停用無線通訊位置更新通知。一般應用程式不會使用此功能。"</string>
+    <string name="permlab_checkinProperties">"存取登機選項"</string>
+    <string name="permdesc_checkinProperties">"允許讀寫登機服務上傳的資料。一般應用程式不會使用此功能。"</string>
+    <string name="permlab_modifyPhoneState">"修改手機狀態"</string>
+    <string name="permdesc_modifyPhoneState">"允許應用程式控制電話功能。擁有此權限的程式可自行切換網路、開關無線通訊功能。"</string>
+    <string name="permlab_readPhoneState">"讀取手機狀態"</string>
+    <string name="permdesc_readPhoneState">"允許應用程式存取裝置的電話功能。通話時,有此權限的應用程式可設定手機是否通話、撥出的號碼等等。"</string>
+    <string name="permlab_wakeLock">"防止手機進入待命狀態"</string>
+    <string name="permdesc_wakeLock">"允許應用程式阻止手機進入待命。"</string>
+    <string name="permlab_devicePower">"開啟或關閉電源"</string>
+    <string name="permdesc_devicePower">"允許應用程式開啟或關閉電話。"</string>
+    <string name="permlab_factoryTest">"在出廠測試模式下執行"</string>
+    <string name="permdesc_factoryTest">"執行低階製造商測試,允許完全存取手機硬體。此功能只能在手機是製造商測試模式下才可執行。"</string>
+    <string name="permlab_setWallpaper">"設定桌布"</string>
+    <string name="permdesc_setWallpaper">"允許應用程式設定系統桌布。"</string>
+    <string name="permlab_setWallpaperHints">"設定桌布大小提示"</string>
+    <string name="permdesc_setWallpaperHints">"允許應用程式設定系統桌布大小提示。"</string>
+    <string name="permlab_masterClear">"將系統回復出廠預設值"</string>
+    <string name="permdesc_masterClear">"允許應用程式將手機完全重設至出廠設定,清除所有資料、設定與已安裝程式。"</string>
+    <string name="permlab_setTimeZone">"設定時區"</string>
+    <string name="permdesc_setTimeZone">"允許應用程式變更時區。"</string>
+    <string name="permlab_getAccounts">"發現已知帳戶。"</string>
+    <string name="permdesc_getAccounts">"允許應用程式取得手機上的帳戶清單。"</string>
+    <string name="permlab_accessNetworkState">"檢視網路狀態"</string>
+    <string name="permdesc_accessNetworkState">"允許應用程式檢視網路狀態。"</string>
+    <string name="permlab_createNetworkSockets">"完整網際網路存取"</string>
+    <string name="permdesc_createNetworkSockets">"允許應用程式建立網路設定。"</string>
+    <string name="permlab_writeApnSettings">"輸入存取點名稱設定"</string>
+    <string name="permdesc_writeApnSettings">"允許應用程式修改 APN 設定,例如:Proxy 及 APN 的連接埠。"</string>
+    <string name="permlab_changeNetworkState">"變更網路連線"</string>
+    <string name="permdesc_changeNetworkState">"允許應用程式變更網路連線狀態。"</string>
+    <string name="permlab_accessWifiState">"檢視 Wi-Fi 狀態"</string>
+    <string name="permdesc_accessWifiState">"允許應用程式檢視 Wi-Fi 狀態資訊。"</string>
+    <string name="permlab_changeWifiState">"變更 Wi-Fi 狀態"</string>
+    <string name="permdesc_changeWifiState">"允許應用程式與 Wi-Fi 存取點連線或斷線,並可變更 Wi-Fi 網路設定。"</string>
+    <string name="permlab_bluetoothAdmin">"藍牙管理"</string>
+    <string name="permdesc_bluetoothAdmin">"允許應用程式設定本機藍牙電話,以及偵測與配對其他遠端裝置。"</string>
+    <string name="permlab_bluetooth">"建立藍牙連線"</string>
+    <string name="permdesc_bluetooth">"允許應用程式檢視本地藍牙電話設定,並與其他配對裝置連線。"</string>
+    <string name="permlab_disableKeyguard">"停用按鍵鎖定"</string>
+    <string name="permdesc_disableKeyguard">"允許應用程式停用按鍵鎖定以及其他相關的密碼安全性。合理的範例是:收到來電時解開按鍵鎖定,通話結束後重新啟動按鍵鎖定。"</string>
+    <string name="permlab_readSyncSettings">"讀取同步處理設定"</string>
+    <string name="permdesc_readSyncSettings">"允許應用程式讀取同步處理設定,例如:是否同步處理 [通訊錄]。"</string>
+    <string name="permlab_writeSyncSettings">"編輯同步處理設定"</string>
+    <string name="permdesc_writeSyncSettings">"允許應用程式修改同步處理設定,例如:是否要同步處理 [通訊錄]。"</string>
+    <string name="permlab_readSyncStats">"讀取同步處理狀態"</string>
+    <string name="permdesc_readSyncStats">"允許應用程式讀取同步處理狀態;例如:同步處理記錄。"</string>
+    <string name="permlab_subscribedFeedsRead">"讀取訂閱資訊提供"</string>
+    <string name="permdesc_subscribedFeedsRead">"允許應用程式取得目前已同步處理的資訊提供。"</string>
+    <string name="permlab_subscribedFeedsWrite">"寫入訂閱資訊提供"</string>
+    <string name="permdesc_subscribedFeedsWrite">"允許應用程式修改已同步處理的資訊提供。惡意程式可使用此功能變更已同步處理的資訊提供。"</string>
+  <string-array name="phoneTypes">
+    <item>"首頁"</item>
+    <item>"行動"</item>
+    <item>"工作"</item>
+    <item>"辦公傳真"</item>
+    <item>"家用傳真"</item>
+    <item>"呼叫器"</item>
+    <item>"其他"</item>
+    <item>"自訂"</item>
+  </string-array>
+  <string-array name="emailAddressTypes">
+    <item>"首頁"</item>
+    <item>"工作"</item>
+    <item>"其他"</item>
+    <item>"自訂"</item>
+  </string-array>
+  <string-array name="postalAddressTypes">
+    <item>"首頁"</item>
+    <item>"工作"</item>
+    <item>"其他"</item>
+    <item>"自訂"</item>
+  </string-array>
+  <string-array name="imAddressTypes">
+    <item>"首頁"</item>
+    <item>"工作"</item>
+    <item>"其他"</item>
+    <item>"自訂"</item>
+  </string-array>
+  <string-array name="organizationTypes">
+    <item>"工作"</item>
+    <item>"其他"</item>
+    <item>"自訂"</item>
+  </string-array>
+  <string-array name="imProtocols">
+    <item>"AIM"</item>
+    <item>"Windows Live"</item>
+    <item>"Yahoo"</item>
+    <item>"Skype"</item>
+    <item>"QQ"</item>
+    <item>"Google Talk"</item>
+    <item>"ICQ"</item>
+    <item>"Jabber"</item>
+  </string-array>
+    <string name="keyguard_password_enter_pin_code">"輸入 PIN 碼"</string>
+    <string name="keyguard_password_wrong_pin_code">"PIN 碼錯誤!"</string>
+    <string name="keyguard_label_text">"若要解鎖,按下 [選單]、[0]。"</string>
+    <string name="emergency_call_dialog_number_for_display">"緊急電話號碼"</string>
+    <string name="lockscreen_carrier_default">"(沒有服務)"</string>
+    <string name="lockscreen_screen_locked">"螢幕已鎖定。"</string>
+    <string name="lockscreen_instructions_when_pattern_enabled">"按下 [選單] 解鎖或撥打緊急電話。"</string>
+    <string name="lockscreen_instructions_when_pattern_disabled">"按下 [選單] 解鎖。"</string>
+    <string name="lockscreen_pattern_instructions">"畫出解鎖圖形"</string>
+    <string name="lockscreen_emergency_call">"緊急電話"</string>
+    <string name="lockscreen_pattern_correct">"正確!"</string>
+    <string name="lockscreen_pattern_wrong">"抱歉,請再試一次"</string>
+    <string name="lockscreen_plugged_in">"充電中 (<xliff:g id="NUMBER">%d%%</xliff:g>)"</string>
+    <string name="lockscreen_low_battery">"請連接充電器。"</string>
+    <string name="lockscreen_missing_sim_message_short">"沒有 SIM  卡。"</string>
+    <string name="lockscreen_missing_sim_message">"手機未插入 SIM 卡。"</string>
+    <string name="lockscreen_missing_sim_instructions">"請插入 SIM 卡。"</string>
+    <string name="lockscreen_network_locked_message">"網路已鎖定"</string>
+    <string name="lockscreen_sim_puk_locked_message">"SIM 的 PUK 已鎖定。"</string>
+    <string name="lockscreen_sim_puk_locked_instructions">"請聯絡客服中心。"</string>
+    <string name="lockscreen_sim_locked_message">"SIM 卡已鎖定。"</string>
+    <string name="lockscreen_sim_unlock_progress_dialog_message">"解鎖 SIM 卡中..."</string>
+    <string name="lockscreen_too_many_failed_attempts_dialog_message">"畫出解鎖圖形已錯誤 <xliff:g id="NUMBER_0">%d</xliff:g> 次。"\n\n" 請在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒後再嘗試。"</string>
+    <string name="lockscreen_failed_attempts_almost_glogin">"畫出解鎖圖形已錯誤 <xliff:g id="NUMBER_0">%d</xliff:g> 次。再錯誤 <xliff:g id="NUMBER_1">%d</xliff:g> 次後,系統會要求使用 Google 登入來解鎖。"\n\n" 請在 <xliff:g id="NUMBER_2">%d</xliff:g> 秒後再試一次。"</string>
+    <string name="lockscreen_too_many_failed_attempts_countdown">"<xliff:g id="NUMBER">%d</xliff:g> 秒後再試一次。"</string>
+    <string name="lockscreen_forgot_pattern_button_text">"忘記解鎖圖形?"</string>
+    <string name="lockscreen_glogin_too_many_attempts">"解鎖圖形出錯次數過多!"</string>
+    <string name="lockscreen_glogin_instructions">"若要解鎖,"\n"請以您的 Google 帳戶登入"</string>
+    <string name="lockscreen_glogin_username_hint">"使用者名稱 (電子郵件)"</string>
+    <string name="lockscreen_glogin_password_hint">"密碼"</string>
+    <string name="lockscreen_glogin_submit_button">"登入"</string>
+    <string name="lockscreen_glogin_invalid_input">"使用者名稱或密碼錯誤。"</string>
+    <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
+    <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+    <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+    <!-- no translation found for hour_ampm (7618670480400517084) -->
+    <skip />
+    <!-- no translation found for hour_cap_ampm (5117798389811605468) -->
+    <skip />
+    <string name="status_bar_clear_all_button">"清除通知"</string>
+    <string name="status_bar_no_notifications_title">"沒有通知"</string>
+    <string name="status_bar_ongoing_events_title">"進行中"</string>
+    <string name="status_bar_latest_events_title">"通知"</string>
+    <!-- no translation found for battery_status_text_percent_format (8818848472818880005) -->
+    <skip />
+    <string name="battery_status_charging">"充電中"</string>
+    <string name="battery_low_title">"請連接充電器"</string>
+    <string name="battery_low_subtitle">"電池電量即將不足:"</string>
+    <string name="battery_low_percent_format">"電池電量不到 <xliff:g id="NUMBER">%d%%</xliff:g>。"</string>
+    <string name="factorytest_failed">"出廠測試失敗"</string>
+    <string name="factorytest_not_system">"FACTORY_TEST 動作只支援安裝在 /system/app 裡的程式。"</string>
+    <string name="factorytest_no_action">"找不到提供 FACTORY_TEST 的程式。"</string>
+    <string name="factorytest_reboot">"重新開機"</string>
+    <string name="save_password_label">"確認"</string>
+    <string name="save_password_message">"是否記憶此密碼?"</string>
+    <string name="save_password_notnow">"現在不要"</string>
+    <string name="save_password_remember">"記住"</string>
+    <string name="save_password_never">"從不"</string>
+    <string name="open_permission_deny">"您沒有開啟此頁的權限。"</string>
+    <string name="text_copied">"已複製到剪貼簿的文字。"</string>
+    <string name="more_item_label">"更多"</string>
+    <string name="prepend_shortcut_label">"[選單]+"</string>
+    <string name="menu_space_shortcut_label">"空白鍵"</string>
+    <string name="menu_enter_shortcut_label">"輸入"</string>
+    <string name="menu_delete_shortcut_label">"刪除"</string>
+    <string name="search_go">"搜尋"</string>
+    <string name="today">"今天"</string>
+    <string name="yesterday">"昨天"</string>
+    <string name="tomorrow">"明天"</string>
+    <string name="oneMonthDurationPast">"1 個月以前"</string>
+    <string name="beforeOneMonthDurationPast">"1 個月前"</string>
+  <plurals name="num_seconds_ago">
+    <item quantity="one">"1 秒以前"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> 秒以前"</item>
+  </plurals>
+  <plurals name="num_minutes_ago">
+    <item quantity="one">"1 分鐘以前"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> 分鐘以前"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one">"1 小時以前"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> 小時以前"</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one">"昨天"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> 天以前"</item>
+  </plurals>
+  <plurals name="in_num_seconds">
+    <item quantity="one">"1 秒內"</item>
+    <item quantity="other">"在 <xliff:g id="COUNT">%d</xliff:g> 秒內"</item>
+  </plurals>
+  <plurals name="in_num_minutes">
+    <item quantity="one">"1 分鐘內"</item>
+    <item quantity="other">"在 <xliff:g id="COUNT">%d</xliff:g> 分鐘內"</item>
+  </plurals>
+  <plurals name="in_num_hours">
+    <item quantity="one">"1 小時內"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> 小時內"</item>
+  </plurals>
+  <plurals name="in_num_days">
+    <item quantity="one">"明天"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> 天內"</item>
+  </plurals>
+    <!-- no translation found for abbrev_num_seconds_ago:one (1849036840200069118) -->
+    <!-- no translation found for abbrev_num_seconds_ago:other (3699169366650930415) -->
+    <!-- no translation found for abbrev_num_minutes_ago:one (6361490147113871545) -->
+    <!-- no translation found for abbrev_num_minutes_ago:other (851164968597150710) -->
+    <!-- no translation found for abbrev_num_hours_ago:one (4796212039724722116) -->
+    <!-- no translation found for abbrev_num_hours_ago:other (6889970745748538901) -->
+    <!-- no translation found for abbrev_num_days_ago:one (8463161711492680309) -->
+    <!-- no translation found for abbrev_num_days_ago:other (3453342639616481191) -->
+    <!-- no translation found for abbrev_in_num_seconds:one (5842225370795066299) -->
+    <!-- no translation found for abbrev_in_num_seconds:other (5495880108825805108) -->
+    <!-- no translation found for abbrev_in_num_minutes:one (562786149928284878) -->
+    <!-- no translation found for abbrev_in_num_minutes:other (4216113292706568726) -->
+    <!-- no translation found for abbrev_in_num_hours:one (3274708118124045246) -->
+    <!-- no translation found for abbrev_in_num_hours:other (3705373766798013406) -->
+    <!-- no translation found for abbrev_in_num_days:one (2178576254385739855) -->
+    <!-- no translation found for abbrev_in_num_days:other (2973062968038355991) -->
+    <string name="preposition_for_date">"%s"</string>
+    <string name="preposition_for_time">"%s"</string>
+    <string name="preposition_for_year">"%s"</string>
+    <string name="day">"天"</string>
+    <string name="days">"天"</string>
+    <string name="hour">"小時"</string>
+    <string name="hours">"小時"</string>
+    <string name="minute">"分鐘"</string>
+    <string name="minutes">"分鐘"</string>
+    <string name="second">"秒"</string>
+    <string name="seconds">"秒"</string>
+    <string name="week">"週"</string>
+    <string name="weeks">"週"</string>
+    <string name="year">"年"</string>
+    <string name="years">"年"</string>
+    <string name="sunday">"星期日"</string>
+    <string name="monday">"星期一"</string>
+    <string name="tuesday">"星期二"</string>
+    <string name="wednesday">"星期三"</string>
+    <string name="thursday">"星期四"</string>
+    <string name="friday">"星期五"</string>
+    <string name="saturday">"星期六"</string>
+    <string name="every_weekday">"每天 (週一至週五)"</string>
+    <string name="daily">"每天"</string>
+    <string name="weekly">"每週 <xliff:g id="DAY">%s</xliff:g>"</string>
+    <string name="monthly">"每月"</string>
+    <string name="yearly">"每年"</string>
+    <string name="VideoView_error_title">"無法播放影片"</string>
+    <string name="VideoView_error_text_unknown">"抱歉,無法撥放此影片。"</string>
+    <string name="VideoView_error_button">"確定"</string>
+    <string name="am">"上午"</string>
+    <string name="pm">"下午"</string>
+    <string name="numeric_date">"<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="DATE1">%2$s</xliff:g>,<xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>,<xliff:g id="DATE2">%5$s</xliff:g>,<xliff:g id="TIME2">%6$s</xliff:g>"</string>
+    <string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>,<xliff:g id="DATE2">%5$s</xliff:g>"</string>
+    <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>,<xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>,<xliff:g id="TIME2">%6$s</xliff:g>"</string>
+    <string name="date1_date2">"<xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>"</string>
+    <string name="time1_time2">"<xliff:g id="TIME1">%1$s</xliff:g> – <xliff:g id="TIME2">%2$s</xliff:g>"</string>
+    <string name="time_wday_date">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>,<xliff:g id="WEEKDAY">%2$s</xliff:g>,<xliff:g id="DATE">%3$s</xliff:g>"</string>
+    <string name="wday_date">"<xliff:g id="WEEKDAY">%2$s</xliff:g>,<xliff:g id="DATE">%3$s</xliff:g>"</string>
+    <string name="time_date">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>,<xliff:g id="DATE">%3$s</xliff:g>"</string>
+    <!-- no translation found for date_time (6104442718633642836) -->
+    <skip />
+    <!-- no translation found for relative_time (1818557177829411417) -->
+    <skip />
+    <string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>,<xliff:g id="WEEKDAY">%2$s</xliff:g>"</string>
+    <string name="full_date_month_first">"<xliff:g id="MONTH">MMMM</xliff:g> <xliff:g id="DAY">dd</xliff:g>,<xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="full_date_day_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMMM</xliff:g>,<xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="medium_date_month_first">"<xliff:g id="MONTH">MMM</xliff:g> <xliff:g id="DAY">dd</xliff:g>,<xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="medium_date_day_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMM</xliff:g>,<xliff:g id="YEAR">yyyy</xliff:g>"</string>
+    <string name="twelve_hour_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">a</xliff:g>"</string>
+    <string name="twenty_four_hour_time_format">"<xliff:g id="HOUR">H</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g>"</string>
+    <string name="noon">"中午"</string>
+    <string name="Noon">"中午"</string>
+    <string name="midnight">"午夜"</string>
+    <string name="Midnight">"午夜"</string>
+    <!-- no translation found for month_day (5565829181417740906) -->
+    <skip />
+    <!-- no translation found for month (7026169712234774086) -->
+    <skip />
+    <string name="month_day_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>,<xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <!-- no translation found for month_year (9219019380312413367) -->
+    <skip />
+    <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
+    <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>,<xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <string name="same_year_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>"</string>
+    <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>"</string>
+    <string name="same_year_mdy1_mdy2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>,<xliff:g id="YEAR">%9$s</xliff:g>"</string>
+    <string name="same_year_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>,<xliff:g id="YEAR">%9$s</xliff:g>"</string>
+    <string name="same_year_md1_time1_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_year_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_year_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>,<xliff:g id="YEAR1">%4$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>,<xliff:g id="YEAR2">%9$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>,<xliff:g id="YEAR1">%4$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>,<xliff:g id="YEAR2">%9$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>"</string>
+    <string name="numeric_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>"</string>
+    <string name="numeric_mdy1_mdy2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="numeric_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="numeric_md1_time1_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g>/<xliff:g id="YEAR1">%4$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g>/<xliff:g id="YEAR2">%9$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>"</string>
+    <string name="same_month_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>"</string>
+    <string name="same_month_mdy1_mdy2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="same_month_wday1_mdy1_wday2_mdy2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>,<xliff:g id="YEAR1">%4$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>,<xliff:g id="YEAR2">%9$s</xliff:g>"</string>
+    <string name="same_month_md1_time1_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>,<xliff:g id="YEAR1">%4$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>,<xliff:g id="YEAR2">%9$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>,<xliff:g id="YEAR1">%4$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>,<xliff:g id="YEAR2">%9$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
+    <string name="abbrev_month_day_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g>,<xliff:g id="YEAR">%Y</xliff:g>"</string>
+    <!-- no translation found for abbrev_month_year (3856424847226891943) -->
+    <skip />
+    <!-- no translation found for abbrev_month_day (5028815883653985933) -->
+    <skip />
+    <!-- no translation found for abbrev_month (3131032032850777433) -->
+    <skip />
+    <string name="day_of_week_long_sunday">"星期日"</string>
+    <string name="day_of_week_long_monday">"星期一"</string>
+    <string name="day_of_week_long_tuesday">"星期二"</string>
+    <string name="day_of_week_long_wednesday">"星期三"</string>
+    <string name="day_of_week_long_thursday">"星期四"</string>
+    <string name="day_of_week_long_friday">"星期五"</string>
+    <string name="day_of_week_long_saturday">"星期六"</string>
+    <string name="day_of_week_medium_sunday">"週日"</string>
+    <string name="day_of_week_medium_monday">"週一"</string>
+    <string name="day_of_week_medium_tuesday">"週二"</string>
+    <string name="day_of_week_medium_wednesday">"週三"</string>
+    <string name="day_of_week_medium_thursday">"週四"</string>
+    <string name="day_of_week_medium_friday">"週五"</string>
+    <string name="day_of_week_medium_saturday">"週六"</string>
+    <string name="day_of_week_short_sunday">"週日"</string>
+    <string name="day_of_week_short_monday">"週一"</string>
+    <string name="day_of_week_short_tuesday">"週二"</string>
+    <string name="day_of_week_short_wednesday">"週三"</string>
+    <string name="day_of_week_short_thursday">"週四"</string>
+    <string name="day_of_week_short_friday">"週五"</string>
+    <string name="day_of_week_short_saturday">"週六"</string>
+    <string name="day_of_week_shorter_sunday">"週日"</string>
+    <string name="day_of_week_shorter_monday">"一"</string>
+    <string name="day_of_week_shorter_tuesday">"週二"</string>
+    <string name="day_of_week_shorter_wednesday">"三"</string>
+    <string name="day_of_week_shorter_thursday">"週四"</string>
+    <string name="day_of_week_shorter_friday">"五"</string>
+    <string name="day_of_week_shorter_saturday">"週六"</string>
+    <string name="day_of_week_shortest_sunday">"日"</string>
+    <string name="day_of_week_shortest_monday">"週一"</string>
+    <string name="day_of_week_shortest_tuesday">"二"</string>
+    <string name="day_of_week_shortest_wednesday">"週三"</string>
+    <string name="day_of_week_shortest_thursday">"四"</string>
+    <string name="day_of_week_shortest_friday">"五"</string>
+    <string name="day_of_week_shortest_saturday">"六"</string>
+    <string name="month_long_january">"1 月"</string>
+    <string name="month_long_february">"2 月"</string>
+    <string name="month_long_march">"3 月"</string>
+    <string name="month_long_april">"4 月"</string>
+    <string name="month_long_may">"5 月"</string>
+    <string name="month_long_june">"6 月"</string>
+    <string name="month_long_july">"7 月"</string>
+    <string name="month_long_august">"8 月"</string>
+    <string name="month_long_september">"9 月"</string>
+    <string name="month_long_october">"10 月"</string>
+    <string name="month_long_november">"11 月"</string>
+    <string name="month_long_december">"12 月"</string>
+    <string name="month_medium_january">"1 月"</string>
+    <string name="month_medium_february">"2 月"</string>
+    <string name="month_medium_march">"3 月"</string>
+    <string name="month_medium_april">"4 月"</string>
+    <string name="month_medium_may">"5 月"</string>
+    <string name="month_medium_june">"6 月"</string>
+    <string name="month_medium_july">"7 月"</string>
+    <string name="month_medium_august">"8 月"</string>
+    <string name="month_medium_september">"9 月"</string>
+    <string name="month_medium_october">"10 月"</string>
+    <string name="month_medium_november">"11 月"</string>
+    <string name="month_medium_december">"12 月"</string>
+    <string name="month_shortest_january">"1"</string>
+    <string name="month_shortest_february">"2"</string>
+    <string name="month_shortest_march">"3"</string>
+    <string name="month_shortest_april">"4"</string>
+    <string name="month_shortest_may">"5"</string>
+    <string name="month_shortest_june">"6"</string>
+    <string name="month_shortest_july">"7"</string>
+    <string name="month_shortest_august">"8"</string>
+    <string name="month_shortest_september">"9"</string>
+    <string name="month_shortest_october">"10"</string>
+    <string name="month_shortest_november">"11"</string>
+    <string name="month_shortest_december">"12"</string>
+    <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+    <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
+    <string name="selectAll">"全部選取"</string>
+    <string name="selectText">"選取文字"</string>
+    <string name="stopSelectingText">"停止選取文字"</string>
+    <string name="cut">"剪下"</string>
+    <string name="cutAll">"全部剪下"</string>
+    <string name="copy">"複製"</string>
+    <string name="copyAll">"全部複製"</string>
+    <string name="paste">"貼上"</string>
+    <string name="copyUrl">"複製網址"</string>
+    <string name="inputMethod">"輸入法"</string>
+    <string name="editTextMenuTitle">"編輯文字"</string>
+    <string name="low_internal_storage_view_title">"儲存空間太少"</string>
+    <string name="low_internal_storage_view_text">"手機儲存空間即將不足。"</string>
+    <string name="ok">"確定"</string>
+    <string name="cancel">"取消"</string>
+    <string name="yes">"確定"</string>
+    <string name="no">"取消"</string>
+    <string name="capital_on">"開啟"</string>
+    <string name="capital_off">"關閉"</string>
+    <string name="whichApplication">"選取...完成動作"</string>
+    <string name="alwaysUse">"以此為本操作預設值。"</string>
+    <string name="clearDefaultHintMsg">"清除首頁設定 (應用程式) 管理應用程式的預設值。"</string>
+    <string name="chooseActivity">"選取一項操作"</string>
+    <string name="noApplications">"沒有應用程式可進行此操作。"</string>
+    <string name="aerr_title">"抱歉!"</string>
+    <string name="aerr_application">"應用程式 <xliff:g id="APPLICATION">%1$s</xliff:g> (程序:<xliff:g id="PROCESS">%2$s</xliff:g>) 未正常終止。請再試一次。"</string>
+    <string name="aerr_process">"<xliff:g id="PROCESS">%1$s</xliff:g> 未正常終止。請再試一次。"</string>
+    <string name="anr_title">"抱歉!"</string>
+    <string name="anr_activity_application">"<xliff:g id="ACTIVITY">%1$s</xliff:g> (應用程式:<xliff:g id="APPLICATION">%2$s</xliff:g>) 無回應。"</string>
+    <string name="anr_activity_process">"<xliff:g id="ACTIVITY">%1$s</xliff:g> (程序:<xliff:g id="PROCESS">%2$s</xliff:g>) 無回應。"</string>
+    <string name="anr_application_process">"應用程式 <xliff:g id="APPLICATION">%1$s</xliff:g> (程序:<xliff:g id="PROCESS">%2$s</xliff:g>) 無回應。"</string>
+    <string name="anr_process">"程序 <xliff:g id="PROCESS">%1$s</xliff:g> 沒有回應。"</string>
+    <string name="force_close">"強制關閉"</string>
+    <string name="wait">"等待"</string>
+    <string name="debug">"除錯"</string>
+    <string name="sendText">"選取文字動作"</string>
+    <string name="volume_ringtone">"鈴聲音量"</string>
+    <string name="volume_music">"媒體音量"</string>
+    <string name="volume_music_hint_playing_through_bluetooth">"透過藍牙播放"</string>
+    <string name="volume_call">"來電音量"</string>
+    <string name="volume_call_hint_playing_through_bluetooth">"透過藍牙播放"</string>
+    <string name="volume_alarm">"鬧鐘音量"</string>
+    <string name="volume_notification">"通知音量"</string>
+    <string name="volume_unknown">"音量"</string>
+    <string name="ringtone_default">"預設鈴聲"</string>
+    <string name="ringtone_default_with_actual">"預設鈴聲 (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+    <string name="ringtone_silent">"靜音"</string>
+    <string name="ringtone_picker_title">"鈴聲"</string>
+    <string name="ringtone_unknown">"未知的鈴聲"</string>
+  <plurals name="wifi_available">
+    <item quantity="one">"已偵測到 Wi-Fi 網路"</item>
+    <item quantity="other">"已偵測到 Wi-Fi 網路"</item>
+  </plurals>
+  <plurals name="wifi_available_detailed">
+    <item quantity="one">"開啟可用 Wi-Fi 網路"</item>
+    <item quantity="other">"開啟可用 Wi-Fi 網路"</item>
+  </plurals>
+    <string name="select_character">"插入字元"</string>
+    <string name="sms_control_default_app_name">"未知的應用程式"</string>
+    <string name="sms_control_title">"傳送 SMS 簡訊"</string>
+    <string name="sms_control_message">"即將傳送大量 SMS 簡訊。選取 [確定] 繼續或 [取消] 停止傳送。"</string>
+    <string name="sms_control_yes">"確定"</string>
+    <string name="sms_control_no">"取消"</string>
+    <string name="date_time_set">"設定"</string>
+    <string name="default_permission_group">"預設值"</string>
+    <string name="no_permissions">"無須許可"</string>
+    <string name="perms_hide"><b>" 隱藏"</b></string>
+    <string name="perms_show_all"><b>"顯示全部"</b></string>
+    <string name="googlewebcontenthelper_loading">"載入中..."</string>
+    <string name="usb_storage_title">"USB 已連接"</string>
+    <string name="usb_storage_message">"已透過 USB 連接手機與電腦。若要從電腦或 SD 卡複製檔案,請選取 [掛載]。"</string>
+    <string name="usb_storage_button_mount">"掛載"</string>
+    <string name="usb_storage_button_unmount">"不要掛載"</string>
+    <string name="usb_storage_error_message">"把 SD 卡當成 USB 儲存裝置時發生問題。"</string>
+    <string name="usb_storage_notification_title">"USB 已連接"</string>
+    <string name="usb_storage_notification_message">"選取此項將檔案複製到電腦,或從電腦複製。"</string>
+    <string name="select_input_method">"選取輸入法"</string>
+    <string name="fast_scroll_alphabet">"ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="fast_scroll_numeric_alphabet">"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="candidates_style"><font fgcolor="#ff000000" bgcolor="#ff8080ff"><u>"candidates"</u>"u&gt;"</font></string>
+</resources>
index ee0db1d..1704179 100644 (file)
             <!-- Don't display the soft input area, there is no reason to
                  do so on this window. -->
             <flag name="stateHidden" value="2" />
-            <!-- Make the soft input area visible when this window is
-                 first displayed. -->
-            <flag name="stateFirstVisible" value="3" />
-            <!-- The soft input area should always be displayed while in this
-                 window. -->
-            <flag name="stateVisible" value="4" />
+            <!-- Make the soft input area visible when normally appropriate
+                 (when the user is navigating forward to your window). -->
+            <flag name="stateVisible" value="3" />
+            <!-- Always make the soft input area visible when this window
+                 has input focus. -->
+            <flag name="stateAlwaysVisible" value="4" />
             
             <!-- The window resize/pan adjustment has not been specified,
                  the system will automatically select between resize and pan
             <enum name="outsideInset" value="0x03000000" />
         </attr>
         
+        <!-- Set this if the view will serve as a scrolling container, meaing
+             that it can be resized to shrink its overall window so that there
+             will be space for an input method.  If not set, the default
+             value will be true if "scrollbars" has the vertical scrollbar
+             set, else it will be false. -->
+        <attr name="isScrollContainer" format="boolean" />
+        
         <!-- Sets the width of vertical scrollbars and height of horizontal scrollbars. -->
         <attr name="scrollbarSize" format="dimension" />
         <!-- Defines the horizontal scrollbar thumb drawable. -->
     <declare-styleable name="Animation">
         <!-- Defines the interpolator used to smooth the animation movement in time. -->
         <attr name="interpolator" />
+        <!-- When set to true, fillAfter is taken into account. -->
+        <attr name="fillEnabled" format="boolean" />
         <!-- When set to true, the animation transformation is applied before the animation has
-             started. The default value is true. -->
+             started. The default value is true. If fillEnabled is not set to true, fillBefore
+             is assumed to be true. -->
         <attr name="fillBefore" format="boolean" />
         <!-- When set to true, the animation transformation is applied after the animation is
-             over. The default value is false. -->
+             over. The default value is false. If fillEnabled is not set to true and the animation
+             is not set on a View, fillAfter is assumed to be true. -->
         <attr name="fillAfter" format="boolean" />
         <!-- Amount of time (in milliseconds) for the animation to run. -->
         <attr name="duration" />
 
         <!-- Layout resource for popup keyboards -->
         <attr name="popupLayout" format="reference" />
+        
+        <attr name="shadowColor" />
+        <attr name="shadowRadius" />
     </declare-styleable>
     
     <declare-styleable name="KeyboardViewPreviewState">
index ef678e7..cb364e6 100644 (file)
   <public type="attr" name="keyLabel" id="0x01010251" />
   <public type="attr" name="keyIcon" id="0x01010252" />
   <public type="attr" name="keyboardMode" id="0x01010253" />
+  <public type="attr" name="isScrollContainer" id="0x01010254" />
+  <public type="attr" name="fillEnabled" id="0x01010255" />
 
   <!-- The part of the UI shown by an
        {@link android.inputmethodservice.InputMethodService} that contains the
   <public type="drawable" name="ic_menu_refresh" id="0x010800a2" />
   <public type="drawable" name="ic_menu_notifications" id="0x010800a3" />
 </resources>
-
-
-
index 851a557..bc300c3 100644 (file)
         <item name="android:labelTextSize">14sp</item>
         <item name="android:popupLayout">@android:layout/keyboard_popup_keyboard</item>
         <item name="android:verticalCorrection">-10dip</item>
+        <item name="android:shadowColor">#BB000000</item>
+        <item name="android:shadowRadius">2.75</item>
     </style>
 </resources>
diff --git a/data/localization/export-to-xlb b/data/localization/export-to-xlb
new file mode 100755 (executable)
index 0000000..323f6b7
--- /dev/null
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+mkdir -p /tmp/Maps/res/values
+
+P4PORT=perforce3:3666 p4 print -q //depot/branches/gmm_android_1_1_release_branch/googleclient/wireless/android/Maps/res/values/strings.xml > /tmp/Maps/res/values/strings.xml
+
+extract()
+{
+    module=$1
+    xlb=$2
+    map=""
+
+    shift; shift
+
+    while [ "$1" = '-m' ]
+    do
+        map="$map $1 $2 $3"
+        shift; shift; shift
+    done
+
+    files=$(
+        for i in $*
+        do
+            find $i -name '*.xml' -print0 |
+            xargs -0 grep -l '<string' |
+            grep -v -e '-[a-z][a-z]/' |
+            grep -v -e '-[a-z][a-z]-' |
+            grep -v -e '-r[A-Z][A-Z]/' |
+            grep -v -e '-r[A-Z][A-Z]-'
+        done
+    )
+
+    ../../../../out/host/linux-x86/bin/transconsole $map -p $module $files > ${xlb}.xlb
+}
+
+. ./tc-files
index 0048e80..15b060a 100755 (executable)
@@ -1,7 +1,5 @@
 #!/bin/sh
 
-locale=it
-
 extract()
 {
     module=$1
@@ -50,6 +48,9 @@ extract()
     done
 }
 
+for locale in fr it es de nl cs pl ja zh-TW zh-CN ru
+do
+
 extract AndroidAlarmClock ../../../../packages/apps/AlarmClock ../../apps/AlarmClock ../../../../packages/apps/AlarmClock
 extract AndroidBrowser ../../../../packages/apps/Browser ../../apps/Browser ../../../../packages/apps/Browser
 extract AndroidCalculator ../../../../packages/apps/Calculator ../../apps/Calculator ../../../../packages/apps/Calculator
@@ -83,4 +84,6 @@ extract AndroidVending ../../../../vendor ../../partner ../../../../vendor/googl
 extract AndroidVoiceDialer ../../../../packages/apps/VoiceDialer ../../apps/VoiceDialer ../../../../packages/apps/VoiceDialer
 extract AndroidYoutube ../../../../vendor ../../partner ../../../../vendor/google/apps/YouTube
 
+done
+
 exit 0
diff --git a/data/localization/tc-files b/data/localization/tc-files
new file mode 100644 (file)
index 0000000..5b32cb4
--- /dev/null
@@ -0,0 +1,33 @@
+# TC-project XLB-file Newmap Oldmap Name...
+
+extract AndroidAlarmClock AlarmClock -m ../../../../packages/apps/AlarmClock ../../apps/AlarmClock ../../../../packages/apps/AlarmClock
+extract AndroidBrowser Browser -m ../../../../packages/apps/Browser ../../apps/Browser ../../../../packages/apps/Browser
+extract AndroidCalculator Calculator -m ../../../../packages/apps/Calculator ../../apps/Calculator ../../../../packages/apps/Calculator
+extract AndroidCalendar Calendar -m ../../../../packages/apps/Calendar ../../apps/Calendar ../../../../packages/apps/Calendar
+extract AndroidCamera Camera -m ../../../../packages/apps/Camera ../../apps/Camera ../../../../packages/apps/Camera
+extract AndroidContacts Contacts -m ../../../../packages/apps/Contacts ../../apps/Contacts ../../../../packages/apps/Contacts
+extract AndroidDownloads Downloads -m ../../../../packages/providers/DownloadProvider ../../content/providers/downloads ../../../../packages/providers/DownloadProvider
+extract AndroidDrm Drm -m ../../../../packages/providers/DrmProvider ../../content/providers/drm ../../../../packages/providers/DrmProvider
+extract AndroidEmail Email -m ../../../../packages/apps/Email ../../apps/Email ../../../../packages/apps/Email
+extract AndroidFallback Fallback -m ../../../../development/apps/Fallback ../../apps/Fallback ../../../../development/apps/Fallback
+extract AndroidGmail Gmail -m ../../../../vendor ../../partner ../../../../vendor/google/providers/gmail ../../../../vendor/google/apps/Gmail
+extract AndroidGoogleApps GoogleApps -m ../../../../vendor ../../partner ../../../../vendor/google/apps/GoogleApps
+extract AndroidGoogleSearch GoogleSearch -m ../../../../packages/apps/GoogleSearch ../../apps/GoogleSearch ../../../../packages/apps/GoogleSearch
+extract AndroidHome Home -m ../../../../packages/apps/Launcher ../../apps/Home ../../../../packages/apps/Launcher
+extract AndroidIM IM -m ../../../../packages/apps/IM ../../apps/IM ../../../../packages/apps/IM
+#extract AndroidMaps Maps -m ../../../../vendor ../../partner -m /home/build/googleclient/wireless/android ../../partner/google/apps /home/build/googleclient/wireless/android/Maps ../../../../vendor/google/apps/Street
+extract AndroidMaps Maps -m ../../../../vendor ../../partner -m /tmp/Maps ../../partner/google/apps/Maps /tmp/Maps ../../../../vendor/google/apps/Street
+extract AndroidMms Mms -m ../../../../packages/apps/Mms ../../apps/Mms ../../../../packages/apps/Mms
+extract AndroidMusic Music -m ../../../../packages/apps/Music ../../apps/Music ../../../../packages/apps/Music
+extract AndroidPhone Phone -m ../../../../packages/apps/Phone ../../apps/Phone ../../../../packages/apps/Phone
+extract AndroidPlatform AndroidSystem -m ../../../../frameworks/base/core/res ../../apps/common ../../../../frameworks/base/core/res
+extract AndroidSettings Settings -m ../../../../packages/apps/Settings ../../apps/Settings ../../../../packages/apps/Settings
+extract AndroidSetupWizard SetupWizard -m ../../../../vendor ../../partner ../../../../vendor/google/apps/SetupWizard
+extract AndroidSoundRecorder SoundRecorder -m ../../../../packages/apps/SoundRecorder ../../apps/SoundRecorder ../../../../packages/apps/SoundRecorder
+extract AndroidStk Stk -m ../../../../packages/apps/Stk ../../apps/Stk ../../../../packages/apps/Stk
+extract AndroidSync Sync -m ../../../../packages/apps/Sync ../../apps/Sync ../../../../packages/apps/Sync
+extract AndroidTalk Talk -m ../../../../vendor ../../partner ../../../../vendor/google/apps/Talk
+extract AndroidUpdater Updater -m ../../../../packages/apps/Updater ../../apps/Updater ../../../../packages/apps/Updater
+extract AndroidVending Vending -m ../../../../vendor ../../partner ../../../../vendor/google/apps/Vending
+extract AndroidVoiceDialer VoiceDialer -m ../../../../packages/apps/VoiceDialer ../../apps/VoiceDialer ../../../../packages/apps/VoiceDialer
+extract AndroidYoutube YouTube -m ../../../../vendor ../../partner ../../../../vendor/google/apps/YouTube
diff --git a/data/localization/xlb-merge b/data/localization/xlb-merge
new file mode 100755 (executable)
index 0000000..d62ca58
--- /dev/null
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+for i in *.xlb
+do
+    perl -e '
+        print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+        print "<localizationbundle locale=\"en\">\n";
+
+        while (<>) {
+            if (/<msg/) {
+                $content = $_;
+            } else {
+                $content .= $_;
+            }
+
+            if (/<\/msg>/) {
+                $content1 = $content;
+                $content1 =~ s/desc="[^"]*"//;
+
+                unless ($seen{$content1}) {
+                    print "$content";
+                }
+
+                $seen{$content1} = 1;
+                $content = "";
+            }
+        }
+
+        print "</localizationbundle>\n";
+    ' $i ../../../../../../platform-1_0/device/data/localization/$i > /android/depot/googleclient/wireless/data/Android/$i
+done
index 10fb66f..a604df2 100644 (file)
@@ -1,7 +1,23 @@
-page.title=Debugging
+page.title=Debugging Tasks
 @jd:body
 
-<p>Android has a fairly extensive set of tools to help you debug your programs: </p>
+<div id="qv-wrapper">
+<div id="qv">
+  <h2>In this document</h2>
+  <ol>
+    <li><a href="#tools">Tools</a></li>
+    <li><a href="#additionaldebugging">Debug and Test Settings</a></li>
+    <li><a href="#toptips">Top Debugging Tips</a></li>
+    <li><a href="#ide-debug-port">Configuring Your IDE to Attach to the Debugging Port</a></li>
+  </ol>
+</div>
+</div>
+
+<p>This document offers some helpful guidance to debugging applications on Android.
+
+
+<h2 id="tools">Tools</h2>
+<p>The Android SDK includes a fairly extensive set of tools to help you debug your programs: </p>
 <ul>
     <li><a href="{@docRoot}guide/developing/tools/ddms.html"><strong>DDMS</strong></a> - A graphical program that
         supports port forwarding (so you can set up breakpoints in your code in your
@@ -48,13 +64,12 @@ D/ActivityManager( 763): Stopping: HistoryRecord{409dbb20 com.android.home.AllAp
     of the doc to figure out why your application isn't appearing on the emulator,
     or why it's not starting. </p>
 
-<a name="additionaldebugging" id="additionaldebugging"></a>
 
-<h2>Debug and Test Settings on the Device</h2>
+<h2 id="additionaldebugging">Debug and Test Settings</h2>
 
-<p>Android lets you set a number of settings that will make it easier to test
-    and debug your applications. To get to the development settings page on the emulator,
-    go to <strong>Dev Tools </strong>&gt; <strong>Development Settings</strong>.
+<p>With the <strong>Dev Tools</strong> application, you can turn on a number of settings that will make it easier to test
+    and debug your applications. To get to the development settings page on the emulator, launch the
+    <strong>Dev Tools</strong> application and open <strong>Development Settings</strong>.
     This will open the development settings page with the following options (among
     others):</p>
 <ul>
@@ -97,10 +112,7 @@ D/ActivityManager( 763): Stopping: HistoryRecord{409dbb20 com.android.home.AllAp
 </ul>
 <p>These settings will be remembered across emulator restarts. </p>
 
-<a name="toptips" id="toptips"></a>
-
-
-<h2>Top Debugging Tips</h2>
+<h2 id="toptips">Top Debugging Tips</h2>
 <!--
 <ul>
     <li><a href="#stackdump">Quick stack dump</a></li>
@@ -177,7 +189,7 @@ shell on the emulator. See <a href="{@docRoot}guide/developing/tools/adb.html">U
     util.Log} and {@link android.os.Debug} for your convenience. </dd>
 </dl>
 
-<h2 id="ide-debug-port">Configuring your IDE to attach to the debugging port</h2>
+<h2 id="ide-debug-port">Configuring Your IDE to Attach to the Debugging Port</h2>
 
 <p>DDMS will assign a specific debugging port to every virtual machine that it
     finds on the emulator. You must either attach your IDE to that
diff --git a/docs/html/guide/developing/device.jd b/docs/html/guide/developing/device.jd
new file mode 100644 (file)
index 0000000..b723797
--- /dev/null
@@ -0,0 +1,151 @@
+page.title=Developing on a Device
+@jd:body
+
+<div id="qv-wrapper">
+<div id="qv">
+  <h2>In this document</h2>
+  <ol>
+    <li><a href="#devices">Available Devices</a>
+      <ol>
+        <li><a href="g1">T-Mobile G1</a></li>
+        <li><a href="dev-phone-1">Android Dev Phone 1</a></li>
+      </ol>
+    </li>
+    <li><a href="#setting-up">Setting up a Device for Development</a></li>
+  </ol>
+</div>
+</div>
+
+<p>When building mobile applications, it's vital to test them on real
+devices prior to releasing them to users. This page covers what you need to know, 
+including the types of devices that you can use, and how to set one up for
+developing and debugging.</p>
+
+
+<h2 id="devices">Available Devices</h2>
+<p>While developers can use regular
+consumer devices purchased at retail to test and use their apps, some developers
+may choose not to use a retail device, preferring an unlocked or no-contract
+device. Here are some options for obtaining devices capable of testing your applications.</p>
+
+
+<h3 id="g1">T-Mobile G1</h3>
+
+<p>The T-Mobile G1 device makes an excellent development device. You can write
+applications in the SDK and install them on the G1, then run them as users
+would, using the same hardware, system, and network.</p>
+
+<p>For more information about obtaining a G1, visit the <a
+href="http://www.t-mobileg1.com">T-Mobile G1 site</a>. </p>
+
+
+<h3 id="dev-phone-1">Android Dev Phone 1</h3>
+
+<div class="sidebox">
+<p>Selected specs for Android Dev Phone 1: </p>
+<ul>
+<li>Touch screen</li>
+<li>Trackball</li>
+<li>3.2 megapixel camera with autofocus</li>
+<li>Wi-Fi</li>
+<li>GPS-enabled</li>
+<li>Bluetooth v2.0
+    <ul><li>Handsfree profile v1.5</li>
+        <li>Headset profile v1.0</li></ul></li>
+<li>3G WCDMA (1700/2100 MHz)</li>
+<li>Quad-band GSM (850/900/1800/1900 MHz)</li>
+<li>QWERTY slider keyboard</li>
+<li>Includes 1GB MicroSD card (can be replaced with up to 16GB card)</li>
+</ul>
+</div> 
+
+<p>The Android Dev Phone 1 is a SIM-unlocked and hardware-unlocked device that
+is designed for advanced developers. The device ships with a system image that
+is fully compatible with Android 1.0, so you can rely on it when developing your
+applications. You can use any SIM in the device and can flash custom Android
+builds that will work with the unlocked bootloader. Unlike the bootloader on
+retail devices, the bootloader on the Android Dev Phone 1 does not enforce
+signed system images. The Android Dev Phone 1 should also appeal to developers 
+who live outside of T-Mobile geographies. </p>
+
+<p>To purchase an Android Dev Phone 1 device, you must first register as an
+Android developer on the Android Market site, if you haven't done so already.
+Once you've logged into your developer account on Android Market, you can
+purchase the device by clicking the "Purchase" link. To accommodate demand,
+there is a limit of 1 device per developer account, for now.</p>
+
+<p>The device currently costs $399 (USD) (including free shipping in the US),
+and will be available for purchase in 18 international markets, including the
+US, UK, Germany, Japan, India, Canada, France, Taiwan, Spain, Australia,
+Singapore, Switzerland, Netherlands, Austria, Sweden, Finland, Poland, and
+Hungary.  We will continue to expand this program into new geographies over
+time.  Check this page for updated information.</p>
+
+<p>Note that Android Dev Phone 1 devices are <em>not</em> intended for
+non-developer end users. Since the devices can be configured with system
+software not provided by or supported by Google or any other company, end users
+operate these devices at their own risk.</p>
+
+<p>For full device specs and more information about obtaining an Android Dev 
+Phone 1 device, see the <a href="http://market.android.com/publish">Android 
+Market</a> site.</p>
+
+
+<h2 id="setting-up">Setting up a Device for Development</h2>
+
+<p>With a T-mobile G1 or Android Dev Phone 1, you can develop and debug your Android applications just as you
+would on the emulator. There are just a few things to do before you can start.</p>
+<ol>
+  <li>Declare your application as "debuggable" in your Android Manifest.
+    <p>In Eclipse, you can do this from the <b>Application</b> tab when viewing the Manifest
+    (on the right side, set <b>Debuggable</b> to <em>true</em>). Otherwise, in the <code>AndroidManifest.xml</code>
+
+    file, add <code>android:debuggable="true"</code> to the <code>&lt;application></code> element.</p>
+  </li>
+  <li>Turn on "USB Debugging" on your device.
+    <p>On the device, go to the home screen, press <b>MENU</b>, select <b>Applications</b> > <b>Development</b>,
+    then enable <b>USB debugging</b>.</p>
+
+  </li>
+  <li>Setup your system to detect your device.
+    <ul>
+      <li>If you're developing on Windows (32-bit only), you need to install the USB driver for adb:
+        <ol>
+          <li>Download the driver ZIP file 
+          (<a href="http://dl.google.com/android/android_usb_windows.zip">android_usb_windows.zip</a>)
+          and unzip it.</li>
+          <li>Connect your Android device via USB. When the <em>Found New Hardware Wizard</em> appears, you'll be asked if you'd like Windows Update to search for software, select <em>No, not this time</em> and click <b>Next</b>.</li>
+
+          <li>Select <em>Install from a list or specified location</em> and click <b>Next</b>.</li>
+          <li>Select <em>Search for the best driver in these locations</em>. Browse and select the unzipped file.</li>
+          <li>Click <b>Finish</b>. You're all set.</li>
+
+        </ol>
+      </li>
+      <li>If you're developing on Mac OS X, it just works. Skip this step.</li>
+      <li>If you're developing on Ubuntu Linux, you need to add a rules file:
+        <ol>
+          <li>Login as root and create this file: <code>/etc/udev/rules.d/50-android.rules</code>.
+            <p>For Gusty/Hardy, edit the file to read: <br/>
+              <code>SUBSYSTEM=="usb", SYSFS{idVendor}=="0bb4", MODE="0666"</code></p>
+
+            <p>For Dapper, edit the file to read: <br/>
+              <code>SUBSYSTEM=="usb_device", SYSFS{idVendor}=="0bb4", MODE="0666"</code></p>
+          </li>
+          <li>Now execute:<br/>
+              <code>chmod a+rx /etc/udev/rules.d/50-android.rules</code>
+          </li>
+        </ol>
+
+      </li>
+    </ul>
+  </li>
+</ol>
+<p>You can verify that your device is connected by executing <code>adb devices</code> from your 
+SDK tools/ directory. If connected, you'll see the device name listed as a "device."</p>
+<p>If using Eclipse, select run or debug as usual. You will be presented
+with a <b>Device Chooser</b> dialog that lists the available emulator(s) and connected device(s).
+Select the device to install and run the application there.</p>
+
+<p>If using the <a href="{@docRoot}guide/developing/tools/adb.html">Android Debug Bridge</a> (adb), 
+you can issue commands with the <code>-d</code> flag to target your connected device.</p>
index 577641c..3e01172 100644 (file)
@@ -44,7 +44,7 @@
     </ul>
     <ul>
       <li class="toggle-list">
-        <div><a href="<?cs var:toroot ?>guide/topics/graphics/index.html">2D and 3D Graphics</a></div>
+        <div><a href="<?cs var:toroot ?>guide/topics/graphics/index.html">Graphics</a></div>
           <ul>
             <li><a href="<?cs var:toroot ?>guide/topics/graphics/2d-graphics.html">2D Graphics</a></li>
             <li><a href="<?cs var:toroot ?>guide/topics/graphics/opengl.html">3D with OpenGL</a></li>
@@ -78,6 +78,7 @@
 
       <li><a href="<?cs var:toroot ?>guide/developing/eclipse-adt.html">In Eclipse, with ADT</a></li>
       <li><a href="<?cs var:toroot ?>guide/developing/other-ide.html">In Other IDEs</a></li>
+      <li><a href="<?cs var:toroot ?>guide/developing/device.html">On a Device</a></li>
       <li><a href="<?cs var:toroot ?>guide/developing/debug-tasks.html">Debugging Tasks</a></li>
       <li class="toggle-list">
         <div><a href="<?cs var:toroot ?>guide/developing/tools/index.html">Tools</a></div>
index c59d3a8..7ba9e52 100644 (file)
@@ -29,6 +29,7 @@ parent.link=index.html
       </ol>
     </li>
     <li><a href="#animation">Animation</a></li>
+    <li><a href="#menus">Menus</a></li>
     <li><a href="#layoutresources">Layout</a>
       <ol>
           <li><a href="#customresources">Custom Layout Resources</a>
@@ -95,10 +96,10 @@ XML files such as <a href="#layoutresources">layouts</a>.</p>
 </p>
 <ul>
     <li>
-        <strong>Java</strong> <code>R.color.<em>some_name</em></code>
+        <strong>Java:</strong> <code>R.color.<em>some_name</em></code>
     </li>
     <li>
-        <strong>XML</strong> <code>@[<em>package</em>:]color/some_name</code> (where <em>some_name</em> is the <em>name</em> of a specific color)
+        <strong>XML:</strong> <code>@[<em>package</em>:]color/some_name</code> (where <em>some_name</em> is the <em>name</em> of a specific color)
     </li>
 </ul>
 <p>
@@ -192,10 +193,10 @@ tags.
 </p>
 <ul>
     <li>
-        <strong>Java</strong> <code>R.string.<em>some_name</em></code>
+        <strong>Java:</strong> <code>R.string.<em>some_name</em></code>
     </li>
     <li>
-        <strong>XML</strong> <code>@[<em>package</em>:]string/some_name</code> (where <em>some_name</em> is the <em>name</em> of a specific string)
+        <strong>XML:</strong> <code>@[<em>package</em>:]string/some_name</code> (where <em>some_name</em> is the <em>name</em> of a specific string)
     </li>
 </ul>
 <p>
@@ -347,10 +348,10 @@ dimension.</p>
 </p>
 <ul>
     <li>
-        <strong>Java</strong> <code>R.dimen.<em>some_name</em></code>
+        <strong>Java:</strong> <code>R.dimen.<em>some_name</em></code>
     </li>
     <li>
-        <strong>XML</strong> <code>@[<em>package</em>:]dimen/<em>some_name</em></code> (where <em>some_name</em> is the <em>name</em> of a specific <code>&lt;dimen&gt;</code> element)
+        <strong>XML:</strong> <code>@[<em>package</em>:]dimen/<em>some_name</em></code> (where <em>some_name</em> is the <em>name</em> of a specific <code>&lt;dimen&gt;</code> element)
     </li>
 </ul>
 <p>
@@ -433,10 +434,10 @@ res/drawable/my_picture.png would be referenced as R.drawable.my_picture).</p>
 </p>
 <ul>
     <li>
-        <strong>Java</strong> <code>R.drawable.<em>some_file</em></code>
+        <strong>Java:</strong> <code>R.drawable.<em>some_file</em></code>
     </li>
     <li>
-        <strong>XML</strong> <code>@[<em>package</em>:]drawable/<em>some_file</em></code>
+        <strong>XML:</strong> <code>@[<em>package</em>:]drawable/<em>some_file</em></code>
     </li>
 </ul>
 
@@ -462,10 +463,10 @@ version="1.0" encoding="utf-8"?&gt;</code> declaration, and a root
 </p>
 <ul>
     <li>
-        <strong>Java</strong>  <code>R.drawable.<em>some_name</em></code>
+        <strong>Java:</strong>  <code>R.drawable.<em>some_name</em></code>
     </li>
     <li>
-        <strong>XML</strong>  <code>@[<em>package</em>:]drawable/<em>some_name</em></code>  (where <em>some_name</em> is the name of a specific resource)
+        <strong>XML:</strong>  <code>@[<em>package</em>:]drawable/<em>some_name</em></code>  (where <em>some_name</em> is the name of a specific resource)
     </li>
 </ul>
 <p>
@@ -549,10 +550,10 @@ tv.setBackground(redDrawable);
 </p>
 <ul>
     <li>
-        <strong>Java</strong> <code>R.drawable.<em>some_file</em></code>
+        <strong>Java:</strong> <code>R.drawable.<em>some_file</em></code>
     </li>
     <li>
-        <strong>XML</strong> <code>@[<em>package</em>:]drawable.<em>some_file</em></code>
+        <strong>XML:</strong> <code>@[<em>package</em>:]drawable.<em>some_file</em></code>
     </li>
 </ul>
 
@@ -582,10 +583,10 @@ in <a href="{@docRoot}guide/topics/graphics/2d-graphics.html#nine-patch">2D Grap
 </p>
 <ul>
     <li>
-        <strong>Java</strong> <code>R.anim.<em>some_file</em></code>
+        <strong>Java:</strong> <code>R.anim.<em>some_file</em></code>
     </li>
     <li>
-        <strong>XML</strong> <code>@[<em>package</em>:]anim/<em>some_file</em></code>
+        <strong>XML:</strong> <code>@[<em>package</em>:]anim/<em>some_file</em></code>
     </li>
 </ul>
 <p>
@@ -624,7 +625,10 @@ in <a href="{@docRoot}guide/topics/graphics/2d-graphics.html#nine-patch">2D Grap
         &lt;set&gt;
     </dt>
     <dd>
-        The outermost tag, which can recursively hold itself or other animations. You can include as many child elements of the same or different types as you like. Supports the following attribute:
+        A container that can recursively hold itself or other animations.
+        Represents an {@link android.view.animation.AnimationSet}. 
+        You can include as many child elements of the same or different types as you like. 
+        Supports the following attribute:
         <ul>
             <li>
                 <em>shareInterpolator</em> - Whether to share the same Interpolator among all immediate child elements.
@@ -635,7 +639,8 @@ in <a href="{@docRoot}guide/topics/graphics/2d-graphics.html#nine-patch">2D Grap
         &lt;alpha&gt;
     </dt>
     <dd>
-        A fading animation, compiled to {@link android.view.animation.AlphaAnimation}. Supports the following attributes:
+        A fading animation. Represents an {@link android.view.animation.AlphaAnimation}. 
+        Supports the following attributes:
         <ul>
             <li>
                 <em>fromAlpha</em> - 0.0 to 1.0, where 0.0 is transparent.
@@ -649,7 +654,8 @@ in <a href="{@docRoot}guide/topics/graphics/2d-graphics.html#nine-patch">2D Grap
         &lt;scale&gt;
     </dt>
     <dd>
-        A resizing animation, compiled to {@link android.view.animation.ScaleAnimation}. You can specify what is the center point of the image (the pinned center), from which it grows outward (or inward), by specifying pivotX and pivotY. So, for example, if these were 0, 0 (top left corner), all growth would be down and to the right. <code>scale</code> supports the following attributes:
+        A resizing animation. Represents a {@link android.view.animation.ScaleAnimation}.
+         You can specify what is the center point of the image (the pinned center), from which it grows outward (or inward), by specifying pivotX and pivotY. So, for example, if these were 0, 0 (top left corner), all growth would be down and to the right. <code>scale</code> supports the following attributes:
         <ul>
             <li>
                 <em>fromXScale</em> - Starting X size, where 1.0 is no change.
@@ -675,7 +681,8 @@ in <a href="{@docRoot}guide/topics/graphics/2d-graphics.html#nine-patch">2D Grap
         &lt;translate&gt;
     </dt>
     <dd>
-        A motion animation that moves a visual element within its parent element. It is equivalent to {@link android.view.animation.TranslateAnimation}. 
+        A vertical/horizontal motion animation.
+        Represents a {@link android.view.animation.TranslateAnimation}. 
 Supports the following attributes in any of the following three formats: values from -100 to 100, ending with "%", indicating a percentage relative to itself; values from -100 to 100, ending in "%p", indicating a percentage relative to its parent; a float with no suffix, indicating an absolute value.
         <ul>
             <li>
@@ -696,7 +703,8 @@ Supports the following attributes in any of the following three formats: values
         &lt;rotate&gt;
     </dt>
     <dd>
-        A rotation animation, compiled to {@link android.view.animation.RotateAnimation}. Supports the following attributes:
+        A rotation animation. Represents a {@link android.view.animation.RotateAnimation}.
+         Supports the following attributes:
         <ul>
             <li>
                 <em>fromDegrees</em> - Starting rotation, in degrees.
@@ -720,43 +728,133 @@ Supports the following attributes in any of the following three formats: values
     </dd>
 </dl>
 <p>
-    Note that alpha, scale, rotate, translate all support the following attributes from the base animation class, BaseAnimation:
+In addition to the attributes defined for each element above, the elements 
+<code>&lt;alpha&gt;</code>, <code>&lt;scale&gt;</code>, <code>&lt;translate&gt;</code>,
+<code>&lt;rotate&gt;</code>, and <code>&lt;set></code> all support the following attributes (inherited
+from the {@link android.view.animation.Animation} class):
 </p>
 <dl>
-    <dt>
-        <em>duration</em>
-    </dt>
+    <dt><em>{@link android.R.attr#duration duration}</em></dt>
     <dd>
-        Duration, in milliseconds, for this effect.
+        Duration, in milliseconds, for this effect. 
     </dd>
-    <dt>
-        <em>startOffset</em>
-    </dt>
+    <dt><em>{@link android.R.attr#startOffset startOffset}</em></dt>
     <dd>
-        Offset start time for this effect, in milliseconds.
+        Offset start time for this effect, in milliseconds. 
     </dd>
-    <dt>
-        <em>fillBefore</em>
-    </dt>
+    <dt><em>{@link android.R.attr#fillBefore fillBefore}</em></dt>
     <dd>
-        Equivalent to {@link android.view.animation.Animation#setFillBefore animation.Animation.setFillBefore()}.
+        When set true, the animation transformation is applied before the animation begins.
     </dd>
-    <dt>
-        <em>fillAfter</em>
-    </dt>
+    <dt><em>{@link android.R.attr#fillAfter fillAfter}</em></dt>
     <dd>
-        Equivalent to {@link android.view.animation.Animation#setFillAfter animation.Animation.setFillAfter()}.
+        When set true, the animation transformation is applied after the animation ends.
     </dd>
-    <dt>
-        <em>interpolator</em>
-    </dt>
+    <dt><em>{@link android.R.attr#repeatCount repeatCount}</em></dt>
+    <dd>
+        Defines the number of times the animation should repeat.
+    </dd>
+    <dt><em>{@link android.R.attr#repeatMode repeatMode}</em></dt>
+    <dd>
+        Defines the animation behavior when it reaches the end and the repeat count is greater than 0.
+        Options are to either restart or reverse the animation.
+    </dd>
+    <dt><em>{@link android.R.attr#zAdjustment zAdjustment}</em></dt>
+    <dd>
+        Defines the z-axis ordering mode to use when running the animation (normal, top, or bottom).
+    </dd>
+    <dt><em>{@link android.R.attr#interpolator interpolator}</em></dt>
     <dd>
         You can optionally set an interpolator for each element to determine how quickly or slowly it performs its effect over time. For example, slow at the beginning and faster at the end for EaseInInterpolator, and the reverse for EaseOutInterpolator. A list of interpolators is given in {@link android.R.anim}. To specify these, use the syntax @android:anim/<em>interpolatorName</em>.
     </dd>
 </dl>
 
-<p>For animation code samples, see the discussion in the 
-<a href="{@docRoot}guide/topics/graphics/2d-graphics.html">2D Graphics</a> topic.</p>
+<p>For more discussion and animation code samples, see the discussion in the 
+<a href="{@docRoot}guide/topics/graphics/2d-graphics.html#tween-animation">2D Graphics</a> document.</p>
+
+
+
+<h2 id="menus">Menus</h2>
+<p>Application menus (Options Menu, Context Menu, or Sub Menu) can be defined as
+XML resources and inflated by your application using {@link android.view.MenuInflater}.</p>
+
+<p><strong>Source file format:</strong> XML file, one resource per file, one root tag, 
+<code>&lt;?xml></code> declaration not required.</p>
+<p><strong>Resource file location:</strong> res/menu/<em>some_file</em>.xml</p>
+<p><strong>Compiled resource datatype:</strong> Resource pointer to a {@link android.view.Menu} (or subclass) resource.</p>
+<p><strong>Resource reference name:</strong> </p>
+<ul><li><strong>Java:</strong> <code>R.menu.<em>some_file</em></code></li></ul>
+
+<h3>Syntax</h3>
+<p>The file must have a single root element: a <code>&lt;menu></code> element. In all,
+there are three valid elements: <code>&lt;menu></code>, <code>&lt;group></code> and <code>&lt;item></code>. The
+<code>&lt;item></code> and <code>&lt;group></code> elements must be the children of a <code>&lt;menu></code>, but <code>&lt;item></code>
+elements can also be the children of a <code>&lt;group></code>, and another <code>&lt;menu></code> element may be the child
+of an <code>&lt;item></code> (to create a Sub Menu).</p>
+<pre>
+&lt;menu xmlns:android="http://schemas.android.com/apk/res/android">
+
+    &lt;item android:id="@+id/<em>example_item</em>
+          android:title="<em>Example Item</em>"
+          android:icon="<em>@drawable/example_item_icon</em>" />
+
+    &lt;group android:id="@+id/<em>example_group</em>">
+        &lt;item android:id="@+id/<em>example_item2</em>
+              android:title="<em>Example Item 2</em>"
+              android:icon="<em>@drawable/example_item2_icon</em>" />
+    &lt;/group>
+
+    &lt;item android:id="@+id/<em>example_submenu</em>
+          android:title="<em>Example Sub Menu</em>" >
+        &lt;menu>
+            &lt;item android:id="@+id/<em>example_submenu_item</em>
+                  android:title="<em>Example Sub Menu Item</em>" />
+        &lt;/menu>
+    &lt;/item>
+
+&lt;/menu>
+</pre>
+
+<h3>Elements and Attributes</h3>
+<p>All attributes must be defined with the <em>android</em> namespace (e.g., <em>android:icon="@drawable/icon"</em>).</p>
+<dl>
+  <dt>&lt;menu></dt>
+    <dd>The root of a menu. Contains <code>&lt;item></code> and <code>&lt;group></code> nodes. No attributes.</dd>
+  <dt>&lt;group></dt>
+    <dd>A menu group. Contains <code>&lt;item></code> elements. Valid attributes:
+      <ul>
+        <li><em>id</em> - A unique integer ID for the group.</li>
+        <li><em>menuCategory</em> - Value corresponding to Menu CATEGORY_* constants &mdash; defines the priority of the group. Valid values: 
+          <em>container</em>, <em>system</em>, <em>secondary</em>, and <em>alternative</em>.</li>
+        <li><em>orderInCategory</em> - An integer that defines the default order of the items within the category.</li>
+        <li><em>checkableBehavior</em> - Whether the items are checkable. Valid values: 
+          <em>none</em>, <em>all</em> (exclusive / radio buttons), <em>single</em> (non-exclusive / checkboxes)</li>
+        <li><em>visible</em> - Whether the group is visible. <em>true</em> or <em>false</em>.</li>
+        <li><em>enabled</em> - Whether the group is enabled. <em>true</em> or <em>false</em>.</li>
+      </ul>
+    </dd>
+  <dt>&lt;item></dt>
+    <dd>A menu item. May contain a <code>&lt;menu></code> element (for a Sub Menu). Valid attributes:
+      <ul>
+        <li><em>id</em> - A unique resource ID for the item.</li>
+        <li><em>menuCategory</em> - Used to define the menu category.</li>
+        <li><em>orderInCategory</em> - Used to define the order of the item, within a group.</li>
+        <li><em>title</em> - A string for the menu title.</li>
+        <li><em>titleCondensed</em> - A condensed string title, for situations in which the normal title is too long.</li>
+        <li><em>icon</em> - A resource identifier for a drawable icon.</li>
+        <li><em>alphabeticShortcut</em> - A character for the alphabetic shortcut key.</li>
+        <li><em>numericShortcut</em> - A number for the numeric shortcut key.</li>
+        <li><em>checkable</em> - Whether the item is checkable. <em>true</em> or <em>false</em>.</li>
+        <li><em>checked</em> - Whether the item is checked by default. <em>true</em> or <em>false</em>.</li>
+        <li><em>visible</em> - Whether the item is visible by default. <em>true</em> or <em>false</em>.</li>
+        <li><em>enabled</em> - Whether the item is enabled by default. <em>true</em> or <em>false</em>.</li>
+      </ul>
+    </dd>
+</dl>
+
+<p>For more discussion on how to create menus in XML and inflate them in your application, 
+read <a href="{@docRoot}guide/topics/views/menus.html">Creating Menus</a>.</p>
+
 
 
 <h2 id="layoutresources">Layout</h2>
@@ -797,10 +895,10 @@ res/layout/<em>some_file</em>.xml.</p>
 </p>
 <ul>
     <li>
-        <strong>Java</strong> <code>R.drawable.<em>some_file</em></code>
+        <strong>Java:</strong> <code>R.layout.<em>some_file</em></code>
     </li>
     <li>
-        <strong>XML</strong> <code>@[<em>package</em>:]layout/<em>some_file</em></code>
+        <strong>XML:</strong> <code>@[<em>package</em>:]layout/<em>some_file</em></code>
     </li>
 </ul>
 <p>
@@ -996,10 +1094,10 @@ setContentView(R.layout.main_screen);
 </p>
 <ul>
     <li>
-        <strong>Java</strong> <code>R.style.<em>styleID</em></code> for the whole style, <code>R.style.<em>styleID</em>.<em>itemID</em></code> for an individual setting
+        <strong>Java:</strong> <code>R.style.<em>styleID</em></code> for the whole style, <code>R.style.<em>styleID</em>.<em>itemID</em></code> for an individual setting
     </li>
     <li>
-        <strong>XML</strong> <code>@[<em>package</em>:]style/<em>styleID</em></code> for a whole style, <code>@[<em>package</em>:]style/<em>styleID</em>/<em>itemID</em></code> for an individual item. <strong>Note</strong>: to refer to a value in the <em>currently</em> applied theme, use "?" instead of "@" as described below (XML).
+        <strong>XML:</strong> <code>@[<em>package</em>:]style/<em>styleID</em></code> for a whole style, <code>@[<em>package</em>:]style/<em>styleID</em>/<em>itemID</em></code> for an individual item. <strong>Note</strong>: to refer to a value in the <em>currently</em> applied theme, use "?" instead of "@" as described below (XML).
     </li>
 </ul>
 <p>
diff --git a/docs/html/guide/topics/views/menus.jd b/docs/html/guide/topics/views/menus.jd
new file mode 100644 (file)
index 0000000..489cd07
--- /dev/null
@@ -0,0 +1,516 @@
+page.title=Creating Menus
+parent.title=User Interface
+parent.link=index.html
+@jd:body
+
+<div id="qv-wrapper">
+<div id="qv">
+  <h2>In this document</h2>
+  <ol>
+    <li><a href="#options-menu">Options Menu</a></li>
+    <li><a href="#context-menu">Context Menu</a></li>
+    <li><a href="#sub-menu">Sub Menu</a></li>
+    <li><a href="#xml">Define Menus in XML</a></li>
+    <li><a href="#features">Menu Features</a>
+      <ol>
+        <li><a href="#groups">Menu groups</a></li>
+        <li><a href="#checkable">Checkable menu items</a></li>
+        <li><a href="#shortcuts">Shortcut keys</a></li>
+        <li><a href="#intents">Menu item intents</a></li>
+      </ol>
+    </li>
+  </ol>
+</div>
+</div>
+
+<p>Menus are an important part of any application. They provide familiar interfaces
+that reveal application functions and settings. Android offers an easy programming interface
+for developers to provide standardized application menus for various situations.</p>
+
+<p>Android offers three fundamental types of application menus:</p>
+<dl>
+  <dt><strong>Options Menu</strong></dt>
+    <dd>This is the primary set of menu items for an Activity. It is revealed by pressing 
+    the device MENU key. Within the Options Menu are two groups of menu items:
+      <dl style="margin-top:1em">
+        <dt><em>Icon Menu</em></dt>
+          <dd>This is the collection of items initially visible at the bottom of the screen 
+          at the press of the MENU key. It supports a maximum of six menu items.
+          These are the only menu items that support icons and the only menu items that <em>do not</em> support
+          checkboxes or radio buttons.</dd>
+        <dt><em>Expanded Menu</em></dt>
+          <dd>This is a vertical list of items exposed by the "More" menu item from the Icon Menu.
+          It exists only when the Icon Menu becomes over-loaded and is comprised of the sixth 
+          Option Menu item and the rest.</dd>
+      </dl>
+    </dd>
+  <dt><strong>Context Menu</strong></dt>
+    <dd>This is a floating list of menu items that may appear when you perform a long-press on a View 
+    (such as a list item). </dd>
+  <dt><strong>Sub Menu</strong></dt>
+    <dd>This is a floating list of menu items that is revealed by an item in the Options Menu
+    or a Context Menu. A Sub Menu item cannot support nested Sub Menus. </dd>
+</dl>
+
+
+<h2 id="options-menu">Options Menu</h2>
+<img align="right" src="{@docRoot}images/options_menu.png" />
+<p>The Options Menu is opened by pressing the device MENU key.
+When opened, the Icon Menu is displayed, which holds the first six menu items.
+If more than six items are added to the Options Menu, then those that can't fit
+in the Icon Menu are revealed in the Expanded Menu, via the "More" menu item. The Expanded Menu
+is automatically added when there are more than six items.</p>
+
+<p>The Options Menu is where you should include basic application functions
+and any necessary navigation items (e.g., to a home screen or application settings).
+You can also add <a href="#sub-menu">Sub Menus</a> for organizing topics 
+and including extra menu functionality.</p>
+
+<p>When this menu is opened for the first time, 
+the Android system will call the Activity <code>{@link android.app.Activity#onCreateOptionsMenu(Menu)
+onCreateOptionsMenu()}</code> callback method. Override this method in your Activity
+and populate the {@link android.view.Menu} object given to you. You can populate the menu by
+inflating a menu resource that was <a href="#xml">defined in XML</a>, or by calling 
+<code>{@link android.view.Menu#add(CharSequence) add()}</code>
+for each item you'd like in the menu. This method adds a {@link android.view.MenuItem}, and returns the
+newly created object to you. You can use the returned MenuItem to set additional properties like 
+an icon, a keyboard shortcut, an intent, and other settings for the item.</p>
+
+<p>There are multiple <code>{@link android.view.Menu#add(CharSequence) add()}</code> methods.
+Usually, you'll want to use one that accepts an <var>itemId</var> argument. 
+This is a unique integer that allows you to identify the item during a callback.</p>
+
+<p>When a menu item is selected from the Options Menu, you will recieve a callback to the
+<code>{@link android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()}</code> 
+method of your Activity. This callback passes you the 
+<code>MenuItem</code> that has been selected. You can identify the item by requesting the 
+<var>itemId</var>, with <code>{@link android.view.MenuItem#getItemId() getItemId()}</code>,
+which returns the integer that was assigned with the <code>add()</code> method. Once you identify
+the menu item, you can take the appropriate action.</p>
+
+<p>Here's an example of this procedure, inside an Activity, wherein we create an 
+Options Menu and handle item selections:</p>
+
+<pre>
+/* Creates the menu items */
+public boolean onCreateOptionsMenu(Menu menu) {
+    menu.add(0, MENU_NEW_GAME, 0, "New Game");
+    menu.add(0, MENU_QUIT, 0, "Quit");
+    return true;
+}
+
+/* Handles item selections */
+public boolean onOptionsItemSelected(MenuItem item) {
+    switch (item.getItemId()) {
+    case MENU_NEW_GAME:
+        newGame();
+        return true;
+    case MENU_QUIT:
+        quit();
+        return true;
+    }
+    return false;
+}
+</pre>
+
+<p>The <code>add()</code> method used in this sample takes four arguments: 
+<var>groupId</var>, <var>itemId</var>, <var>order</var>, and <var>title</var>.
+The <var>groupId</var> allows you to associate this menu item with a group of other items
+(more about <a href="#groups">Menu groups</a>, below) &mdash; in 
+this example, we ignore it. <var>itemId</var> is a unique integer that we give the 
+MenuItem so that can identify it in the next callback. <var>order</var> allows us to 
+define the display order of the item &mdash; by default, they are displayed by the
+order in which we add them. <var>title</var> is, of course, the name that goes on the 
+menu item (this can also be a 
+<a href="{@docRoot}guide/topics/resources/available-resources.html#stringresources">string resource</a>, 
+and we recommend you do it that way for easier localization).</p>
+
+<p class="note"><strong>Tip:</strong>
+If you have several menu items that can be grouped together with a title, 
+consider organizing them into a <a href="#sub-menu">Sub Menu</a>.</p>
+
+<h3>Adding icons</h3>
+<p>Icons can also be added to items that appears in the Icon Menu with
+<code>{@link android.view.MenuItem#setIcon(Drawable) setIcon()}</code>. For example:</p>
+<pre>
+menu.add(0, MENU_QUIT, 0, "Quit")
+    .setIcon(R.drawable.menu_quit_icon);</pre>
+
+<h3>Modifying the options menu</h3>
+<p>If you want to sometimes re-write the options menu as it is opened, override the 
+<code>{@link android.app.Activity#onPrepareOptionsMenu(Menu) onPrepareOptionsMenu()}</code> method, which is
+called each time the menu is opened. This will pass you the Menu object, just like the 
+<code>onCreateOptionsMenu()</code> callback. This is useful if you'd like to add or remove
+menu options depending on the current state of an application or game.</p>
+
+<p class="note"><strong>Note:</strong> 
+When changing items in the menu, it's bad practice to do so based on the currently selected item.
+Keep in mind that, when in touch mode, there will not be a selected (or focused) item. Instead, you
+should use a <a href="#context-menu">Context Menu</a> for such behaviors, when you want to provide 
+functionality based on a particular item in the UI.</p>
+
+
+<h2 id="context-menu">Context Menu</h2>
+<p>The Android context menu is similar, in concept, to the menu revealed with a "right-click" on a PC. 
+When a view is registered to a context menu, 
+performing a "long-press" (press and hold for about two seconds) on the object
+will reveal a floating menu that provides functions relating to that item. 
+Context menus can be registered to any View object,
+however, they are most often used for items in a 
+{@link android.widget.ListView}, which helpfully indicates the presence of the context menu
+by transforming the background color of the ListView item when pressed.
+(The items in the phone's contact list offer an example of this feature.)
+</p>
+
+<p class="note"><strong>Note:</strong> Context menu items do not support icons or shortcut keys.</p>
+
+<p>To create a context menu, you must override the Activity's context menu callback methods:
+<code>{@link android.app.Activity#onCreateContextMenu(ContextMenu,View,ContextMenuInfo) onCreateContextMenu()}</code> and 
+<code>{@link android.app.Activity#onContextItemSelected(MenuItem) onContextItemSelected()}</code>.
+Inside the <code>onCreateContextMenu()</code> callback method, you can add menu items using one of the 
+<code>{@link android.view.Menu#add(CharSequence) add()}</code> methods, or by 
+inflating a menu resource that was <a href="#xml">defined in XML</a>.
+Then, register a {@link android.view.ContextMenu} for the View, with 
+<code>{@link android.app.Activity#registerForContextMenu(View) registerForContextMenu()}</code>.</p>
+
+<p>For example, here is some code that can be used with the 
+<a href="{@docRoot}guide/tutorials/notepad/index.html">Notepad application</a>
+to add a context menu for each note in the list:</p>
+<pre>
+public void onCreateContextMenu(ContextMenu menu, View v,
+                                ContextMenuInfo menuInfo) {
+  super.onCreateContextMenu(menu, v, menuInfo);
+  menu.add(0, EDIT_ID, 0, "Edit");
+  menu.add(0, DELETE_ID, 0,  "Delete");
+}
+
+public boolean onContextItemSelected(MenuItem item) {
+  AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
+  switch (item.getItemId()) {
+  case EDIT_ID:
+    editNote(info.id);
+    return true;
+  case DELETE_ID:
+    deleteNote(info.id);
+    return true;
+  default:
+    return super.onContextItemSelected(item);
+  }
+}
+</pre>
+
+<p>In <code>onCreateContextMenu()</code>, we are given not only the ContextMenu to
+which we will add {@link android.view.MenuItem}s, but also the {@link android.view.View}
+that was selected and a {@link android.view.ContextMenu.ContextMenuInfo ContextMenuInfo} object,
+which provides additional information about the object that was selected. 
+In this example, nothing special is done in <code>onCreateContextMenu()</code> &mdash; just
+a couple items are added as usual. In the <code>onContextItemSelected()</code>
+callback, we request the {@link android.widget.AdapterView.AdapterContextMenuInfo AdapterContextMenuInfo} 
+from the {@code MenuItem}, which provides information about the currently selected item. 
+All we need from
+this is the list ID for the selected item, so whether editing a note or deleting it, 
+we find the ID with the {@code AdapterContextMenuInfo.info} field of the object. This ID
+is passed to the <code>editNote()</code> and <code>deleteNote()</code> methods to perfrom
+the respective action.</p>
+
+<p>Now, to register this context menu for all the items in a {@link android.widget.ListView},
+we pass the entire {@code ListView} to the 
+<code>{@link android.app.Activity#registerForContextMenu(View)}</code> method:</p>
+
+<pre>registerForContextMenu(getListView());</pre>
+<p>Remember, you can pass any View object to register a context menu. Here,
+<code>{@link android.app.ListActivity#getListView()}</code> returns the ListView
+object used in the Notepad application's {@link android.app.ListActivity}. As such, each item 
+in the list is registered to this context menu.</p>
+
+
+
+<h2 id="sub-menu">Sub Menus</h2>
+<p>A sub menu can be added within any menu, except another sub menu.
+These are very useful when your application has a lot of functions that may be
+organized in topics, like the items in a PC application's menu bar (File, Edit, View, etc.).</p>
+
+<p>A sub menu is created by adding it to an existing {@link android.view.Menu}
+with <code>{@link android.view.Menu#addSubMenu(CharSequence) addSubMenu()}</code>. 
+This returns a {@link android.view.SubMenu} object (an extension of {@link android.view.Menu}). 
+You can then add additional items to this menu, with the normal routine, using
+the <code>{@link android.view.Menu#add(CharSequence) add()}</code> methods. For example:</p>
+
+<pre>
+public boolean onCreateOptionsMenu(Menu menu) {
+  boolean result = super.onCreateOptionsMenu(menu);
+
+  SubMenu fileMenu = menu.addSubMenu("File");
+  SubMenu editMenu = menu.addSubMenu("Edit");
+  fileMenu.add("new");
+  fileMenu.add("open");
+  fileMenu.add("save");
+  editMenu.add("undo");
+  editMenu.add("redo");
+
+  return result;
+}
+</pre>
+<p>Callbacks for items selected in a sub menu are made to the parent menu's callback method. 
+For the example above, selections in the sub menu will be handled by the 
+<code>onOptionsItemSelected()</code> callback.</p>
+<p>You can also add Sub Menus when you <a href="#xml">define the parent menu in XML</a>.</p>
+
+
+<h2 id="xml">Define Menus in XML</h2>
+<p>Just like Android UI layouts, you can define application menus in XML, then inflate them 
+in your menu's <code>onCreate...()</code> callback method. This makes your application code cleaner and
+separates more interface design into XML, which is easier to visualize.</p>
+
+<p>To start, create a new folder in your project <code>res/</code> directory called <code>menu</code>.
+This is where you should keep all XML files that define your application menus.</p>
+
+<p>In a menu XML layout, there are
+three valid elements: <code>&lt;menu></code>, <code>&lt;group></code> and <code>&lt;item></code>. The
+<code>item</code> and <code>group</code> elements must be children of a <code>menu</code>, but <code>item</code>
+elements may also be the children of a <code>group</code>, and another <code>menu</code> element may be the child
+of an <code>item</code> (to create a Sub Menu). Of course, the root node of any file
+must be a <code>menu</code> element.</p>
+
+<p>As an example, we'll define the same menu created in the <a href="#options-menu">Options Menu</a> section, 
+above. We start with an XML file named <code>options_menu.xml</code> inside the <code>res/menu/</code> folder:</p>
+<pre>
+&lt;menu xmlns:android="http://schemas.android.com/apk/res/android">
+    &lt;item android:id="@+id/new_game"
+          android:title="New Game" />
+    &lt;item android:id="@+id/quit"
+          android:title="Quit" />
+&lt;/menu>
+</pre>
+
+<p>Then, in the <code>onCreateOptionsMenu()</code> method, we inflate this resource using
+<code>{@link android.view.MenuInflater#inflate(int,Menu) MenuInflater.inflate()}</code>:</p>
+<pre>
+public boolean onCreateOptionsMenu(Menu menu) {
+    MenuInflater inflater = getMenuInflater();
+    inflater.inflate(R.menu.options_menu, menu);
+    return true;
+}
+</pre>
+
+<p>The <code>{@link android.app.Activity#getMenuInflater()}</code> method returns the {@link android.view.MenuInflater}
+for our activity's context. We then call <code>{@link android.view.MenuInflater#inflate(int,Menu) inflate()}</code>,
+passing it a pointer to our menu resource and the Menu object given by the callback.</code></p>
+
+<p>While this small sample may seem like more effort, compared to creating the menu items in the 
+<code>onCreateOptionsMenu()</code> method, this will save a lot of trouble when dealing with more items
+and it keeps your application code clean.</p>
+
+<p>You can define <a href="#groups">menu groups</a> by wrapping <code>item</code> elements in a <code>group</code>
+element, and create Sub Menus by nesting another <code>menu</code> inside an <code>item</code>.
+Each element also supports all the necessary attributes to control features like shortcut keys,
+checkboxes, icons, and more. To learn about these attributes and more about the XML syntax, see the Menus
+topic in the <a href="{@docRoot}guide/topics/resources/available-resources.html#menus">Available 
+Resource Types</a> document.</p>
+
+<h2 id="features">Menu Features</h2>
+<p>Here are some other features that can be applied to most menu items.</p>
+
+<h3 id="groups">Menu groups</h3>
+<p>When adding new items to a menu, you can optionally include each item in a group.
+A menu group is a collection of menu items that can share certain traits, like
+whether they are visible, enabled, or checkable.</p>
+
+<p>A group is defined by an integer (or a resource id, in XML). A menu item is added to the group when it is
+added to the menu, using one of the <code>add()</code> methods that accepts a <var>groupId</var>
+as an argument, such as <code>{@link android.view.Menu#add(int,int,int,int)}</code>.</p>
+
+<p>You can show or hide the entire group with 
+<code>{@link android.view.Menu#setGroupVisible(int,boolean) setGroupVisible()}</code>; 
+enable or disable the group with 
+<code>{@link android.view.Menu#setGroupEnabled(int,boolean) setGroupEnabled()}</code>;
+and set whether the items can be checkable with
+<code>{@link android.view.Menu#setGroupCheckable(int,boolean,boolean) setGroupCheckable()}</code>.
+</p>
+
+<h3 id="checkable">Checkable menu items</h3>
+<img align="right" src="{@docRoot}images/radio_buttons.png" alt="" />
+<p>Any menu item can be used as an interface for turning options on and off. This can
+be indicated with a checkbox for stand-alone options, or radio buttons for groups of
+mutually exlusive options (see the screenshot, to the right).</p>
+
+<p class="note"><strong>Note:</strong> Menu items in the Icon Menu cannot
+display a checkbox or radio button. If you choose to make items in the Icon Menu checkable,
+then you must personally indicate the state by swapping the icon and/or text 
+each time the state changes between on and off.</p>
+
+<p>To make a single item checkable, use the <code>{@link android.view.MenuItem#setCheckable(boolean)
+setCheckable()}</code> method, like so:</p>
+<pre>
+menu.add(0, VIBRATE_SETTING_ID, 0, "Vibrate")
+    .setCheckable(true);
+</pre>
+<p>This will display a checkbox with the menu item (unless it's in the Icon Menu). When the item
+is selected, the <code>onOptionsItemSelected()</code> callback is called as usual. It is here that
+you must set the state of the checkbox. You can query the current state of the item with
+<code>{@link android.view.MenuItem#isChecked()}</code> and set the checked state with
+<code>{@link android.view.MenuItem#setChecked(boolean) setChecked()}</code>. 
+Here's what this looks like inside the 
+<code>onOptionsItemSelected()</code> callback:</p>
+<pre>
+switch (item.getItemId()) {
+case VIBRATE_SETTING_ID:
+  if (item.isChecked()) item.setChecked(false);
+  else item.setChecked(true);
+  return true;
+...
+}
+</pre>
+
+<p>To make a group of mutually exclusive radio button items, simply 
+assign the same group ID to each menu item 
+and call <code>{@link android.view.Menu#setGroupCheckable(int,boolean,boolean) 
+setGroupCheckable()}</code>. In this case, you don't need to call <code>setCheckable()</code>
+on each menu items, because the group as a whole is set checkable. Here's an example of
+two mutually exclusive options in a sub-menu:</p>
+<pre>
+SubMenu subMenu = menu.addSubMenu("Color");
+subMenu.add(COLOR_MENU_GROUP, COLOR_RED_ID, 0, "Red");
+subMenu.add(COLOR_MENU_GROUP, COLOR_BLUE_ID, 0, "Blue");
+subMenu.setGroupCheckable(COLOR_MENU_GROUP, true, true);
+</pre>
+<p>In the <code>setGroupCheckable()</code> method, the first argument is the group ID
+that we want to set checkable. The second argument is whether we want the group items
+to be checkable. The last one is whether we want each item to be exclusively checkable 
+(if we set this <em>false</em>, then all the items will be checkboxes instead of radio buttons).
+When the group is set to be exclusive (radio buttons), each time a new item is selected, 
+all other are automatically de-selected.</p>
+<p>
+
+<p class="note"><strong>Note:</strong>
+Checkable menu items are intended to be used only on a per-session basis and not saved to the device 
+(e.g., the <em>Map mode</em> setting in the Maps application is not saved &mdash; screenshot above).
+If there are application settings that you would like to save for the user,
+then you should store the data using <a href="#{@docRoot}guide/topics/data/data-storage.html#pref">Preferences</a>,
+and manage them with a {@link android.preference.PreferenceActivity}.</p>
+
+
+<h3 id="shortcuts">Shortcut keys</h3>
+<p>Quick access shortcut keys using letters and/or numbers can be added to menu items with
+<code>setAlphabeticShortcut(char)</code> (to set char shortcut), <code>setNumericShortcut(int)</code>
+(to set numeric shortcut),
+or <code>setShortcut(char,int)</code> (to set both)</code>. Case is <em>not</em> sensitive.
+
+For example:</p>
+<pre>
+menu.add(0, MENU_QUIT, 0, "Quit")
+    .setAlphabeticShortcut('q');
+</pre>
+<p>Now, when the menu is open (or while holding the MENU key), pressing the "q" key will 
+select this item.</p>
+<p>This shortcut key will be displayed as a tip in the menu item, below the menu item name
+(except for items in the Icon Menu).</p>
+<p class="note"><strong>Note:</strong> Shortcuts cannot be added to items in a Context Menu.</p>
+
+
+<h3 id="intents">Menu item intents</h3>
+<p>If you've read the <a href="{@docRoot}guide/topics/fundamentals.html">Application
+Fundamentals</a>, then you're at least a little familiar
+with Android Intents. These allow applications to bind with each other, share information,
+and perform user tasks cooperatively. Just like your application might fire an Intent to launch a web browser,
+an email client, or another Activity in your application,
+you can perform such actions from within a menu.
+There are two ways to do this: define an Intent and assign it to a single menu item, or
+define an Intent and allow Android to search the device for activities and dynamically add a 
+menu item for each one that meets the Intent criteria.</p>
+
+<p>For more information on creating Intents and providing your application's services to other applications, 
+read the <a href="/guide/topics/intents/intents-filters.html">Intents 
+and Intent Filters</a> document.</p>
+
+<h4>Set an intent for a single menu item</h4>
+<p>If you want to offer a specific menu item that launches a new Activity, then you 
+can specifically define an Intent for the menu item with the
+<code>{@link android.view.MenuItem#setIntent(Intent)
+setIntent()}</code> method.</p>
+
+<p>For example, inside the <code>{@link android.app.Activity#onCreateOptionsMenu(Menu)
+onCreateOptionsMenu()}</code> method, you can define a new menu item with an Intent like this:</p>
+<pre>
+MenuItem menuItem = menu.add(0, PHOTO_PICKER_ID, 0, "Select Photo");
+menuItem.setIntent(new Intent(this, PhotoPicker.class));
+</pre>
+<p>Android will automatically launch the Activity when the item is selected.</p>
+
+<p class="note"><strong>Note:</strong> This will not return a result to your Activity.
+If you wish to be returned a result, then do not use <code>setIntent()</code>.
+Instead, handle the selection as usual in the <code>onOptionsMenuItemSelected()</code>
+or <code>onContextMenuItemSelected()</code> callback and call
+<code>{@link android.app.Activity#startActivityForResult(Intent,int) startActivityForResult()}</code>.
+</p>
+
+<h4>Dynamically add intents</h4>
+
+<p>If there are potentially multiple activities that are relevant to your current
+Activity or selected item, then the application can dynamically add menu items that execute other
+services.</p>
+<p>During menu creation, define an Intent with the category <var>Intent.ALTERNATIVE_CATEGORY</var> and/or
+<var>Intent.SELECTED_ALTERNATIVE</var>, the MIME type currently selected (if any), and any other
+requirements, the same way as you would satisfy an intent filter to open a new
+Activity. Then call  
+<code>{@link android.view.Menu#addIntentOptions(int,int,int,ComponentName,Intent[],Intent,int,MenuItem[]) 
+addIntentOptions()}</code> to have Android search for any services meeting those requirements
+and add them to the menu for you. If there are no applications installed
+that satisfy the Intent, then no additional menu items are added.</p>
+
+<p class="note"><strong>Note:</strong>
+<var>SELECTED_ALTERNATIVE</var> is used to handle the currently selected element on the 
+screen. So, it should only be used when creating a Menu in <code>onCreateContextMenu()</code> or
+<code>onPrepareOptionsMenu()</code>, which is called every time the Options Menu is opened.</p>
+
+<p>Here's an example demonstrating how an application would search for
+additional services to display on its menu.</p>
+
+<pre>
+public boolean onCreateOptionsMenu(Menu menu){
+    super.onCreateOptionsMenu(menu);
+
+    // Create an Intent that describes the requirements to fulfill, to be included
+    // in our menu. The offering app must include a category value of Intent.CATEGORY_ALTERNATIVE. 
+    Intent intent = new Intent(null, getIntent().getData());
+    intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
+        
+    // Search for, and populate the menu with, acceptable offering applications.
+    menu.addIntentOptions(
+         thisClass.INTENT_OPTIONS,  // Menu group 
+         0,      // Unique item ID (none)
+         0,      // Order for the items (none)
+         this.getComponentName(),   // The current Activity name
+         null,   // Specific items to place first (none)
+         intent, // Intent created above that describes our requirements
+         0,      // Additional flags to control items (none)
+         null);  // Array of MenuItems that corrolate to specific items (none)
+
+    return true;
+}</pre>
+
+<p>For each Activity found that provides an Intent Filter matching the Intent defined, a menu
+item will be added, using the <var>android:label</var> value of the intent filter as the text
+for the menu item. 
+The <code>{@link android.view.Menu#addIntentOptions(int,int,int,ComponentName,Intent[],Intent,int,MenuItem[]) addIntentOptions()}</code> method will also return the number of menu items added.</p>
+<p>Also be aware that, when <code>addIntentOptions()</code> is called, it will override any and all
+menu items in the menu group specified in the first argument.</p>
+
+<p>If you wish to offer the services of your Activity to other application menus, then you 
+only need to define an intent filter as usual. Just be sure to include the <var>ALTERNATIVE</var> and/or
+<var>SELECTED_ALTERNATIVE</var> values in the <var>name</var> attribute of 
+a <code>&lt;category></code> element in the intent filter. For example:</p>
+<pre>
+&lt;intent-filter label="Resize Image">
+    ...
+    &lt;category android:name="android.intent.category.ALTERNATIVE" />
+    &lt;category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
+    ...
+&lt;/intent-filter>
+</pre>
+<p>read more about writing intent filters in the 
+<a href="/guide/topics/intents/intents-filters.html">Intents and Intent Filters</a> document.</p>
+
+<p>For a sample application using this technique, see the 
+<a href="{@docRoot}guide/samples/NotePad/index.html">Note Pad</a>
+sample code.</p>
index ec497ae..5fee0d6 100644 (file)
@@ -51,6 +51,8 @@ public:
     status_t getMaxAmplitude(int *max);
 
 private:
+    status_t doStop();
+
     AuthorDriverWrapper*            mAuthorDriverWrapper;
 };
 
index 2aa78d8..3056139 100644 (file)
@@ -22,7 +22,7 @@
 #include <sys/types.h>
 #include <pthread.h>
 #ifdef HAVE_ANDROID_OS
-#include <sys/tls.h>
+#include <bionic_tls.h>
 #endif
 
 #include <private/pixelflinger/ggl_context.h>
index 101a920..017c145 100644 (file)
@@ -50,8 +50,9 @@ public:
     // bit fields for classes of devices.
     enum {
         CLASS_KEYBOARD      = 0x00000001,
-        CLASS_TOUCHSCREEN   = 0x00000002,
-        CLASS_TRACKBALL     = 0x00000004
+        CLASS_ALPHAKEY      = 0x00000002,
+        CLASS_TOUCHSCREEN   = 0x00000004,
+        CLASS_TRACKBALL     = 0x00000008
     };
     uint32_t getDeviceClasses(int32_t deviceId) const;
     
index 23cdee8..9c7bc47 100644 (file)
@@ -54,7 +54,7 @@ private:
     virtual ~OverlayRef();
 
     overlay_handle_t const *mOverlayHandle;
-    sp<IOverlay> mOverlayChanel;
+    sp<IOverlay> mOverlayChannel;
     uint32_t mWidth;
     uint32_t mHeight;
     int32_t  mFormat;
@@ -77,10 +77,10 @@ public:
     overlay_handle_t const* getHandleRef() const;
 
     /* blocks until an overlay buffer is available and return that buffer. */
-    overlay_buffer_t dequeueBuffer();
+    status_t dequeueBuffer(overlay_buffer_t* buffer);
 
     /* release the overlay buffer and post it */
-    int queueBuffer(overlay_buffer_t buffer);
+    status_t queueBuffer(overlay_buffer_t buffer);
 
     /* returns the address of a given buffer if supported, NULL otherwise. */
     void* getBufferAddress(overlay_buffer_t buffer);
index 2e24f86..33953a9 100644 (file)
@@ -92,6 +92,7 @@ private:
     friend class MediaRecorder;
     // mediaplayer needs access to ISurface for display
     friend class MediaPlayer;
+    friend class Test;
     const sp<ISurface>& getISurface() const { return mSurface; }
 
     // can't be copied
index 3b875be..5d9222d 100644 (file)
@@ -72,7 +72,7 @@ public:
     );
 
     // ------------------------------------------------------------------------
-    // Composer paramters
+    // Composer parameters
     // All composer parameters must be changed within a transaction
     // several surfaces can be updated in one transaction, all changes are
     // committed at once when the transaction is closed.
index b2a8e96..7242575 100644 (file)
@@ -92,6 +92,14 @@ status_t A2dpAudioInterface::getMicMute(bool* state)
 status_t A2dpAudioInterface::setParameter(const char *key, const char *value)
 {
     LOGD("setParameter %s,%s\n", key, value);
+    
+    if (!key || !value)
+        return -EINVAL;
+    
+    if (strcmp(key, "a2dp_sink_address") == 0) {        
+        return mOutput->setAddress(value);
+    }
+
     return 0;
 }
 
@@ -121,6 +129,8 @@ A2dpAudioInterface::A2dpAudioStreamOut::A2dpAudioStreamOut() :
     mFd(-1), mStandby(false), mStartCount(0), mRetryCount(0), mData(NULL),
     mInitialized(false)
 {
+    // use any address by default
+    strncpy(mA2dpAddress, "00:00:00:00:00:00", sizeof(mA2dpAddress));
 }
 
 status_t A2dpAudioInterface::A2dpAudioStreamOut::set(
@@ -154,7 +164,7 @@ ssize_t A2dpAudioInterface::A2dpAudioStreamOut::write(const void* buffer, size_t
     size_t remaining = bytes;
 
     if (!mInitialized) {
-        status = a2dp_init("00:00:00:00:00:00", 44100, 2, &mData);
+        status = a2dp_init(mA2dpAddress, 44100, 2, &mData);
         if (status < 0) {
             LOGE("a2dp_init failed err: %d\n", status);
             goto Error;
@@ -196,6 +206,24 @@ status_t A2dpAudioInterface::A2dpAudioStreamOut::standby()
     return result;
 }
 
+status_t A2dpAudioInterface::A2dpAudioStreamOut::setAddress(const char* address)
+{
+    if (strlen(address) < sizeof(mA2dpAddress))
+        return -EINVAL;
+
+    if (strcmp(address, mA2dpAddress)) {
+        strcpy(mA2dpAddress, address);
+        
+        if (mInitialized) {
+            a2dp_cleanup(mData);
+            mData = NULL;
+            mInitialized = false;
+        }
+    }
+    
+    return NO_ERROR;
+}
+
 status_t A2dpAudioInterface::A2dpAudioStreamOut::dump(int fd, const Vector<String16>& args)
 {
     return NO_ERROR;
index b8119a1..2197d0e 100644 (file)
@@ -22,7 +22,7 @@
 
 #include <utils/threads.h>
 
-#include <hardware/AudioHardwareBase.h>
+#include <hardware_legacy/AudioHardwareBase.h>
 
 
 namespace android {
@@ -74,7 +74,7 @@ private:
                                 uint32_t sampleRate);
         virtual uint32_t    sampleRate() const { return 44100; }
         // SBC codec wants a multiple of 512
-        virtual size_t      bufferSize() const { return 512 * 30; }
+        virtual size_t      bufferSize() const { return 512 * 20; }
         virtual int         channelCount() const { return 2; }
         virtual int         format() const { return AudioSystem::PCM_16_BIT; }
         virtual uint32_t    latency() const { return ((1000*channelCount()*bufferSize())/frameSize())/sampleRate() + 200; }
@@ -84,10 +84,15 @@ private:
         virtual status_t    dump(int fd, const Vector<String16>& args);
 
     private:
+        friend class A2dpAudioInterface;
+        status_t            setAddress(const char* address);
+
+    private:
                 int         mFd;
                 bool        mStandby;
                 int         mStartCount;
                 int         mRetryCount;
+                char        mA2dpAddress[20];
                 void*       mData;
                 bool        mInitialized;
     };
index d16e3e1..50d516b 100644 (file)
@@ -12,7 +12,7 @@ LOCAL_SHARED_LIBRARIES := \
     libcutils \
     libutils \
     libmedia \
-    libhardware
+    libhardware_legacy
 
 ifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true)
   LOCAL_CFLAGS += -DGENERIC_AUDIO
@@ -35,7 +35,7 @@ LOCAL_SHARED_LIBRARIES := \
     libcutils \
     libutils \
     libmedia \
-    libhardware
+    libhardware_legacy
 
 ifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true)
   LOCAL_STATIC_LIBRARIES += libaudiointerface
index 82b5250..42204d6 100644 (file)
@@ -21,7 +21,7 @@
 #include <stdint.h>
 #include <sys/types.h>
 
-#include <hardware/AudioHardwareBase.h>
+#include <hardware_legacy/AudioHardwareBase.h>
 
 namespace android {
 
index d4692ad..51b800c 100644 (file)
@@ -38,7 +38,7 @@
 
 #include <private/media/AudioTrackShared.h>
 
-#include <hardware/AudioHardwareInterface.h>
+#include <hardware_legacy/AudioHardwareInterface.h>
 
 #include "AudioMixer.h"
 #include "AudioFlinger.h"
@@ -832,10 +832,15 @@ bool AudioFlinger::isMusicActive() const
 
 status_t AudioFlinger::setParameter(const char* key, const char* value)
 {
-    status_t result;
+    status_t result, result2;
     AutoMutex lock(mHardwareLock);
     mHardwareStatus = AUDIO_SET_PARAMETER;
     result = mAudioHardware->setParameter(key, value);
+    if (mA2dpAudioInterface) {
+        result2 = mA2dpAudioInterface->setParameter(key, value);
+        if (result2)
+            result = result2;
+    }
     mHardwareStatus = AUDIO_HW_IDLE;
     return result;
 }
index 7c84e62..90bc72d 100644 (file)
@@ -33,7 +33,7 @@
 #include <utils/KeyedVector.h>
 #include <utils/SortedVector.h>
 
-#include <hardware/AudioHardwareInterface.h>
+#include <hardware_legacy/AudioHardwareInterface.h>
 
 #include "AudioBufferProvider.h"
 
index bc006b8..a7822e1 100644 (file)
@@ -23,7 +23,7 @@
 
 #include <utils/threads.h>
 
-#include <hardware/AudioHardwareBase.h>
+#include <hardware_legacy/AudioHardwareBase.h>
 
 namespace android {
 
index 7ec5b95..24736ed 100644 (file)
@@ -21,7 +21,7 @@
 #include <stdint.h>
 #include <sys/types.h>
 
-#include <hardware/AudioHardwareBase.h>
+#include <hardware_legacy/AudioHardwareBase.h>
 
 namespace android {
 
index 19e32ec..92588fa 100644 (file)
@@ -23,6 +23,8 @@
 
 #include <GLES/egl.h>
 
+#include <cutils/properties.h>
+
 #include <utils/Log.h>
 
 #include <ui/EGLDisplaySurface.h>
@@ -193,11 +195,14 @@ void DisplayHardware::init(uint32_t dpy)
     }
     mRefreshRate = 60.f;    // TODO: get the real refresh rate 
     
-    // compute a "density" automatically as a scale factor from 160 dpi
-    // TODO: this value should be calculated a compile time based on the
-    // board.
-    mDensity = floorf((mDpiX>mDpiY ? mDpiX : mDpiY)*0.1f + 0.5f) * (10.0f/160.0f);
-    LOGI("density = %f", mDensity);
+    
+    char property[PROPERTY_VALUE_MAX];
+    if (property_get("ro.sf.lcd_density", property, NULL) <= 0) {
+        LOGW("ro.sf.lcd_density not defined, using 160 dpi by default.");
+        strcpy(property, "160");
+    }
+    mDensity = atoi(property) * (1.0f/160.0f);
+
 
     /*
      * Create our OpenGL ES context
index 700e4f5..c9cebf4 100644 (file)
@@ -95,10 +95,9 @@ void LayerBuffer::postBuffer(ssize_t offset)
 
 void LayerBuffer::unregisterBuffers()
 {
-    sp<Source> source(getSource());
+    sp<Source> source(clearSource());
     if (source != 0)
         source->unregisterBuffers();
-    // XXX: clear mSource
 }
 
 uint32_t LayerBuffer::doTransaction(uint32_t flags)
@@ -172,6 +171,14 @@ sp<LayerBuffer::Source> LayerBuffer::getSource() const {
     return mSource;
 }
 
+sp<LayerBuffer::Source> LayerBuffer::clearSource() {
+    sp<Source> source;
+    Mutex::Autolock _l(mLock);
+    source = mSource;
+    mSource.clear();
+    return source;
+}
+
 // ============================================================================
 // LayerBuffer::SurfaceBuffer
 // ============================================================================
@@ -477,15 +484,16 @@ void LayerBuffer::BufferSource::onDraw(const Region& clip) const
 LayerBuffer::OverlaySource::OverlaySource(LayerBuffer& layer,
         sp<OverlayRef>* overlayRef, 
         uint32_t w, uint32_t h, int32_t format)
-    : Source(layer), mVisibilityChanged(false), mOverlay(0), mOverlayHandle(0)
+    : Source(layer), mVisibilityChanged(false),
+    mOverlay(0), mOverlayHandle(0), mOverlayDevice(0)
 {
     overlay_control_device_t* overlay_dev = mLayer.mFlinger->getOverlayEngine();
-
     if (overlay_dev == NULL) {
         // overlays not supported
         return;
     }
 
+    mOverlayDevice = overlay_dev;
     overlay_t* overlay = overlay_dev->createOverlay(overlay_dev, w, h, format);
     if (overlay == NULL) {
         // couldn't create the overlay (no memory? no more overlays?)
@@ -507,14 +515,18 @@ LayerBuffer::OverlaySource::OverlaySource(LayerBuffer& layer,
     
     // NOTE: here it's okay to acquire a reference to "this"m as long as
     // the reference is not released before we leave the ctor.
-    sp<OverlayChanel> chanel = new OverlayChanel(this);
+    sp<OverlayChannel> channel = new OverlayChannel(this);
 
-    *overlayRef = new OverlayRef(mOverlayHandle, chanel,
+    *overlayRef = new OverlayRef(mOverlayHandle, channel,
             mWidth, mHeight, mFormat, mWidthStride, mHeightStride);
 }
 
 LayerBuffer::OverlaySource::~OverlaySource()
-{    
+{
+    if (mOverlay && mOverlayDevice) {
+        overlay_control_device_t* overlay_dev = mOverlayDevice;
+        overlay_dev->destroyOverlay(overlay_dev, mOverlay);
+    }
 }
 
 void LayerBuffer::OverlaySource::onTransaction(uint32_t flags)
@@ -543,8 +555,7 @@ void LayerBuffer::OverlaySource::onVisibilityResolved(
             // we need a lock here to protect "destroy"
             Mutex::Autolock _l(mLock);
             if (mOverlay) {
-                overlay_control_device_t* overlay_dev = 
-                    mLayer.mFlinger->getOverlayEngine();
+                overlay_control_device_t* overlay_dev = mOverlayDevice;
                 overlay_dev->setPosition(overlay_dev, mOverlay, x,y,w,h);
                 overlay_dev->setParameter(overlay_dev, mOverlay, 
                         OVERLAY_TRANSFORM, mLayer.getOrientation());
@@ -555,11 +566,16 @@ void LayerBuffer::OverlaySource::onVisibilityResolved(
 
 void LayerBuffer::OverlaySource::serverDestroy() 
 {
+    mLayer.clearSource();
+    destroyOverlay();
+}
+
+void LayerBuffer::OverlaySource::destroyOverlay() 
+{
     // we need a lock here to protect "onVisibilityResolved"
     Mutex::Autolock _l(mLock);
     if (mOverlay) {
-        overlay_control_device_t* overlay_dev = 
-                mLayer.mFlinger->getOverlayEngine();
+        overlay_control_device_t* overlay_dev = mOverlayDevice;
         overlay_dev->destroyOverlay(overlay_dev, mOverlay);
         mOverlay = 0;
     }
index 63ec2cf..3286535 100644 (file)
@@ -75,6 +75,7 @@ public:
     sp<OverlayRef> createOverlay(uint32_t w, uint32_t h, int32_t format);
     
     sp<Source> getSource() const;
+    sp<Source> clearSource();
     void setNeedsBlending(bool blending);
     const Rect& getTransformedBounds() const {
         return mTransformedBounds;
@@ -145,7 +146,8 @@ private:
         virtual void onVisibilityResolved(const Transform& planeTransform);
     private:
         void serverDestroy(); 
-        class OverlayChanel : public BnOverlay {
+        void destroyOverlay(); 
+        class OverlayChannel : public BnOverlay {
             mutable Mutex mLock;
             sp<OverlaySource> mSource;
             virtual void destroy() {
@@ -160,15 +162,16 @@ private:
                 }
             }
         public:
-            OverlayChanel(const sp<OverlaySource>& source)
+            OverlayChannel(const sp<OverlaySource>& source)
                 : mSource(source) {
             }
         };
-        friend class OverlayChanel;
+        friend class OverlayChannel;
         bool mVisibilityChanged;
 
         overlay_t* mOverlay;        
         overlay_handle_t const *mOverlayHandle;
+        overlay_control_device_t* mOverlayDevice;
         uint32_t mWidth;
         uint32_t mHeight;
         int32_t mFormat;
diff --git a/libs/surfaceflinger/tests/Android.mk b/libs/surfaceflinger/tests/Android.mk
new file mode 100644 (file)
index 0000000..5053e7d
--- /dev/null
@@ -0,0 +1 @@
+include $(call all-subdir-makefiles)
diff --git a/libs/surfaceflinger/tests/overlays/Android.mk b/libs/surfaceflinger/tests/overlays/Android.mk
new file mode 100644 (file)
index 0000000..dc47e45
--- /dev/null
@@ -0,0 +1,16 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES:= \
+       overlays.cpp
+
+LOCAL_SHARED_LIBRARIES := \
+       libcutils \
+       libutils \
+    libui
+
+LOCAL_MODULE:= test-overlays
+
+LOCAL_MODULE_TAGS := tests
+
+include $(BUILD_EXECUTABLE)
diff --git a/libs/surfaceflinger/tests/overlays/overlays.cpp b/libs/surfaceflinger/tests/overlays/overlays.cpp
new file mode 100644 (file)
index 0000000..f3c046f
--- /dev/null
@@ -0,0 +1,58 @@
+#include <utils/IPCThreadState.h>
+#include <utils/ProcessState.h>
+#include <utils/IServiceManager.h>
+#include <utils/Log.h>
+
+#include <ui/Surface.h>
+#include <ui/ISurface.h>
+#include <ui/Overlay.h>
+#include <ui/SurfaceComposerClient.h>
+
+using namespace android;
+
+namespace android {
+class Test {
+public:
+    static const sp<ISurface>& getISurface(const sp<Surface>& s) {
+        return s->getISurface();
+    }
+};
+};
+
+int main(int argc, char** argv)
+{
+    // set up the thread-pool
+    sp<ProcessState> proc(ProcessState::self());
+    ProcessState::self()->startThreadPool();
+
+    // create a client to surfaceflinger
+    sp<SurfaceComposerClient> client = new SurfaceComposerClient();
+    
+    // create pushbuffer surface
+    sp<Surface> surface = client->createSurface(getpid(), 0, 320, 240, 
+            PIXEL_FORMAT_UNKNOWN, ISurfaceComposer::ePushBuffers);
+
+    // get to the isurface
+    sp<ISurface> isurface = Test::getISurface(surface);
+    printf("isurface = %p\n", isurface.get());
+    
+    // now request an overlay
+    sp<OverlayRef> ref = isurface->createOverlay(320, 240, PIXEL_FORMAT_RGB_565);
+    sp<Overlay> overlay = new Overlay(ref);
+    
+
+    /*
+     * here we can use the overlay API 
+     */
+    
+    overlay_buffer_t buffer; 
+    overlay->dequeueBuffer(&buffer);
+    printf("buffer = %p\n", buffer);
+    
+    void* address = overlay->getBufferAddress(buffer);
+    printf("address = %p\n", address);
+
+    overlay->queueBuffer(buffer);
+
+    return 0;
+}
index 7b51300..f944357 100644 (file)
@@ -33,7 +33,8 @@ LOCAL_SHARED_LIBRARIES := \
        libcutils \
        libutils \
        libpixelflinger \
-       libhardware
+       libhardware \
+       libhardware_legacy
 
 LOCAL_MODULE:= libui
 
index abe7407..700aa3a 100644 (file)
@@ -16,7 +16,7 @@
 //#define LOG_NDEBUG 0
 
 #include <ui/EventHub.h>
-#include <hardware/power.h>
+#include <hardware_legacy/power.h>
 
 #include <cutils/properties.h>
 #include <utils/IServiceManager.h>
@@ -520,6 +520,10 @@ int EventHub::open_device(const char *deviceName)
         for (int i=0; i<((BTN_MISC+7)/8); i++) {
             if (key_bitmask[i] != 0) {
                 device->classes |= CLASS_KEYBOARD;
+                // 'Q' key support = cheap test of whether this is an alpha-capable kbd
+                if (test_bit(KEY_Q, key_bitmask)) {
+                    device->classes |= CLASS_ALPHAKEY;
+                }
                 break;
             }
         }
index 54f78fe..6f3cd47 100644 (file)
@@ -128,7 +128,7 @@ status_t BnSurface::onTransact(
             int w = data.readInt32();
             int h = data.readInt32();
             int f = data.readInt32();
-            sp<OverlayRef> o = createOverlay(w, h, w);
+            sp<OverlayRef> o = createOverlay(w, h, f);
             return OverlayRef::writeToParcel(reply, o);
         } break;
         default:
index a79950c..2745f52 100644 (file)
@@ -31,10 +31,12 @@ Overlay::Overlay(const sp<OverlayRef>& overlayRef)
 {
     mOverlayData = NULL;
     hw_module_t const* module;
-    if (hw_get_module(OVERLAY_HARDWARE_MODULE_ID, &module) == 0) {
-        if (overlay_data_open(module, &mOverlayData) == NO_ERROR) {
-            mStatus = mOverlayData->initialize(mOverlayData,
-                    overlayRef->mOverlayHandle);
+    if (overlayRef != 0) {
+        if (hw_get_module(OVERLAY_HARDWARE_MODULE_ID, &module) == 0) {
+            if (overlay_data_open(module, &mOverlayData) == NO_ERROR) {
+                mStatus = mOverlayData->initialize(mOverlayData,
+                        overlayRef->mOverlayHandle);
+            }
         }
     }
 }
@@ -45,23 +47,27 @@ Overlay::~Overlay() {
     }
 }
 
-overlay_buffer_t Overlay::dequeueBuffer()
+status_t Overlay::dequeueBuffer(overlay_buffer_t* buffer)
 {
-    return mOverlayData->dequeueBuffer(mOverlayData);
+    if (mStatus != NO_ERROR) return mStatus;
+    return  mOverlayData->dequeueBuffer(mOverlayData, buffer);
 }
 
-int Overlay::queueBuffer(overlay_buffer_t buffer)
+status_t Overlay::queueBuffer(overlay_buffer_t buffer)
 {
+    if (mStatus != NO_ERROR) return mStatus;
     return mOverlayData->queueBuffer(mOverlayData, buffer);
 }
 
 void* Overlay::getBufferAddress(overlay_buffer_t buffer)
 {
+    if (mStatus != NO_ERROR) return NULL;
     return mOverlayData->getBufferAddress(mOverlayData, buffer);
 }
 
 void Overlay::destroy() {  
-    mOverlayRef->mOverlayChanel->destroy();
+    if (mStatus != NO_ERROR) return;
+    mOverlayRef->mOverlayChannel->destroy();
 }
 
 status_t Overlay::getStatus() const {
@@ -69,26 +75,32 @@ status_t Overlay::getStatus() const {
 }
 
 overlay_handle_t const* Overlay::getHandleRef() const {
+    if (mStatus != NO_ERROR) return NULL;
     return mOverlayRef->mOverlayHandle;
 }
 
 uint32_t Overlay::getWidth() const {
+    if (mStatus != NO_ERROR) return 0;
     return mOverlayRef->mWidth;
 }
 
 uint32_t Overlay::getHeight() const {
+    if (mStatus != NO_ERROR) return 0;
     return mOverlayRef->mHeight;
 }
 
 int32_t Overlay::getFormat() const {
+    if (mStatus != NO_ERROR) return -1;
     return mOverlayRef->mFormat;
 }
 
 int32_t Overlay::getWidthStride() const {
+    if (mStatus != NO_ERROR) return 0;
     return mOverlayRef->mWidthStride;
 }
 
 int32_t Overlay::getHeightStride() const {
+    if (mStatus != NO_ERROR) return 0;
     return mOverlayRef->mHeightStride;
 }
 // ----------------------------------------------------------------------------
@@ -100,9 +112,9 @@ OverlayRef::OverlayRef()
 {    
 }
 
-OverlayRef::OverlayRef(overlay_handle_t const* handle, const sp<IOverlay>& chanel,
+OverlayRef::OverlayRef(overlay_handle_t const* handle, const sp<IOverlay>& channel,
          uint32_t w, uint32_t h, int32_t f, uint32_t ws, uint32_t hs)
-    : mOverlayHandle(handle), mOverlayChanel(chanel),
+    : mOverlayHandle(handle), mOverlayChannel(channel),
     mWidth(w), mHeight(h), mFormat(f), mWidthStride(ws), mHeightStride(hs),
     mOwnHandle(false)
 {
@@ -141,7 +153,7 @@ sp<OverlayRef> OverlayRef::readFromParcel(const Parcel& data) {
             handle->data[i] = data.readInt32();
         result = new OverlayRef();
         result->mOverlayHandle = handle;
-        result->mOverlayChanel = overlay;
+        result->mOverlayChannel = overlay;
         result->mWidth = w;
         result->mHeight = h;
         result->mFormat = f;
@@ -153,7 +165,7 @@ sp<OverlayRef> OverlayRef::readFromParcel(const Parcel& data) {
 
 status_t OverlayRef::writeToParcel(Parcel* reply, const sp<OverlayRef>& o) {
     if (o != NULL) {
-        reply->writeStrongBinder(o->mOverlayChanel->asBinder());
+        reply->writeStrongBinder(o->mOverlayChannel->asBinder());
         reply->writeInt32(o->mWidth);
         reply->writeInt32(o->mHeight);
         reply->writeInt32(o->mFormat);
@@ -176,4 +188,3 @@ status_t OverlayRef::writeToParcel(Parcel* reply, const sp<OverlayRef>& o) {
 // ----------------------------------------------------------------------------
 
 }; // namespace android
-
index 3063878..2009b3c 100644 (file)
@@ -6,7 +6,7 @@ include $(CLEAR_VARS)
 LOCAL_SRC_FILES:= \
        sdutil.cpp \
 
-LOCAL_SHARED_LIBRARIES := libhardware libcutils libutils libc
+LOCAL_SHARED_LIBRARIES := libhardware_legacy libcutils libutils libc
 
 LOCAL_MODULE:= sdutil
 
index ac14c15..0daa523 100644 (file)
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include <hardware/IMountService.h>
+#include <hardware_legacy/IMountService.h>
 #include <utils/BpBinder.h>
 #include <utils/IServiceManager.h>
 
index a0081ef..e350e02 100644 (file)
@@ -15,7 +15,9 @@ LOCAL_MODULE:= libGLES_CM
 # needed on sim build because of weird logging issues
 ifeq ($(TARGET_SIMULATOR),true)
 else
-       LOCAL_SHARED_LIBRARIES += libdl
+    LOCAL_SHARED_LIBRARIES += libdl
+    # we need to access the Bionic private header <bionic_tls.h>
+    LOCAL_CFLAGS += -I$(LOCAL_PATH)/../../../../bionic/libc/private
 endif
 
 include $(BUILD_SHARED_LIBRARY)
index 3b7f45e..3197535 100644 (file)
@@ -203,7 +203,8 @@ static pthread_key_t gEGLThreadLocalStorageKey = -1;
 
 #if defined(HAVE_ANDROID_OS) && !USE_SLOW_BINDING && !GL_LOGGER
 
-#include <sys/tls.h>
+/* special private C library header */
+#include <bionic_tls.h>
 // We have a dedicated TLS slot in bionic
 static inline void setGlThreadSpecific(gl_hooks_t const *value) {
     ((uint32_t *)__get_tls())[TLS_SLOT_OPENGL_API] = (uint32_t)value;
index a3dff76..99efe4c 100644 (file)
@@ -27,6 +27,11 @@ ifeq ($(TARGET_ARCH),arm)
        LOCAL_CFLAGS += -fstrict-aliasing
 endif
 
+ifneq ($(TARGET_SIMULATOR),true)
+    # we need to access the private Bionic header <bionic_tls.h>
+    LOCAL_CFLAGS += -I$(LOCAL_PATH)/../../../../bionic/libc/private
+endif
+
 LOCAL_SHARED_LIBRARIES := libcutils libutils libpixelflinger
 LOCAL_LDLIBS := -lpthread -ldl
 LOCAL_MODULE:= libagl
index eb0b03f..e2ea85b 100644 (file)
@@ -63,7 +63,7 @@ class DatabaseHelper extends SQLiteOpenHelper {
 
     private static final String TAG = "SettingsProvider";
     private static final String DATABASE_NAME = "settings.db";
-    private static final int DATABASE_VERSION = 30;
+    private static final int DATABASE_VERSION = 31;
     
     private Context mContext;
 
@@ -314,6 +314,23 @@ class DatabaseHelper extends SQLiteOpenHelper {
             
             upgradeVersion = 30;
         }
+        
+        if (upgradeVersion == 30) {
+            /*
+             * Upgrade 31 clears the title for all quick launch shortcuts so the
+             * activities' titles will be resolved at display time. Also, the
+             * folder is changed to '@quicklaunch'.
+             */
+            db.beginTransaction();
+            try {
+                db.execSQL("UPDATE bookmarks SET folder = '@quicklaunch'");
+                db.execSQL("UPDATE bookmarks SET title = ''");
+                db.setTransactionSuccessful();
+            } finally {
+                db.endTransaction();
+            }
+            upgradeVersion = 31;
+        }
 
         if (upgradeVersion != currentVersion) {
             Log.w(TAG, "Got stuck trying to upgrade from version " + upgradeVersion
index 3ae04c7..9ecc3d6 100644 (file)
@@ -36,7 +36,7 @@ import java.util.HashMap;
  * Manages a list of feeds for which this client is interested in receiving
  * change notifications.
  */
-public class SubscribedFeedsProvider extends SyncableContentProvider {
+public class SubscribedFeedsProvider extends AbstractSyncableContentProvider {
     private static final String TAG = "SubscribedFeedsProvider";
     private static final String DATABASE_NAME = "subscribedfeeds.db";
     private static final int DATABASE_VERSION = 10;
@@ -114,6 +114,7 @@ public class SubscribedFeedsProvider extends SyncableContentProvider {
         db.execSQL("CREATE TABLE _deleted_feeds (" +
                     "_sync_version TEXT," + // From the sync source
                     "_sync_id TEXT," +
+                    (isTemporary() ? "_sync_local_id INTEGER," : "") + // Used while syncing,
                     "_sync_account TEXT," +
                     "_sync_mark INTEGER, " + // Used to filter out new rows
                     "UNIQUE(_sync_id))");
index 63d7c94..139aaa3 100644 (file)
@@ -211,6 +211,11 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
     boolean mShowRequested;
     
     /**
+     * Set if we were explicitly told to show the input method.
+     */
+    boolean mShowExplicitlyRequested;
+    
+    /**
      * Set if we last told the input method to show itself.
      */
     boolean mInputShown;
@@ -569,7 +574,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
                     MSG_RESTART_INPUT, session, mCurAttribute));
         }
         if (mShowRequested) {
-            showCurrentInputLocked();
+            if (DEBUG) Log.v(TAG, "Attach new input asks to show input");
+            showCurrentInputLocked(mShowExplicitlyRequested
+                    ? 0 : InputMethodManager.SHOW_IMPLICIT);
         }
         return needResult
                 ? new InputBindResult(session.session, mCurId, mCurSeq)
@@ -820,7 +827,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
         }
     }
     
-    public void showSoftInput(IInputMethodClient client) {
+    public void showSoftInput(IInputMethodClient client, int flags) {
         synchronized (mMethodMap) {
             if (mCurClient == null || client == null
                     || mCurClient.client.asBinder() != client.asBinder()) {
@@ -836,22 +843,25 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
                 }
             }
 
-            showCurrentInputLocked();
+            if (DEBUG) Log.v(TAG, "Client requesting input be shown");
+            showCurrentInputLocked(flags);
         }
     }
     
-    void showCurrentInputLocked() {
+    void showCurrentInputLocked(int flags) {
         mShowRequested = true;
-        if (!mInputShown) {
-            if (mCurMethod != null) {
-                executeOrSendMessage(mCurMethod, mCaller.obtainMessageO(
-                        MSG_SHOW_SOFT_INPUT, mCurMethod));
-                mInputShown = true;
-            }
+        if ((flags&InputMethodManager.SHOW_IMPLICIT) == 0) {
+            mShowExplicitlyRequested = true;
+        }
+        if (mCurMethod != null) {
+            executeOrSendMessage(mCurMethod, mCaller.obtainMessageIO(
+                    MSG_SHOW_SOFT_INPUT, mShowExplicitlyRequested ? 1 : 0,
+                            mCurMethod));
+            mInputShown = true;
         }
     }
     
-    public void hideSoftInput(IInputMethodClient client) {
+    public void hideSoftInput(IInputMethodClient client, int flags) {
         synchronized (mMethodMap) {
             if (mCurClient == null || client == null
                     || mCurClient.client.asBinder() != client.asBinder()) {
@@ -867,25 +877,34 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
                 }
             }
 
-            hideCurrentInputLocked();
+            if (DEBUG) Log.v(TAG, "Client requesting input be hidden");
+            hideCurrentInputLocked(flags);
         }
     }
     
-    void hideCurrentInputLocked() {
+    void hideCurrentInputLocked(int flags) {
+        if ((flags&InputMethodManager.HIDE_IMPLICIT_ONLY) != 0
+                && mShowExplicitlyRequested) {
+            if (DEBUG) Log.v(TAG,
+                    "Not hiding: explicit show not cancelled by non-explicit hide");
+            return;
+        }
         if (mInputShown && mCurMethod != null) {
             executeOrSendMessage(mCurMethod, mCaller.obtainMessageO(
                     MSG_HIDE_SOFT_INPUT, mCurMethod));
         }
         mInputShown = false;
         mShowRequested = false;
+        mShowExplicitlyRequested = false;
     }
     
     public void windowGainedFocus(IInputMethodClient client,
-            boolean viewHasFocus, int softInputMode, boolean first,
-            int windowFlags) {
+            boolean viewHasFocus, boolean isTextEditor, int softInputMode,
+            boolean first, int windowFlags) {
         synchronized (mMethodMap) {
             if (DEBUG) Log.v(TAG, "windowGainedFocus: " + client.asBinder()
                     + " viewHasFocus=" + viewHasFocus
+                    + " isTextEditor=" + isTextEditor
                     + " softInputMode=#" + Integer.toHexString(softInputMode)
                     + " first=" + first + " flags=#"
                     + Integer.toHexString(windowFlags));
@@ -906,35 +925,45 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
 
             switch (softInputMode&WindowManager.LayoutParams.SOFT_INPUT_MASK_STATE) {
                 case WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED:
-                    if (!viewHasFocus || (softInputMode &
+                    if (!isTextEditor || (softInputMode &
                             WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST)
                             != WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) {
-                        if ((windowFlags&WindowManager.LayoutParams
-                                .FLAG_ALT_FOCUSABLE_IM) == 0) {
+                        if (WindowManager.LayoutParams.mayUseInputMethod(windowFlags)) {
                             // There is no focus view, and this window will
-                            // be behind any soft input window, then hide the
+                            // be behind any soft input window, so hide the
                             // soft input window if it is shown.
-                            hideCurrentInputLocked();
+                            if (DEBUG) Log.v(TAG, "Unspecified window will hide input");
+                            hideCurrentInputLocked(0);
                         }
+                    } else if (isTextEditor && (softInputMode &
+                            WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST)
+                            == WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE
+                            && (softInputMode &
+                                    WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) != 0) {
+                        // There is a focus view, and we are navigating forward
+                        // into the window, so show the input window for the user.
+                        if (DEBUG) Log.v(TAG, "Unspecified window will show input");
+                        showCurrentInputLocked(InputMethodManager.SHOW_IMPLICIT);
                     }
                     break;
                 case WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED:
                     // Do nothing.
                     break;
                 case WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN:
-                    hideCurrentInputLocked();
-                    break;
-                case WindowManager.LayoutParams.SOFT_INPUT_STATE_FIRST_VISIBLE:
-                    if (first && !viewHasFocus && (windowFlags
-                            & WindowManager.LayoutParams.FLAG_RESTORED_STATE) == 0) {
-                        showCurrentInputLocked();
-                    }
+                    if (DEBUG) Log.v(TAG, "Window asks to hide input");
+                    hideCurrentInputLocked(0);
                     break;
                 case WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE:
-                    if (viewHasFocus) {
-                        showCurrentInputLocked();
+                    if ((softInputMode &
+                            WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) != 0) {
+                        if (DEBUG) Log.v(TAG, "Window asks to show input going forward");
+                        showCurrentInputLocked(InputMethodManager.SHOW_IMPLICIT);
                     }
                     break;
+                case WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE:
+                    if (DEBUG) Log.v(TAG, "Window asks to always show input");
+                    showCurrentInputLocked(InputMethodManager.SHOW_IMPLICIT);
+                    break;
             }
         }
     }
@@ -968,18 +997,13 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
         }
     }
 
-    public void hideMySoftInput(IBinder token) {
+    public void hideMySoftInput(IBinder token, int flags) {
         synchronized (mMethodMap) {
             if (mCurToken == null || mCurToken != token) {
                 Log.w(TAG, "Ignoring hideInputMethod of token: " + token);
             }
 
-            if (mInputShown && mCurMethod != null) {
-                executeOrSendMessage(mCurMethod, mCaller.obtainMessageO(
-                        MSG_HIDE_SOFT_INPUT, mCurMethod));
-            }
-            mInputShown = false;
-            mShowRequested = false;
+            hideCurrentInputLocked(flags);
         }
     }
 
@@ -1028,7 +1052,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
                 return true;
             case MSG_SHOW_SOFT_INPUT:
                 try {
-                    ((IInputMethod)msg.obj).showSoftInput();
+                    ((IInputMethod)msg.obj).showSoftInput(msg.arg1 != 0);
                 } catch (RemoteException e) {
                 }
                 return true;
@@ -1400,6 +1424,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
             p.println("  mCurMethod=" + mCurMethod);
             p.println("  mEnabledSession=" + mEnabledSession);
             p.println("  mShowRequested=" + mShowRequested
+                    + " mShowExplicitlyRequested=" + mShowExplicitlyRequested
                     + " mInputShown=" + mInputShown);
             p.println("  mScreenOn=" + mScreenOn);
         }
index 77182f7..9874042 100644 (file)
@@ -127,10 +127,10 @@ public abstract class KeyInputQueue {
     
     public void getInputConfiguration(Configuration config) {
         synchronized (mFirst) {
-            config.touchscreen = Configuration.TOUCHSCREEN_FINGER;
-                    //Resources.Configuration.TOUCHSCREEN_NOTOUCH;
-            config.keyboard = Configuration.KEYBOARD_QWERTY;
-            config.navigation = Configuration.NAVIGATION_TRACKBALL;
+            config.touchscreen = Configuration.TOUCHSCREEN_NOTOUCH;
+            config.keyboard = Configuration.KEYBOARD_NOKEYS;
+            config.navigation = Configuration.NAVIGATION_NONAV;
+            
             final int N = mDevices.size();
             for (int i=0; i<N; i++) {
                 InputDevice d = mDevices.valueAt(i);
@@ -140,6 +140,11 @@ public abstract class KeyInputQueue {
                                 = Configuration.TOUCHSCREEN_FINGER;
                         //Log.i("foo", "***** HAVE TOUCHSCREEN!");
                     }
+                    if ((d.classes&RawInputEvent.CLASS_ALPHAKEY) != 0) {
+                        config.keyboard
+                                = Configuration.KEYBOARD_QWERTY;
+                        //Log.i("foo", "***** HAVE QWERTY!");
+                    }
                     if ((d.classes&RawInputEvent.CLASS_TRACKBALL) != 0) {
                         config.navigation
                                 = Configuration.NAVIGATION_TRACKBALL;
index f2483ff..2d61b1e 100644 (file)
@@ -1460,7 +1460,7 @@ public class WifiService extends IWifiManager.Stub {
                  * current power conditions (i.e, not plugged in, plugged in to USB,
                  * or plugged in to AC).
                  */
-                if (!shouldStayAwake(stayAwakeConditions, mPluggedType)) {
+                if (!shouldWifiStayAwake(stayAwakeConditions, mPluggedType)) {
                     long triggerTime = System.currentTimeMillis() + idleMillis;
                     mAlarmManager.set(AlarmManager.RTC_WAKEUP, triggerTime, mIdleIntent);
                 }
@@ -1477,8 +1477,8 @@ public class WifiService extends IWifiManager.Stub {
                  * the already-set timer.
                  */
                 int pluggedType = intent.getIntExtra("plugged", 0);
-                if (mScreenOff && shouldStayAwake(stayAwakeConditions, mPluggedType) &&
-                        !shouldStayAwake(stayAwakeConditions, pluggedType)) {
+                if (mScreenOff && shouldWifiStayAwake(stayAwakeConditions, mPluggedType) &&
+                        !shouldWifiStayAwake(stayAwakeConditions, pluggedType)) {
                     long triggerTime = System.currentTimeMillis() + idleMillis;
                     mAlarmManager.set(AlarmManager.RTC_WAKEUP, triggerTime, mIdleIntent);
                     mPluggedType = pluggedType;
@@ -1493,6 +1493,30 @@ public class WifiService extends IWifiManager.Stub {
         }
 
         /**
+         * Determines whether the Wi-Fi chipset should stay awake or be put to
+         * sleep. Looks at the setting for the sleep policy and the current
+         * conditions.
+         * 
+         * @see #shouldDeviceStayAwake(int, int)
+         */
+        private boolean shouldWifiStayAwake(int stayAwakeConditions, int pluggedType) {
+            int wifiSleepPolicy = Settings.System.getInt(mContext.getContentResolver(),
+                    Settings.System.WIFI_SLEEP_POLICY, Settings.System.WIFI_SLEEP_POLICY_DEFAULT);
+
+            if (wifiSleepPolicy == Settings.System.WIFI_SLEEP_POLICY_NEVER) {
+                // Never sleep
+                return true;
+            } else if ((wifiSleepPolicy == Settings.System.WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED) &&
+                    (pluggedType != 0)) {
+                // Never sleep while plugged, and we're plugged
+                return true;
+            } else {
+                // Default
+                return shouldDeviceStayAwake(stayAwakeConditions, pluggedType);
+            }
+        }
+        
+        /**
          * Determine whether the bit value corresponding to {@code pluggedType} is set in
          * the bit string {@code stayAwakeConditions}. Because a {@code pluggedType} value
          * of {@code 0} isn't really a plugged type, but rather an indication that the
@@ -1506,7 +1530,7 @@ public class WifiService extends IWifiManager.Stub {
          * @return {@code true} if {@code pluggedType} indicates that the device is
          * supposed to stay awake, {@code false} otherwise.
          */
-        private boolean shouldStayAwake(int stayAwakeConditions, int pluggedType) {
+        private boolean shouldDeviceStayAwake(int stayAwakeConditions, int pluggedType) {
             return (stayAwakeConditions & pluggedType) != 0;
         }
     };
@@ -1528,7 +1552,6 @@ public class WifiService extends IWifiManager.Stub {
         boolean airplaneMode = isAirplaneModeOn();
         boolean lockHeld = mLocks.hasLocks();
         int strongestLockMode;
-
         boolean wifiShouldBeEnabled = wifiEnabled && !airplaneMode;
         boolean wifiShouldBeStarted = !mDeviceIdle || lockHeld;
         if (mDeviceIdle && lockHeld) {
@@ -1562,11 +1585,7 @@ public class WifiService extends IWifiManager.Stub {
     }
 
     private void registerForBroadcasts() {
-        String airplaneModeRadios = Settings.System.getString(mContext.getContentResolver(),
-                Settings.System.AIRPLANE_MODE_RADIOS);
-        boolean isAirplaneSensitive = airplaneModeRadios == null
-            || airplaneModeRadios.contains(Settings.System.RADIO_WIFI);
-        if (isAirplaneSensitive) {
+        if (isAirplaneSensitive()) {
             mContext.registerReceiver(mReceiver,
                 new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED));
         }
@@ -1579,12 +1598,21 @@ public class WifiService extends IWifiManager.Stub {
         mContext.registerReceiver(mReceiver,
                 new IntentFilter(ACTION_DEVICE_IDLE));
     }
+    
+    private boolean isAirplaneSensitive() {
+        String airplaneModeRadios = Settings.System.getString(mContext.getContentResolver(),
+                Settings.System.AIRPLANE_MODE_RADIOS);
+        return airplaneModeRadios == null
+            || airplaneModeRadios.contains(Settings.System.RADIO_WIFI);
+    }
+
     /**
-     * Returns true if airplane mode is currently on.
+     * Returns true if Wi-Fi is sensitive to airplane mode, and airplane mode is
+     * currently on.
      * @return {@code true} if airplane mode is on.
      */
     private boolean isAirplaneModeOn() {
-        return Settings.System.getInt(mContext.getContentResolver(),
+        return isAirplaneSensitive() && Settings.System.getInt(mContext.getContentResolver(),
                 Settings.System.AIRPLANE_MODE_ON, 0) == 1;
     }
 
index e686bf0..9578c2e 100644 (file)
@@ -231,7 +231,7 @@ public class WifiWatchdogService {
      */
     private int getBackgroundCheckDelayMs() {
         return Settings.Secure.getInt(mContentResolver,
-            Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS, 5000);
+            Settings.Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS, 60000);
     }
     
     /**
index 9671743..881add1 100644 (file)
@@ -541,7 +541,7 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
         return -1;
     }
     
-    private void addWindowToListInOrderLocked(WindowState win) {
+    private void addWindowToListInOrderLocked(WindowState win, boolean addToToken) {
         final IWindow client = win.mClient;
         final WindowToken token = win.mToken;
         final ArrayList localmWindows = mWindows;
@@ -669,7 +669,9 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
                     + i + " of " + N);
                 localmWindows.add(i, win);
             }
-            token.windows.add(tokenWindowsPos, win);
+            if (addToToken) {
+                token.windows.add(tokenWindowsPos, win);
+            }
 
         } else {
             // Figure out this window's ordering relative to the window
@@ -689,7 +691,9 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
                     // For negative sublayers, we go below all windows
                     // in the same sublayer.
                     if (wSublayer >= sublayer) {
-                        token.windows.add(i, win);
+                        if (addToToken) {
+                            token.windows.add(i, win);
+                        }
                         placeWindowBefore(
                             wSublayer >= 0 ? attached : w, win);
                         break;
@@ -698,14 +702,18 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
                     // For positive sublayers, we go above all windows
                     // in the same sublayer.
                     if (wSublayer > sublayer) {
-                        token.windows.add(i, win);
+                        if (addToToken) {
+                            token.windows.add(i, win);
+                        }
                         placeWindowBefore(w, win);
                         break;
                     }
                 }
             }
             if (i >= NA) {
-                token.windows.add(win);
+                if (addToToken) {
+                    token.windows.add(win);
+                }
                 if (sublayer < 0) {
                     placeWindowBefore(attached, win);
                 } else {
@@ -717,7 +725,7 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
             }
         }
         
-        if (win.mAppToken != null) {
+        if (win.mAppToken != null && addToToken) {
             win.mAppToken.allAppWindows.add(win);
         }
     }
@@ -759,19 +767,46 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
             return;
         }
         win.mTargetAppToken = null;
-        addWindowToListInOrderLocked(win);
+        addWindowToListInOrderLocked(win, true);
         moveInputMethodDialogsLocked(pos);
     }
     
+    private int tmpRemoveWindowLocked(int interestingPos, WindowState win) {
+        int wpos = mWindows.indexOf(win);
+        if (wpos >= 0) {
+            if (wpos < interestingPos) interestingPos--;
+            mWindows.remove(wpos);
+            int NC = win.mChildWindows.size();
+            while (NC > 0) {
+                NC--;
+                WindowState cw = (WindowState)win.mChildWindows.get(NC);
+                int cpos = mWindows.indexOf(cw);
+                if (cpos >= 0) {
+                    if (cpos < interestingPos) interestingPos--;
+                    mWindows.remove(cpos);
+                }
+            }
+        }
+        return interestingPos;
+    }
+    
+    private void reAddWindowToListInOrderLocked(WindowState win) {
+        addWindowToListInOrderLocked(win, false);
+        // This is a hack to get all of the child windows added as well
+        // at the right position.  Child windows should be rare and
+        // this case should be rare, so it shouldn't be that big a deal.
+        int wpos = mWindows.indexOf(win);
+        if (wpos >= 0) {
+            mWindows.remove(wpos);
+            reAddWindowLocked(wpos, win);
+        }
+    }
+    
     void moveInputMethodDialogsLocked(int pos) {
         ArrayList<WindowState> dialogs = mInputMethodDialogs;
         final int N = dialogs.size();
         for (int i=0; i<N; i++) {
-            int wpos = mWindows.indexOf(dialogs.get(i));
-            if (wpos >= 0) {
-                if (wpos < pos) pos--;
-                mWindows.remove(wpos);
-            }
+            pos = tmpRemoveWindowLocked(pos, dialogs.get(i));
         }
         if (pos >= 0) {
             final AppWindowToken targetAppToken = mInputMethodTarget.mAppToken;
@@ -782,15 +817,14 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
             for (int i=0; i<N; i++) {
                 WindowState win = dialogs.get(i);
                 win.mTargetAppToken = targetAppToken;
-                mWindows.add(pos, win);
-                pos++;
+                pos = reAddWindowLocked(pos, win);
             }
             return;
         }
         for (int i=0; i<N; i++) {
             WindowState win = dialogs.get(i);
             win.mTargetAppToken = null;
-            addWindowToListInOrderLocked(win);
+            reAddWindowToListInOrderLocked(win);
         }
     }
     
@@ -806,26 +840,49 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
             // In this case, the input method windows are to be placed
             // immediately above the window they are targeting.
             
-            WindowState firstImWin = imPos < DN
+            // First check to see if the input method windows are already
+            // located here, and contiguous.
+            final int N = mWindows.size();
+            WindowState firstImWin = imPos < N
                     ? (WindowState)mWindows.get(imPos) : null;
-            if (imWin != null) {
-                if (imWin == firstImWin) {
-                    // Already at the correct location!
-                    return false;
+                    
+            // Figure out the actual input method window that should be
+            // at the bottom of their stack.
+            WindowState baseImWin = imWin != null
+                    ? imWin : mInputMethodDialogs.get(0);
+            if (baseImWin.mChildWindows.size() > 0) {
+                WindowState cw = (WindowState)baseImWin.mChildWindows.get(0);
+                if (cw.mSubLayer < 0) baseImWin = cw;
+            }
+            
+            if (firstImWin == baseImWin) {
+                // The windows haven't moved...  but are they still contiguous?
+                // First find the top IM window.
+                int pos = imPos+1;
+                while (pos < N) {
+                    if (!((WindowState)mWindows.get(pos)).mIsImWindow) {
+                        break;
+                    }
+                    pos++;
                 }
-            } else {
-                if (mInputMethodDialogs.get(0) == firstImWin) {
-                    // Already at the correct location!
+                pos++;
+                // Now there should be no more input method windows above.
+                while (pos < N) {
+                    if (((WindowState)mWindows.get(pos)).mIsImWindow) {
+                        break;
+                    }
+                    pos++;
+                }
+                if (pos >= N) {
+                    // All is good!
                     return false;
                 }
             }
             
             if (imWin != null) {
-                int oldPos = mWindows.indexOf(imWin);
-                mWindows.remove(oldPos);
-                if (imPos > oldPos) imPos--;
+                imPos = tmpRemoveWindowLocked(imPos, imWin);
                 imWin.mTargetAppToken = mInputMethodTarget.mAppToken;
-                mWindows.add(imPos, imWin);
+                reAddWindowLocked(imPos, imWin);
                 if (DN > 0) moveInputMethodDialogsLocked(imPos+1);
             } else {
                 moveInputMethodDialogsLocked(imPos);
@@ -836,9 +893,9 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
             // because they aren't currently associated with a focus window.
             
             if (imWin != null) {
-                mWindows.remove(imWin);
+                tmpRemoveWindowLocked(0, imWin);
                 imWin.mTargetAppToken = null;
-                addWindowToListInOrderLocked(imWin);
+                reAddWindowToListInOrderLocked(imWin);
                 if (DN > 0) moveInputMethodDialogsLocked(-1);;
             } else {
                 moveInputMethodDialogsLocked(-1);;
@@ -985,10 +1042,11 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
                 imMayMove = false;
             } else if (attrs.type == TYPE_INPUT_METHOD_DIALOG) {
                 mInputMethodDialogs.add(win);
+                addWindowToListInOrderLocked(win, true);
                 adjustInputMethodDialogsLocked();
                 imMayMove = false;
             } else {
-                addWindowToListInOrderLocked(win);
+                addWindowToListInOrderLocked(win, true);
             }
             
             Binder.restoreCallingIdentity(origId);
@@ -1910,6 +1968,10 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
         }
     }
 
+    public int getPendingAppTransition() {
+        return mNextAppTransition;
+    }
+    
     public void executeAppTransition() {
         if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
                 "executeAppTransition()")) {
@@ -1988,7 +2050,7 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
                         mWindows.remove(startingWindow);
                         ttoken.windows.remove(startingWindow);
                         ttoken.allAppWindows.remove(startingWindow);
-                        addWindowToListInOrderLocked(startingWindow);
+                        addWindowToListInOrderLocked(startingWindow, true);
                         wtoken.allAppWindows.add(startingWindow);
                         
                         // Propagate other interesting state between the
@@ -2487,26 +2549,30 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
         return 0;
     }
 
-    private final int reAddAppWindowsLocked(int index, WindowToken token) {
-        final int NW = token.windows.size();
-        for (int i=0; i<NW; i++) {
-            WindowState win = token.windows.get(i);
-            final int NCW = win.mChildWindows.size();
-            boolean added = false;
-            for (int j=0; j<NCW; j++) {
-                WindowState cwin = (WindowState)win.mChildWindows.get(j);
-                if (cwin.mSubLayer >= 0) {
-                    mWindows.add(index, win);
-                    index++;
-                    added = true;
-                }
-                mWindows.add(index, cwin);
-                index++;
-            }
-            if (!added) {
+    private final int reAddWindowLocked(int index, WindowState win) {
+        final int NCW = win.mChildWindows.size();
+        boolean added = false;
+        for (int j=0; j<NCW; j++) {
+            WindowState cwin = (WindowState)win.mChildWindows.get(j);
+            if (cwin.mSubLayer >= 0) {
                 mWindows.add(index, win);
                 index++;
+                added = true;
             }
+            mWindows.add(index, cwin);
+            index++;
+        }
+        if (!added) {
+            mWindows.add(index, win);
+            index++;
+        }
+        return index;
+    }
+    
+    private final int reAddAppWindowsLocked(int index, WindowToken token) {
+        final int NW = token.windows.size();
+        for (int i=0; i<NW; i++) {
+            index = reAddWindowLocked(index, token.windows.get(i));
         }
         return index;
     }
@@ -4921,6 +4987,7 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
         final int mBaseLayer;
         final int mSubLayer;
         final boolean mLayoutAttached;
+        final boolean mIsImWindow;
         int mViewVisibility;
         boolean mPolicyVisibility = true;
         boolean mAppFreezing;
@@ -5071,6 +5138,7 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
                 mDeathRecipient = null;
                 mAttachedWindow = null;
                 mLayoutAttached = false;
+                mIsImWindow = false;
                 mBaseLayer = 0;
                 mSubLayer = 0;
                 return;
@@ -5089,6 +5157,8 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
                 mAttachedWindow.mChildWindows.add(this);
                 mLayoutAttached = mAttrs.type !=
                         WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
+                mIsImWindow = attachedWindow.mAttrs.type == TYPE_INPUT_METHOD
+                        || attachedWindow.mAttrs.type == TYPE_INPUT_METHOD_DIALOG;
             } else {
                 // The multiplier here is to reserve space for multiple
                 // windows in the same type layer.
@@ -5098,6 +5168,8 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
                 mSubLayer = 0;
                 mAttachedWindow = null;
                 mLayoutAttached = false;
+                mIsImWindow = mAttrs.type == TYPE_INPUT_METHOD
+                        || mAttrs.type == TYPE_INPUT_METHOD_DIALOG;
             }
 
             WindowState appWin = this;
@@ -5887,7 +5959,8 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
                   + " mClient=" + mClient.asBinder());
             pw.println(prefix + "mAttrs=" + mAttrs);
             pw.println(prefix + "mAttachedWindow=" + mAttachedWindow
-                    + " mLayoutAttached=" + mLayoutAttached);
+                    + " mLayoutAttached=" + mLayoutAttached
+                    + " mIsImWindow=" + mIsImWindow);
             pw.println(prefix + "mBaseLayer=" + mBaseLayer
                   + " mSubLayer=" + mSubLayer
                   + " mAnimLayer=" + mLayer + "+"
@@ -6807,11 +6880,7 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo
         
         for (i=0; i<N; i++) {
             WindowState w = (WindowState)mWindows.get(i);
-            if (w.mBaseLayer == curBaseLayer) {
-                curLayer += WINDOW_LAYER_MULTIPLIER;
-                w.mLayer = curLayer;
-            } else if (w.mAttrs.type == TYPE_INPUT_METHOD
-                    || w.mAttrs.type == TYPE_INPUT_METHOD_DIALOG) {
+            if (w.mBaseLayer == curBaseLayer || w.mIsImWindow) {
                 curLayer += WINDOW_LAYER_MULTIPLIER;
                 w.mLayer = curLayer;
             } else {
index d2149f1..d0c2dac 100644 (file)
@@ -1457,6 +1457,13 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
         return proc;
     }
 
+    private boolean isNextTransitionForward() {
+        int transit = mWindowManager.getPendingAppTransition();
+        return transit == WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN
+                || transit == WindowManagerPolicy.TRANSIT_TASK_OPEN
+                || transit == WindowManagerPolicy.TRANSIT_TASK_TO_FRONT;
+    }
+    
     private final boolean realStartActivityLocked(HistoryRecord r,
             ProcessRecord app, boolean andResume, boolean checkConfig)
             throws RemoteException {
@@ -1506,7 +1513,8 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
                         r.task.taskId, r.shortComponentName);
             }
             app.thread.scheduleLaunchActivity(new Intent(r.intent), r,
-                    r.info, r.icicle, results, newIntents, !andResume);
+                    r.info, r.icicle, results, newIntents, !andResume,
+                    isNextTransitionForward());
         } catch (RemoteException e) {
             if (r.launchFailed) {
                 // This is the second time we failed -- finish activity
@@ -2271,7 +2279,8 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
                         System.identityHashCode(next),
                         next.task.taskId, next.shortComponentName);
                 
-                next.app.thread.scheduleResumeActivity(next);
+                next.app.thread.scheduleResumeActivity(next,
+                        isNextTransitionForward());
                 pauseIfSleepingLocked();
 
             } catch (Exception e) {
index 31f55c8..2d2faeb 100644 (file)
@@ -1476,7 +1476,8 @@ public class StatusBarService extends IStatusBar.Stub
         lp.type = WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL;
         lp.flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                 | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
-                | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
+                | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+                | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
         lp.format = pixelFormat;
         lp.gravity = Gravity.TOP | Gravity.FILL_HORIZONTAL;
         lp.setTitle("StatusBarExpanded");
index 3f4bb5c..f314944 100644 (file)
@@ -59,7 +59,7 @@ import com.android.internal.telephony.PhoneNotifier;
 import com.android.internal.telephony.PhoneSubInfo;
 import com.android.internal.telephony.SimCard;
 import com.android.internal.telephony.gsm.SimException;
-import com.android.internal.telephony.gsm.stk.Service;
+import com.android.internal.telephony.gsm.stk.StkService;
 import com.android.internal.telephony.test.SimulatedRadioControl;
 
 import java.io.IOException;
@@ -102,7 +102,7 @@ public class GSMPhone extends PhoneBase {
     SIMFileHandler mSIMFileHandler;
     SIMRecords mSIMRecords;
     GsmSimCard mSimCard;
-    Service mStkService;
+    StkService mStkService;
     MyHandler h;
     ArrayList <GsmMmiCode> mPendingMMIs = new ArrayList<GsmMmiCode>();
     SimPhoneBookInterfaceManager mSimPhoneBookIntManager;
@@ -182,7 +182,7 @@ public class GSMPhone extends PhoneBase {
             mSimSmsIntManager = new SimSmsInterfaceManager(this);
             mSubInfo = new PhoneSubInfo(this);
         }
-        mStkService = Service.getInstance(mCM, mSIMRecords, mContext,
+        mStkService = StkService.getInstance(mCM, mSIMRecords, mContext,
                 mSIMFileHandler, mSimCard);
                 
         mCM.registerForAvailable(h, EVENT_RADIO_AVAILABLE, null);
index 0d56fb7..eb354e9 100644 (file)
@@ -28,7 +28,7 @@ import java.util.List;
 
 /**
  * Factory class, used for decoding raw byte arrays, received from baseband,
- * into a CommandParams object. 
+ * into a CommandParams object.
  *
  */
 class CommandParamsFactory extends Handler {
@@ -36,7 +36,7 @@ class CommandParamsFactory extends Handler {
     private IconLoader mIconLoader;
     private CommandParams mCmdParams = null;
     private int mIconLoadState = LOAD_NO_ICON;
-    private Handler mCaller = null;
+    private RilMessageDecoder mCaller = null;
 
     // constants
     static final int MSG_ID_LOAD_ICON_DONE = 1;
@@ -52,7 +52,7 @@ class CommandParamsFactory extends Handler {
     static final int REFRESH_NAA_INIT                       = 0x03;
     static final int REFRESH_UICC_RESET                     = 0x04;
 
-    static synchronized CommandParamsFactory getInstance(Handler caller,
+    static synchronized CommandParamsFactory getInstance(RilMessageDecoder caller,
             SIMFileHandler fh) {
         if (sInstance != null) {
             return sInstance;
@@ -63,7 +63,7 @@ class CommandParamsFactory extends Handler {
         return null;
     }
 
-    private CommandParamsFactory(Handler caller, SIMFileHandler fh) {
+    private CommandParamsFactory(RilMessageDecoder caller, SIMFileHandler fh) {
         mCaller = caller;
         mIconLoader = IconLoader.getInstance(this, fh);
     }
@@ -107,7 +107,7 @@ class CommandParamsFactory extends Handler {
             return;
         }
 
-        // extract command type enumeration from the raw value stored inside  
+        // extract command type enumeration from the raw value stored inside
         // the Command Details object.
         AppInterface.CommandType cmdType = AppInterface.CommandType
                 .fromInt(cmdDet.typeOfCommand);
@@ -203,18 +203,15 @@ class CommandParamsFactory extends Handler {
     }
 
     private void sendCmdParams(ResultCode resCode) {
-        Message msg = mCaller.obtainMessage(RilMessageDecoder.CMD_PARAMS_READY);
-        msg.arg1 = resCode.value();
-        msg.obj = mCmdParams;
-        msg.sendToTarget();
+        mCaller.sendMessageParamsDecoded(resCode, mCmdParams);
     }
 
     /**
      * Search for a COMPREHENSION-TLV object with the given tag from a list
-     * 
+     *
      * @param tag A tag to search for
      * @param ctlvs List of ComprehensionTlv objects used to search in
-     * 
+     *
      * @return A ComprehensionTlv object that has the tag value of {@code tag}.
      *         If no object is found with the tag, null is returned.
      */
@@ -229,10 +226,10 @@ class CommandParamsFactory extends Handler {
      * list iterated by {@code iter}. {@code iter} points to the object next to
      * the found object when this method returns. Used for searching the same
      * list for similar tags, usually item id.
-     * 
+     *
      * @param tag A tag to search for
      * @param iter Iterator for ComprehensionTlv objects used for search
-     * 
+     *
      * @return A ComprehensionTlv object that has the tag value of {@code tag}.
      *         If no object is found with the tag, null is returned.
      */
@@ -250,11 +247,11 @@ class CommandParamsFactory extends Handler {
 
     /**
      * Processes DISPLAY_TEXT proactive command from the SIM card.
-     * 
+     *
      * @param cmdDet Command Details container object.
      * @param ctlvs List of ComprehensionTlv objects following Command Details
      *        object and Device Identities object within the proactive command
-     * @return true if the command is processing is pending and additional 
+     * @return true if the command is processing is pending and additional
      *         asynchronous processing is required.
      * @throws ResultException
      */
@@ -272,7 +269,7 @@ class CommandParamsFactory extends Handler {
         if (ctlv != null) {
             textMsg.text = ValueParser.retrieveTextString(ctlv);
         }
-        // If the tlv object doesn't exist or the it is a null object reply 
+        // If the tlv object doesn't exist or the it is a null object reply
         // with command not understood.
         if (textMsg.text == null) {
             throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD);
@@ -311,7 +308,7 @@ class CommandParamsFactory extends Handler {
 
     /**
      * Processes SET_UP_IDLE_MODE_TEXT proactive command from the SIM card.
-     * 
+     *
      * @param cmdDet Command Details container object.
      * @param ctlvs List of ComprehensionTlv objects following Command Details
      *        object and Device Identities object within the proactive command
@@ -354,7 +351,7 @@ class CommandParamsFactory extends Handler {
 
     /**
      * Processes GET_INKEY proactive command from the SIM card.
-     * 
+     *
      * @param cmdDet Command Details container object.
      * @param ctlvs List of ComprehensionTlv objects following Command Details
      *        object and Device Identities object within the proactive command
@@ -366,7 +363,7 @@ class CommandParamsFactory extends Handler {
             List<ComprehensionTlv> ctlvs) throws ResultException {
 
         StkLog.d(this, "process GetInkey");
-        
+
         Input input = new Input();
         IconId iconId = null;
 
@@ -404,7 +401,7 @@ class CommandParamsFactory extends Handler {
 
     /**
      * Processes GET_INPUT proactive command from the SIM card.
-     * 
+     *
      * @param cmdDet Command Details container object.
      * @param ctlvs List of ComprehensionTlv objects following Command Details
      *        object and Device Identities object within the proactive command
@@ -471,7 +468,7 @@ class CommandParamsFactory extends Handler {
 
     /**
      * Processes REFRESH proactive command from the SIM card.
-     * 
+     *
      * @param cmdDet Command Details container object.
      * @param ctlvs List of ComprehensionTlv objects following Command Details
      *        object and Device Identities object within the proactive command
@@ -482,8 +479,8 @@ class CommandParamsFactory extends Handler {
         StkLog.d(this, "process Refresh");
 
         // REFRESH proactive command is rerouted by the baseband and handled by
-        // the telephony layer. IDLE TEXT should be removed for a REFRESH command 
-        // with "initialization" or "reset" 
+        // the telephony layer. IDLE TEXT should be removed for a REFRESH command
+        // with "initialization" or "reset"
         switch (cmdDet.commandQualifier) {
         case REFRESH_NAA_INIT_AND_FULL_FILE_CHANGE:
         case REFRESH_NAA_INIT_AND_FILE_CHANGE:
@@ -497,11 +494,11 @@ class CommandParamsFactory extends Handler {
 
     /**
      * Processes SELECT_ITEM proactive command from the SIM card.
-     * 
+     *
      * @param cmdDet Command Details container object.
      * @param ctlvs List of ComprehensionTlv objects following Command Details
      *        object and Device Identities object within the proactive command
-     * @return true if the command is processing is pending and additional 
+     * @return true if the command is processing is pending and additional
      *         asynchronous processing is required.
      * @throws ResultException
      */
@@ -595,7 +592,7 @@ class CommandParamsFactory extends Handler {
 
     /**
      * Processes EVENT_NOTIFY message from baseband.
-     * 
+     *
      * @param cmdDet Command Details container object.
      * @param ctlvs List of ComprehensionTlv objects following Command Details
      *        object and Device Identities object within the proactive command
@@ -805,7 +802,7 @@ class CommandParamsFactory extends Handler {
 
     /**
      * Processes SETUP_CALL proactive command from the SIM card.
-     * 
+     *
      * @param cmdDet Command Details object retrieved from the proactive command
      *        object
      * @param ctlvs List of ComprehensionTlv objects following Command Details
@@ -866,4 +863,4 @@ class CommandParamsFactory extends Handler {
         }
         return false;
     }
-}
\ No newline at end of file
+}
index c890d1c..5d82473 100644 (file)
@@ -30,6 +30,10 @@ import android.os.Message;
  */
 class RilMessageDecoder extends HandlerStateMachine {
 
+    // constants
+    private static final int START = 1;
+    private static final int CMD_PARAMS_READY = 2;
+
     // members
     private static RilMessageDecoder sInstance = null;
     private CommandParamsFactory mCmdParamsFactory = null;
@@ -40,27 +44,61 @@ class RilMessageDecoder extends HandlerStateMachine {
     private StateStart mStateStart = new StateStart();
     private StateCmdParamsReady mStateCmdParamsReady = new StateCmdParamsReady();
 
-    // constants
-    static final int START = 1;
-    static final int CMD_PARAMS_READY = 2;
-
-    static synchronized RilMessageDecoder getInstance(Handler caller, SIMFileHandler fh) {
+    /**
+     * Get the singleton instance, constructing if necessary.
+     *
+     * @param caller
+     * @param fh
+     * @return RilMesssageDecoder
+     */
+    public static synchronized RilMessageDecoder getInstance(Handler caller, SIMFileHandler fh) {
         if (sInstance == null) {
             sInstance = new RilMessageDecoder(caller, fh);
         }
         return sInstance;
     }
 
+    /**
+     * Start decoding the message parameters,
+     * when complete MSG_ID_RIL_MSG_DECODED will be returned to caller.
+     *
+     * @param rilMsg
+     */
+    public void sendStartDecodingMessageParams(RilMessage rilMsg) {
+        Message msg = obtainMessage(START);
+        msg.obj = rilMsg;
+        sendMessage(msg);
+    }
+
+    /**
+     * The command parameters have been decoded.
+     *
+     * @param resCode
+     * @param cmdParams
+     */
+    public void sendMessageParamsDecoded(ResultCode resCode, CommandParams cmdParams) {
+        Message msg = obtainMessage(RilMessageDecoder.CMD_PARAMS_READY);
+        msg.arg1 = resCode.value();
+        msg.obj = cmdParams;
+        sendMessage(msg);
+    }
+
+    private void sendCmdForExecution(RilMessage rilMsg) {
+        Message msg = mCaller.obtainMessage(StkService.MSG_ID_RIL_MSG_DECODED,
+                new RilMessage(rilMsg));
+        msg.sendToTarget();
+    }
+
     private RilMessageDecoder(Handler caller, SIMFileHandler fh) {
         super("RilMessageDecoder");
         setDbg(false);
         setInitialState(mStateStart);
 
         mCaller = caller;
-        mCmdParamsFactory = CommandParamsFactory.getInstance(this.getHandler(), fh);
+        mCmdParamsFactory = CommandParamsFactory.getInstance(this, fh);
     }
 
-    class StateStart extends HandlerState {
+    private class StateStart extends HandlerState {
         @Override public void processMessage(Message msg) {
             if (msg.what == START) {
                 if (decodeMessageParams((RilMessage)msg.obj)) {
@@ -73,7 +111,7 @@ class RilMessageDecoder extends HandlerStateMachine {
         }
     }
 
-    class StateCmdParamsReady extends HandlerState {
+    private class StateCmdParamsReady extends HandlerState {
         @Override public void processMessage(Message msg) {
             if (msg.what == CMD_PARAMS_READY) {
                 mCurrentRilMessage.mResCode = ResultCode.fromInt(msg.arg1);
@@ -88,26 +126,20 @@ class RilMessageDecoder extends HandlerStateMachine {
         }
     }
 
-    public void startDecodingMessageParams(RilMessage rilMsg) {
-        Message msg = obtainMessage(START);
-        msg.obj = rilMsg;
-        sendMessage(msg);
-    }
-
     private boolean decodeMessageParams(RilMessage rilMsg) {
         boolean decodingStarted;
 
         mCurrentRilMessage = rilMsg;
         switch(rilMsg.mId) {
-        case Service.MSG_ID_SESSION_END:
-        case Service.MSG_ID_CALL_SETUP:
+        case StkService.MSG_ID_SESSION_END:
+        case StkService.MSG_ID_CALL_SETUP:
             mCurrentRilMessage.mResCode = ResultCode.OK;
             sendCmdForExecution(mCurrentRilMessage);
             decodingStarted = false;
             break;
-        case Service.MSG_ID_PROACTIVE_COMMAND:
-        case Service.MSG_ID_EVENT_NOTIFY:
-        case Service.MSG_ID_REFRESH:
+        case StkService.MSG_ID_PROACTIVE_COMMAND:
+        case StkService.MSG_ID_EVENT_NOTIFY:
+        case StkService.MSG_ID_REFRESH:
             byte[] rawData = null;
             try {
                 rawData = SimUtils.hexStringToBytes((String) rilMsg.mData);
@@ -134,10 +166,4 @@ class RilMessageDecoder extends HandlerStateMachine {
         }
         return decodingStarted;
     }
-
-    private void sendCmdForExecution(RilMessage rilMsg) {
-        Message msg = mCaller.obtainMessage(Service.MSG_ID_RIL_MSG_DECODED,
-                new RilMessage(rilMsg));
-        msg.sendToTarget();
-    }
 }
@@ -38,32 +38,32 @@ import java.util.concurrent.LinkedBlockingQueue;
 /**
  * Enumeration for representing the tag value of COMPREHENSION-TLV objects. If
  * you want to get the actual value, call {@link #value() value} method.
- * 
+ *
  * {@hide}
  */
 enum ComprehensionTlvTag {
-    COMMAND_DETAILS(0x01), 
-    DEVICE_IDENTITIES(0x02), 
-    RESULT(0x03), 
-    DURATION(0x04), 
-    ALPHA_ID(0x05), 
-    USSD_STRING(0x0a), 
-    TEXT_STRING(0x0d), 
-    TONE(0x0e), 
-    ITEM(0x0f), 
-    ITEM_ID(0x10), 
-    RESPONSE_LENGTH(0x11), 
-    FILE_LIST(0x12), 
-    HELP_REQUEST(0x15), 
-    DEFAULT_TEXT(0x17), 
-    EVENT_LIST(0x19), 
-    ICON_ID(0x1e),
-    ITEM_ICON_ID_LIST(0x1f),
-    IMMEDIATE_RESPONSE(0x2b), 
-    LANGUAGE(0x2d), 
-    URL(0x31),
-    BROWSER_TERMINATION_CAUSE(0x34), 
-    TEXT_ATTRIBUTE(0x50);
+  COMMAND_DETAILS(0x01),
+  DEVICE_IDENTITIES(0x02),
+  RESULT(0x03),
+  DURATION(0x04),
+  ALPHA_ID(0x05),
+  USSD_STRING(0x0a),
+  TEXT_STRING(0x0d),
+  TONE(0x0e),
+  ITEM(0x0f),
+  ITEM_ID(0x10),
+  RESPONSE_LENGTH(0x11),
+  FILE_LIST(0x12),
+  HELP_REQUEST(0x15),
+  DEFAULT_TEXT(0x17),
+  EVENT_LIST(0x19),
+  ICON_ID(0x1e),
+  ITEM_ICON_ID_LIST(0x1f),
+  IMMEDIATE_RESPONSE(0x2b),
+  LANGUAGE(0x2d),
+  URL(0x31),
+  BROWSER_TERMINATION_CAUSE(0x34),
+  TEXT_ATTRIBUTE(0x50);
 
     private int mValue;
 
@@ -73,7 +73,7 @@ enum ComprehensionTlvTag {
 
     /**
      * Returns the actual value of this COMPREHENSION-TLV object.
-     * 
+     *
      * @return Actual tag value of this object
      */
         public int value() {
@@ -110,13 +110,13 @@ class RilMessage {
 /**
  * Class that implements SIM Toolkit Telephony Service. Interacts with the RIL
  * and application.
- * 
+ *
  * {@hide}
  */
-public class Service extends Handler implements AppInterface {
+public class StkService extends Handler implements AppInterface {
 
     // Service members.
-    private static Service sInstance;
+    private static StkService sInstance;
     private CommandsInterface mCmdIf;
     private SIMRecords mSimRecords;
     private Context mContext;
@@ -146,7 +146,7 @@ public class Service extends Handler implements AppInterface {
     private static final int DEV_ID_NETWORK     = 0x83;
 
     /* Intentionally private for singleton */
-    private Service(CommandsInterface ci, SIMRecords sr, Context context,
+    private StkService(CommandsInterface ci, SIMRecords sr, Context context,
             SIMFileHandler fh, GsmSimCard sc) {
         if (ci == null || sr == null || context == null || fh == null
                 || sc == null) {
@@ -221,7 +221,7 @@ public class Service extends Handler implements AppInterface {
     /**
      * Handles RIL_UNSOL_STK_PROACTIVE_COMMAND unsolicited command from RIL.
      * Sends valid proactive command data to the application using intents.
-     * 
+     *
      */
     private void handleProactiveCommand(CommandParams cmdParams) {
         StkLog.d(this, cmdParams.getCommandType().name());
@@ -230,7 +230,7 @@ public class Service extends Handler implements AppInterface {
         switch (cmdParams.getCommandType()) {
         case SET_UP_MENU:
             if (removeMenu(cmdMsg.getMenu())) {
-                mMenuCmd = null; 
+                mMenuCmd = null;
             } else {
                 mMenuCmd = cmdMsg;
             }
@@ -238,7 +238,7 @@ public class Service extends Handler implements AppInterface {
                     null);
             break;
         case DISPLAY_TEXT:
-            // when application is not required to respond, send an immediate 
+            // when application is not required to respond, send an immediate
             // response.
             if (!cmdMsg.geTextMessage().responseNeeded) {
                 sendTerminalResponse(cmdParams.cmdDet, ResultCode.OK, false,
@@ -246,7 +246,7 @@ public class Service extends Handler implements AppInterface {
             }
             break;
         case REFRESH:
-            // ME side only handles refresh commands which meant to remove IDLE 
+            // ME side only handles refresh commands which meant to remove IDLE
             // MODE TEXT.
             cmdParams.cmdDet.typeOfCommand = CommandType.SET_UP_IDLE_MODE_TEXT
                     .value();
@@ -279,7 +279,7 @@ public class Service extends Handler implements AppInterface {
 
     /**
      * Handles RIL_UNSOL_STK_SESSION_END unsolicited command from RIL.
-     * 
+     *
      */
     private void handleSessionEnd() {
         StkLog.d(this, "SESSION END");
@@ -430,15 +430,15 @@ public class Service extends Handler implements AppInterface {
 
     /**
      * Used for instantiating the Service from the GsmPhone constructor.
-     * 
+     *
      * @param ci CommandsInterface object
      * @param sr SIMRecords object
      * @param context phone app context
      * @param fh SIM file handler
-     * @param sc GSM SIM card 
+     * @param sc GSM SIM card
      * @return The only Service object in the system
      */
-    public static Service getInstance(CommandsInterface ci, SIMRecords sr,
+    public static StkService getInstance(CommandsInterface ci, SIMRecords sr,
             Context context, SIMFileHandler fh, GsmSimCard sc) {
         if (sInstance == null) {
             if (ci == null || sr == null || context == null || fh == null
@@ -447,14 +447,14 @@ public class Service extends Handler implements AppInterface {
             }
             HandlerThread thread = new HandlerThread("Stk Telephony service");
             thread.start();
-            sInstance = new Service(ci, sr, context, fh, sc);
+            sInstance = new StkService(ci, sr, context, fh, sc);
         }
         return sInstance;
     }
 
     /**
      * Used by application to get an AppInterface object.
-     * 
+     *
      * @return The only Service object in the system
      */
     public static AppInterface getInstance() {
@@ -481,10 +481,10 @@ public class Service extends Handler implements AppInterface {
                     }
                 }
             }
-            mMsgDecoder.startDecodingMessageParams(new RilMessage(msg.what, data));
+            mMsgDecoder.sendStartDecodingMessageParams(new RilMessage(msg.what, data));
             break;
         case MSG_ID_CALL_SETUP:
-            mMsgDecoder.startDecodingMessageParams(new RilMessage(msg.what, null));
+            mMsgDecoder.sendStartDecodingMessageParams(new RilMessage(msg.what, null));
             break;
         case MSG_ID_SIM_LOADED:
             break;
index f2bff4d..5f62983 100644 (file)
@@ -47,6 +47,7 @@ public class LocationManagerProximityTest extends AndroidTestCase {
     private PendingIntent mPendingIntent;
     private TestIntentReceiver mIntentReceiver;
     private String mOriginalAllowedProviders;
+    private int mOriginalMocksAllowed;
 
     private static final String LOG_TAG = "LocationProximityTest";
 
@@ -59,6 +60,15 @@ public class LocationManagerProximityTest extends AndroidTestCase {
     @Override
     protected void setUp() throws Exception {
         super.setUp();
+        
+        // allow mock locations
+        mOriginalMocksAllowed =
+            android.provider.Settings.Secure.getInt(getContext().getContentResolver(),
+                android.provider.Settings.Secure.ALLOW_MOCK_LOCATION, 0);
+        
+        android.provider.Settings.Secure.putInt(getContext().getContentResolver(),
+                android.provider.Settings.Secure.ALLOW_MOCK_LOCATION, 1);
+        
         mOriginalAllowedProviders = 
             android.provider.Settings.Secure.getString(
                     getContext().getContentResolver(), 
@@ -100,6 +110,9 @@ public class LocationManagerProximityTest extends AndroidTestCase {
             getContext().unregisterReceiver(mIntentReceiver);
         }
         
+        android.provider.Settings.Secure.putInt(getContext().getContentResolver(),
+                android.provider.Settings.Secure.ALLOW_MOCK_LOCATION, mOriginalMocksAllowed);
+        
         if (mOriginalAllowedProviders != null) {
             // restore original settings
             android.provider.Settings.Secure.putString(
@@ -107,7 +120,7 @@ public class LocationManagerProximityTest extends AndroidTestCase {
                     android.provider.Settings.Secure.LOCATION_PROVIDERS_ALLOWED, 
                     mOriginalAllowedProviders);
             mLocationManager.updateProviders();
-        }    
+        }
     }
 
     /**
index 5a73759..91597d5 100644 (file)
@@ -87,7 +87,10 @@ public class FileFilter {
         "font-face-implicit-local-font.html",
         "font-face-locally-installed.html",
         "beforeSelectorOnCodeElement.html",
-        "cssTarget-crash.html"
+        "cssTarget-crash.html",
+        "searchfield-heights.html", // Bug 1570692
+        "tabindex-focus-blur-all.html",
+        "search-rtl.html" // fast/forms/search-rtl.html
         };
     
     static void fillIgnoreResultSet() {
diff --git a/tests/FrameworkTest/tests/src/android/content/AbstractTableMergerTest.java b/tests/FrameworkTest/tests/src/android/content/AbstractTableMergerTest.java
new file mode 100644 (file)
index 0000000..aa3d186
--- /dev/null
@@ -0,0 +1,578 @@
+package android.content;
+
+import com.google.android.collect.Lists;
+import com.google.android.collect.Sets;
+
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.net.Uri;
+import android.test.AndroidTestCase;
+import android.text.TextUtils;
+
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.SortedSet;
+
+/** Unit test for {@link android.content.AbstractTableMerger}. */
+public class AbstractTableMergerTest extends AndroidTestCase {
+    MockSyncableContentProvider mRealProvider;
+    MockSyncableContentProvider mTempProvider;
+    MockTableMerger mMerger;
+    MockSyncContext mSyncContext;
+
+    static final String TABLE_NAME = "items";
+    static final String DELETED_TABLE_NAME = "deleted_items";
+    static final Uri CONTENT_URI = Uri.parse("content://testdata");
+    static final Uri TABLE_URI = Uri.withAppendedPath(CONTENT_URI, TABLE_NAME);
+    static final Uri DELETED_TABLE_URI = Uri.withAppendedPath(CONTENT_URI, DELETED_TABLE_NAME);
+
+    private final String ACCOUNT = "account@goo.com";
+
+    private final ArrayList<Expectation> mExpectations = Lists.newArrayList();
+
+    static class Expectation {
+        enum Type {
+            UPDATE,
+            INSERT,
+            DELETE,
+            RESOLVE
+        }
+
+        Type mType;
+        ContentValues mValues;
+        Long mLocalRowId;
+
+        Expectation(Type type, Long localRowId, ContentValues values) {
+            mType = type;
+            mValues = values;
+            mLocalRowId = localRowId;
+            if (type == Type.DELETE) {
+                assertNull(values);
+            } else {
+                assertFalse(values.containsKey("_id"));
+            }
+        }
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mSyncContext = new MockSyncContext();
+        mRealProvider = new MockSyncableContentProvider();
+        mTempProvider = mRealProvider.getTemporaryInstance();
+        mMerger = new MockTableMerger(mRealProvider.getDatabase(),
+                TABLE_NAME, TABLE_URI, DELETED_TABLE_NAME, DELETED_TABLE_URI);
+        mExpectations.clear();
+    }
+
+    ContentValues newValues(String data, String syncId, String syncAccount,
+            String syncTime, String syncVersion, Long syncLocalId) {
+        ContentValues values = new ContentValues();
+        if (data != null) values.put("data", data);
+        if (syncTime != null) values.put("_sync_time", syncTime);
+        if (syncVersion != null) values.put("_sync_version", syncVersion);
+        if (syncId != null) values.put("_sync_id", syncId);
+        if (syncAccount != null) values.put("_sync_account", syncAccount);
+        values.put("_sync_local_id", syncLocalId);
+        values.put("_sync_dirty", 0);
+        return values;
+    }
+
+    ContentValues newDeletedValues(String syncId, String syncAccount, String syncVersion,
+            Long syncLocalId) {
+        ContentValues values = new ContentValues();
+        if (syncVersion != null) values.put("_sync_version", syncVersion);
+        if (syncId != null) values.put("_sync_id", syncId);
+        if (syncAccount != null) values.put("_sync_account", syncAccount);
+        if (syncLocalId != null) values.put("_sync_local_id", syncLocalId);
+        return values;
+    }
+
+    ContentValues newModifyData(String data) {
+        ContentValues values = new ContentValues();
+        values.put("data", data);
+        values.put("_sync_dirty", 1);
+        return values;
+    }
+
+    // Want to test adding, changing, deleting entries to a provider that has extra entries
+    // before and after the entries being changed.
+    public void testInsert() {
+        // add rows to the real provider
+        // add new row to the temp provider
+        final ContentValues row1 = newValues("d1", "si1", ACCOUNT, "st1", "sv1", null);
+        mTempProvider.insert(TABLE_URI, row1);
+
+        // add expected callbacks to merger
+        mExpectations.add(new Expectation(Expectation.Type.INSERT, null /* syncLocalId */, row1));
+
+        // run merger
+        SyncResult syncResult = new SyncResult();
+        mMerger.mergeServerDiffs(mSyncContext, ACCOUNT, mTempProvider, syncResult);
+
+        // check that all expectations were met
+        assertEquals("not all expectations were met", 0, mExpectations.size());
+    }
+
+    public void testUpdateWithLocalId() {
+        // add rows to the real provider
+        // add new row to the temp provider that matches an unsynced row in the real provider
+        final ContentValues row1 = newValues("d1", "si1", ACCOUNT, "st1", "sv1", 11L);
+        mTempProvider.insert(TABLE_URI, row1);
+
+        // add expected callbacks to merger
+        mExpectations.add(new Expectation(Expectation.Type.UPDATE, 11L, row1));
+
+        // run merger
+        SyncResult syncResult = new SyncResult();
+        mMerger.mergeServerDiffs(mSyncContext, ACCOUNT, mTempProvider, syncResult);
+
+        // check that all expectations were met
+        assertEquals("not all expectations were met", 0, mExpectations.size());
+    }
+
+    public void testUpdateWithoutLocalId() {
+        // add rows to the real provider
+        Uri i1 = mRealProvider.insert(TABLE_URI,
+                newValues("d1", "si1", ACCOUNT, "st1", "sv1", null));
+
+        // add new row to the temp provider that matches an unsynced row in the real provider
+        final ContentValues row1 = newValues("d2", "si1", ACCOUNT, "st2", "sv2", null);
+        mTempProvider.insert(TABLE_URI, row1);
+
+        // add expected callbacks to merger
+        mExpectations.add(new Expectation(Expectation.Type.UPDATE, ContentUris.parseId(i1), row1));
+
+        // run merger
+        SyncResult syncResult = new SyncResult();
+        mMerger.mergeServerDiffs(mSyncContext, ACCOUNT, mTempProvider, syncResult);
+
+        // check that all expectations were met
+        assertEquals("not all expectations were met", 0, mExpectations.size());
+    }
+
+    public void testResolve() {
+        // add rows to the real provider
+        Uri i1 = mRealProvider.insert(TABLE_URI,
+                newValues("d1", "si1", ACCOUNT, "st1", "sv1", null));
+        mRealProvider.update(TABLE_URI, newModifyData("d2"), null, null);
+
+        // add row to the temp provider that matches a dirty, synced row in the real provider
+        final ContentValues row1 = newValues("d3", "si1", ACCOUNT, "st2", "sv2", null);
+        mTempProvider.insert(TABLE_URI, row1);
+
+        // add expected callbacks to merger
+        mExpectations.add(new Expectation(Expectation.Type.RESOLVE, ContentUris.parseId(i1), row1));
+
+        // run merger
+        SyncResult syncResult = new SyncResult();
+        mMerger.mergeServerDiffs(mSyncContext, ACCOUNT, mTempProvider, syncResult);
+
+        // check that all expectations were met
+        assertEquals("not all expectations were met", 0, mExpectations.size());
+    }
+
+    public void testResolveWithLocalId() {
+        // add rows to the real provider
+        Uri i1 = mRealProvider.insert(TABLE_URI,
+                newValues("d1", "si1", ACCOUNT, "st1", "sv1", null));
+        mRealProvider.update(TABLE_URI, newModifyData("d2"), null, null);
+
+        // add row to the temp provider that matches a dirty, synced row in the real provider
+        ContentValues row1 = newValues("d2", "si1", ACCOUNT, "st2", "sv2", ContentUris.parseId(i1));
+        mTempProvider.insert(TABLE_URI, row1);
+
+        // add expected callbacks to merger
+        mExpectations.add(new Expectation(Expectation.Type.UPDATE, ContentUris.parseId(i1), row1));
+
+        // run merger
+        SyncResult syncResult = new SyncResult();
+        mMerger.mergeServerDiffs(mSyncContext, ACCOUNT, mTempProvider, syncResult);
+
+        // check that all expectations were met
+        assertEquals("not all expectations were met", 0, mExpectations.size());
+    }
+
+    public void testDeleteRowAfterDelete() {
+        // add rows to the real provider
+        Uri i1 = mRealProvider.insert(TABLE_URI,
+                newValues("d1", "si1", ACCOUNT, "st1", "sv1", null));
+
+        // add a deleted record to the temp provider
+        ContentValues row1 = newDeletedValues(null, null, null, ContentUris.parseId(i1));
+        mTempProvider.insert(DELETED_TABLE_URI, row1);
+
+        // add expected callbacks to merger
+        mExpectations.add(new Expectation(Expectation.Type.DELETE, ContentUris.parseId(i1), null));
+
+        // run merger
+        SyncResult syncResult = new SyncResult();
+        mMerger.mergeServerDiffs(mSyncContext, ACCOUNT, mTempProvider, syncResult);
+
+        // check that all expectations were met
+        assertEquals("not all expectations were met", 0, mExpectations.size());
+    }
+
+    public void testDeleteRowAfterInsert() {
+        // add rows to the real provider
+        Uri i1 = mRealProvider.insert(TABLE_URI, newModifyData("d1"));
+
+        // add a deleted record to the temp provider
+        ContentValues row1 = newDeletedValues(null, null, null, ContentUris.parseId(i1));
+        mTempProvider.insert(DELETED_TABLE_URI, row1);
+
+        // add expected callbacks to merger
+        mExpectations.add(new Expectation(Expectation.Type.DELETE, ContentUris.parseId(i1), null));
+
+        // run merger
+        SyncResult syncResult = new SyncResult();
+        mMerger.mergeServerDiffs(mSyncContext, ACCOUNT, mTempProvider, syncResult);
+
+        // check that all expectations were met
+        assertEquals("not all expectations were met", 0, mExpectations.size());
+    }
+
+    public void testDeleteRowAfterUpdate() {
+        // add rows to the real provider
+        Uri i1 = mRealProvider.insert(TABLE_URI,
+                newValues("d1", "si1", ACCOUNT, "st1", "sv1", null));
+
+        // add a deleted record to the temp provider
+        ContentValues row1 = newDeletedValues("si1", ACCOUNT, "sv1", ContentUris.parseId(i1));
+        mTempProvider.insert(DELETED_TABLE_URI, row1);
+
+        // add expected callbacks to merger
+        mExpectations.add(new Expectation(Expectation.Type.DELETE, ContentUris.parseId(i1), null));
+
+        // run merger
+        SyncResult syncResult = new SyncResult();
+        mMerger.mergeServerDiffs(mSyncContext, ACCOUNT, mTempProvider, syncResult);
+
+        // check that all expectations were met
+        assertEquals("not all expectations were met", 0, mExpectations.size());
+    }
+
+    public void testDeleteRowFromServer() {
+        // add rows to the real provider
+        Uri i1 = mRealProvider.insert(TABLE_URI,
+                newValues("d1", "si1", ACCOUNT, "st1", "sv1", null));
+
+        // add a deleted record to the temp provider
+        ContentValues row1 = newDeletedValues("si1", ACCOUNT, "sv1", null);
+        mTempProvider.insert(DELETED_TABLE_URI, row1);
+
+        // add expected callbacks to merger
+        mExpectations.add(new Expectation(Expectation.Type.DELETE, ContentUris.parseId(i1), null));
+
+        // run merger
+        SyncResult syncResult = new SyncResult();
+        mMerger.mergeServerDiffs(mSyncContext, ACCOUNT, mTempProvider, syncResult);
+
+        // check that all expectations were met
+        assertEquals("not all expectations were met", 0, mExpectations.size());
+    }
+
+    class MockTableMerger extends AbstractTableMerger {
+        public MockTableMerger(SQLiteDatabase database, String table, Uri tableURL,
+                String deletedTable, Uri deletedTableURL) {
+            super(database, table, tableURL, deletedTable, deletedTableURL);
+        }
+
+        public void insertRow(ContentProvider diffs, Cursor diffsCursor) {
+            Expectation expectation = mExpectations.remove(0);
+            checkExpectation(expectation,
+                    Expectation.Type.INSERT, null /* syncLocalId */, diffsCursor);
+        }
+
+        public void updateRow(long localPersonID, ContentProvider diffs, Cursor diffsCursor) {
+            Expectation expectation = mExpectations.remove(0);
+            checkExpectation(expectation, Expectation.Type.UPDATE, localPersonID, diffsCursor);
+        }
+
+        public void resolveRow(long localPersonID, String syncID, ContentProvider diffs,
+                Cursor diffsCursor) {
+            Expectation expectation = mExpectations.remove(0);
+            checkExpectation(expectation, Expectation.Type.RESOLVE, localPersonID, diffsCursor);
+        }
+
+        @Override
+        public void deleteRow(Cursor cursor) {
+            Expectation expectation = mExpectations.remove(0);
+            assertEquals(expectation.mType, Expectation.Type.DELETE);
+            assertNotNull(expectation.mLocalRowId);
+            final long localRowId = cursor.getLong(cursor.getColumnIndexOrThrow("_id"));
+            assertEquals((long)expectation.mLocalRowId, localRowId);
+            cursor.moveToNext();
+            mDb.delete(TABLE_NAME, "_id=" + localRowId, null);
+        }
+
+        protected void notifyChanges() {
+            throw new UnsupportedOperationException();
+        }
+
+        void checkExpectation(Expectation expectation,
+                Expectation.Type actualType, Long localRowId,
+                Cursor cursor) {
+            assertEquals(expectation.mType, actualType);
+            assertEquals(expectation.mLocalRowId, localRowId);
+
+            final SortedSet<String> actualKeys = Sets.newSortedSet(cursor.getColumnNames());
+            final SortedSet<String> expectedKeys = Sets.newSortedSet();
+            for (Map.Entry<String, Object> entry : expectation.mValues.valueSet()) {
+                expectedKeys.add(entry.getKey());
+            }
+            actualKeys.remove("_id");
+            actualKeys.remove("_sync_mark");
+            actualKeys.remove("_sync_local_id");
+            expectedKeys.remove("_sync_local_id");
+            expectedKeys.remove("_id");
+            assertEquals("column mismatch",
+                    TextUtils.join(",", expectedKeys), TextUtils.join(",", actualKeys));
+
+//            if (localRowId != null) {
+//                assertEquals((long) localRowId,
+//                        cursor.getLong(cursor.getColumnIndexOrThrow("_sync_local_id")));
+//            } else {
+//                assertTrue("unexpected _sync_local_id, "
+//                        + cursor.getLong(cursor.getColumnIndexOrThrow("_sync_local_id")),
+//                        cursor.isNull(cursor.getColumnIndexOrThrow("_sync_local_id")));
+//            }
+
+            for (String name : cursor.getColumnNames()) {
+                if ("_id".equals(name)) {
+                    continue;
+                }
+                if (cursor.isNull(cursor.getColumnIndexOrThrow(name))) {
+                    assertNull(expectation.mValues.getAsString(name));
+                } else {
+                    String actualValue =
+                            cursor.getString(cursor.getColumnIndexOrThrow(name));
+                    assertEquals("mismatch on column " + name,
+                            expectation.mValues.getAsString(name), actualValue);
+                }
+            }
+        }
+    }
+
+    class MockSyncableContentProvider extends SyncableContentProvider {
+        SQLiteDatabase mDb;
+        boolean mIsTemporary;
+        boolean mContainsDiffs;
+
+        private final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
+
+        private static final int MATCHER_ITEMS = 0;
+        private static final int MATCHER_DELETED_ITEMS = 1;
+
+        public MockSyncableContentProvider() {
+            mIsTemporary = false;
+            setContainsDiffs(false);
+            sURIMatcher.addURI(CONTENT_URI.getAuthority(), "items", MATCHER_ITEMS);
+            sURIMatcher.addURI(CONTENT_URI.getAuthority(), "deleted_items", MATCHER_DELETED_ITEMS);
+
+            mDb = SQLiteDatabase.create(null);
+            mDb.execSQL("CREATE TABLE items ("
+                    + "_id INTEGER PRIMARY KEY AUTOINCREMENT, "
+                    + "data TEXT, "
+                    + "_sync_time TEXT, "
+                    + "_sync_version TEXT, "
+                    + "_sync_id TEXT, "
+                    + "_sync_local_id INTEGER, "
+                    + "_sync_dirty INTEGER NOT NULL DEFAULT 0, "
+                    + "_sync_account TEXT, "
+                    + "_sync_mark INTEGER)");
+
+            mDb.execSQL("CREATE TABLE deleted_items ("
+                    + "_id INTEGER PRIMARY KEY AUTOINCREMENT, "
+                    + "_sync_version TEXT, "
+                    + "_sync_id TEXT, "
+                    + "_sync_local_id INTEGER, "
+                    + "_sync_account TEXT, "
+                    + "_sync_mark INTEGER)");
+        }
+
+        public boolean onCreate() {
+            throw new UnsupportedOperationException();
+        }
+
+        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+                String sortOrder) {
+            int match = sURIMatcher.match(uri);
+            switch (match) {
+                case MATCHER_ITEMS:
+                    return mDb.query(TABLE_NAME, projection, selection, selectionArgs,
+                            null, null, sortOrder);
+                case MATCHER_DELETED_ITEMS:
+                    return mDb.query(DELETED_TABLE_NAME, projection, selection, selectionArgs,
+                            null, null, sortOrder);
+                default:
+                    throw new UnsupportedOperationException("Cannot query URL: " + uri);
+            }
+        }
+
+        public String getType(Uri uri) {
+            throw new UnsupportedOperationException();
+        }
+
+        public Uri insert(Uri uri, ContentValues values) {
+            int match = sURIMatcher.match(uri);
+            switch (match) {
+                case MATCHER_ITEMS: {
+                    long id = mDb.insert(TABLE_NAME, "_id", values);
+                    return CONTENT_URI.buildUpon().appendPath(String.valueOf(id)).build();
+                }
+                case MATCHER_DELETED_ITEMS: {
+                    long id = mDb.insert(DELETED_TABLE_NAME, "_id", values);
+                    return CONTENT_URI.buildUpon().appendPath(String.valueOf(id)).build();
+                }
+                default:
+                    throw new UnsupportedOperationException("Cannot query URL: " + uri);
+            }
+        }
+
+        public int delete(Uri uri, String selection, String[] selectionArgs) {
+            int match = sURIMatcher.match(uri);
+            switch (match) {
+                case MATCHER_ITEMS:
+                    return mDb.delete(TABLE_NAME, selection, selectionArgs);
+                case MATCHER_DELETED_ITEMS:
+                    return mDb.delete(DELETED_TABLE_NAME, selection, selectionArgs);
+                default:
+                    throw new UnsupportedOperationException("Cannot query URL: " + uri);
+            }
+        }
+
+        public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+            int match = sURIMatcher.match(uri);
+            switch (match) {
+                case MATCHER_ITEMS:
+                    return mDb.update(TABLE_NAME, values, selection, selectionArgs);
+                case MATCHER_DELETED_ITEMS:
+                    return mDb.update(DELETED_TABLE_NAME, values, selection, selectionArgs);
+                default:
+                    throw new UnsupportedOperationException("Cannot query URL: " + uri);
+            }
+        }
+
+        protected boolean isTemporary() {
+            return mIsTemporary;
+        }
+
+        public void close() {
+            throw new UnsupportedOperationException();
+        }
+
+        protected void bootstrapDatabase(SQLiteDatabase db) {
+            throw new UnsupportedOperationException();
+        }
+
+        protected boolean upgradeDatabase(SQLiteDatabase db, int oldVersion, int newVersion) {
+            throw new UnsupportedOperationException();
+        }
+
+        protected void onDatabaseOpened(SQLiteDatabase db) {
+            throw new UnsupportedOperationException();
+        }
+
+        public MockSyncableContentProvider getTemporaryInstance() {
+            MockSyncableContentProvider temp = new MockSyncableContentProvider();
+            temp.mIsTemporary = true;
+            temp.setContainsDiffs(true);
+            return temp;
+        }
+
+        public SQLiteDatabase getDatabase() {
+            return mDb;
+        }
+
+        public boolean getContainsDiffs() {
+            return mContainsDiffs;
+        }
+
+        public void setContainsDiffs(boolean containsDiffs) {
+            mContainsDiffs = containsDiffs;
+        }
+
+        protected Iterable<? extends AbstractTableMerger> getMergers() {
+            throw new UnsupportedOperationException();
+        }
+
+        public boolean changeRequiresLocalSync(Uri uri) {
+            throw new UnsupportedOperationException();
+        }
+
+        public void onSyncStart(SyncContext context, String account) {
+            throw new UnsupportedOperationException();
+        }
+
+        public void onSyncStop(SyncContext context, boolean success) {
+            throw new UnsupportedOperationException();
+        }
+
+        public String getSyncingAccount() {
+            throw new UnsupportedOperationException();
+        }
+
+        public void merge(SyncContext context, SyncableContentProvider diffs,
+                TempProviderSyncResult result, SyncResult syncResult) {
+            throw new UnsupportedOperationException();
+        }
+
+        public void onSyncCanceled() {
+            throw new UnsupportedOperationException();
+        }
+
+        public boolean isMergeCancelled() {
+            return false;
+        }
+
+        protected int updateInternal(Uri url, ContentValues values, String selection,
+                String[] selectionArgs) {
+            throw new UnsupportedOperationException();
+        }
+
+        protected int deleteInternal(Uri url, String selection, String[] selectionArgs) {
+            throw new UnsupportedOperationException();
+        }
+
+        protected Uri insertInternal(Uri url, ContentValues values) {
+            throw new UnsupportedOperationException();
+        }
+
+        protected Cursor queryInternal(Uri url, String[] projection, String selection,
+                String[] selectionArgs, String sortOrder) {
+            throw new UnsupportedOperationException();
+        }
+
+        protected void onAccountsChanged(String[] accountsArray) {
+            throw new UnsupportedOperationException();
+        }
+
+        protected void deleteRowsForRemovedAccounts(Map<String, Boolean> accounts, String table,
+                String accountColumnName) {
+            throw new UnsupportedOperationException();
+        }
+
+        public void wipeAccount(String account) {
+            throw new UnsupportedOperationException();
+        }
+
+        public byte[] readSyncDataBytes(String account) {
+            throw new UnsupportedOperationException();
+        }
+
+        public void writeSyncDataBytes(String account, byte[] data) {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+    class MockSyncContext extends SyncContext {
+        public MockSyncContext() {
+            super(null);
+        }
+
+        @Override
+        public void setStatusText(String message) {
+        }
+    }
+}
diff --git a/tests/FrameworkTest/tests/src/android/widget/AutoCompleteTextViewPopup.java b/tests/FrameworkTest/tests/src/android/widget/AutoCompleteTextViewPopup.java
new file mode 100644 (file)
index 0000000..7a4c78f
--- /dev/null
@@ -0,0 +1,119 @@
+/*
+ * 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 android.widget;
+
+import android.app.Instrumentation;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.suitebuilder.annotation.MediumTest;
+
+/**
+ * A collection of tests on aspects of the AutoCompleteTextView's popup
+ */
+public class AutoCompleteTextViewPopup
+        extends ActivityInstrumentationTestCase2<AutoCompleteTextViewSimple> {
+
+    public AutoCompleteTextViewPopup() {
+        super("com.android.frameworktest", AutoCompleteTextViewSimple.class);
+    }
+    
+    /** Test that we can move the selection and it responds as expected */
+    @MediumTest
+    public void testPopupSetListSelection() throws Throwable {
+        AutoCompleteTextViewSimple theActivity = getActivity();
+        final AutoCompleteTextView textView = theActivity.getTextView();
+        final Instrumentation instrumentation = getInstrumentation();
+        
+        // focus and type
+        textView.requestFocus();
+        instrumentation.waitForIdleSync();
+        sendKeys("A");
+        
+        // No initial selection
+        assertEquals("getListSelection(-1)", 
+                ListView.INVALID_POSITION, textView.getListSelection());
+        
+        // set and check
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                textView.setListSelection(0);
+            }
+        });
+        instrumentation.waitForIdleSync();
+        assertEquals("set selection to (0)", 0, textView.getListSelection());
+        
+        // Use movement to cross-check the movement
+        sendKeys("DPAD_DOWN");
+        assertEquals("move selection to (1)", 1, textView.getListSelection());
+    }
+    
+    /** Test that we can look at the selection as we move around */
+    @MediumTest
+    public void testPopupGetListSelection() {
+        AutoCompleteTextViewSimple theActivity = getActivity();
+        AutoCompleteTextView textView = theActivity.getTextView();
+        final Instrumentation instrumentation = getInstrumentation();
+        
+        // focus and type
+        textView.requestFocus();
+        instrumentation.waitForIdleSync();
+        sendKeys("A");
+        
+        // No initial selection
+        assertEquals("getListSelection(-1)", 
+                ListView.INVALID_POSITION, textView.getListSelection());
+        
+        // check for selection position as expected
+        sendKeys("DPAD_DOWN");
+        assertEquals("move selection to (0)", 0, textView.getListSelection());
+        
+        // Repeat for one more movement
+        sendKeys("DPAD_DOWN");
+        assertEquals("move selection to (1)", 1, textView.getListSelection());
+    }
+    
+    /** Test that we can clear the selection */
+    @MediumTest
+    public void testPopupClearListSelection() throws Throwable {
+        AutoCompleteTextViewSimple theActivity = getActivity();
+        final AutoCompleteTextView textView = theActivity.getTextView();
+        final Instrumentation instrumentation = getInstrumentation();
+        
+        // focus and type
+        textView.requestFocus();
+        instrumentation.waitForIdleSync();
+        sendKeys("A");
+        
+        // No initial selection
+        assertEquals("getListSelection(-1)", 
+                ListView.INVALID_POSITION, textView.getListSelection());
+        
+        // check for selection position as expected
+        sendKeys("DPAD_DOWN");
+        assertEquals("getListSelection(0)", 0, textView.getListSelection());
+        
+        // clear it
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                textView.clearListSelection();
+            }
+        });
+        instrumentation.waitForIdleSync();
+        assertEquals("setListSelection(ListView.INVALID_POSITION)", 
+                ListView.INVALID_POSITION, textView.getListSelection());
+    }
+
+}
diff --git a/tests/FrameworkTest/tests/src/com/android/frameworktest/listview/ListSetSelectionTest.java b/tests/FrameworkTest/tests/src/com/android/frameworktest/listview/ListSetSelectionTest.java
new file mode 100644 (file)
index 0000000..18b6199
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * 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.frameworktest.listview;
+
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.widget.ListView;
+
+/**
+ * Basic tests of setting & clearing the selection
+ */
+public class ListSetSelectionTest extends ActivityInstrumentationTestCase2<ListSimple> {
+    private ListSimple mActivity;
+    private ListView mListView;
+
+    public ListSetSelectionTest() {
+        super("com.android.frameworktest", ListSimple.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        mActivity = getActivity();
+        mListView = getActivity().getListView();
+    }
+
+    @MediumTest
+    public void testPreconditions() {
+        assertNotNull(mActivity);
+        assertNotNull(mListView);
+    }
+    
+    /** Confirm that we can set the selection to each specific position */
+    @MediumTest
+    @UiThreadTest
+    public void testSetSelection() {
+        // Set the selection to each position
+        int childCount = mListView.getChildCount();
+        for (int i=0; i<childCount; i++) {
+            mListView.setSelection(i);
+            assertEquals("Set selection", i, mListView.getSelectedItemPosition());
+        }
+    }
+    
+    /** Confirm that you can unset the selection using the same API */
+    @MediumTest
+    @UiThreadTest
+    public void testClearSelection() {
+        // Set the selection to first position
+        mListView.setSelection(0);
+        assertEquals("Set selection", 0, mListView.getSelectedItemPosition());
+
+        // Clear the selection
+        mListView.setSelection(ListView.INVALID_POSITION);
+        assertEquals("Set selection", 
+                ListView.INVALID_POSITION, mListView.getSelectedItemPosition());
+    }
+}
index 027662d..6bc1ee6 100644 (file)
@@ -17,7 +17,6 @@ static const char* kWildcardName = "any";
 static const char* kAssetDir = "assets";
 static const char* kResourceDir = "res";
 static const char* kInvalidChars = "/\\:";
-static const char* kExcludeExtension = ".EXCLUDE";
 static const size_t kMaxAssetFileName = 100;
 
 static const String8 kResString(kResourceDir);
@@ -100,7 +99,7 @@ static bool isHidden(const char *root, const char *path)
 
     return true;
 }
+
 // =========================================================================
 // =========================================================================
 // =========================================================================
@@ -159,28 +158,28 @@ AaptGroupEntry::parseNamePart(const String8& part, int* axis, uint32_t* value)
         *value = config.touchscreen;
         return 0;
     }
-    
+
     // keyboard hidden
     if (getKeysHiddenName(part.string(), &config)) {
         *axis = AXIS_KEYSHIDDEN;
         *value = config.inputFlags;
         return 0;
     }
-    
+
     // keyboard
     if (getKeyboardName(part.string(), &config)) {
         *axis = AXIS_KEYBOARD;
         *value = config.keyboard;
         return 0;
     }
-    
+
     // navigation
     if (getNavigationName(part.string(), &config)) {
         *axis = AXIS_NAVIGATION;
         *value = config.navigation;
         return 0;
     }
-    
+
     // screen size
     if (getScreenSizeName(part.string(), &config)) {
         *axis = AXIS_SCREENSIZE;
@@ -319,7 +318,7 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType)
     // touchscreen
     if (getTouchscreenName(part.string())) {
         touch = part;
-        
+
         index++;
         if (index == N) {
             goto success;
@@ -328,11 +327,11 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType)
     } else {
         //printf("not touchscreen: %s\n", part.string());
     }
-    
+
     // keyboard hidden
     if (getKeysHiddenName(part.string())) {
         keysHidden = part;
-        
+
         index++;
         if (index == N) {
             goto success;
@@ -341,11 +340,11 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType)
     } else {
         //printf("not keysHidden: %s\n", part.string());
     }
-    
+
     // keyboard
     if (getKeyboardName(part.string())) {
         key = part;
-        
+
         index++;
         if (index == N) {
             goto success;
@@ -354,10 +353,10 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType)
     } else {
         //printf("not keyboard: %s\n", part.string());
     }
-    
+
     if (getNavigationName(part.string())) {
         nav = part;
-        
+
         index++;
         if (index == N) {
             goto success;
@@ -366,10 +365,10 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType)
     } else {
         //printf("not navigation: %s\n", part.string());
     }
-    
+
     if (getScreenSizeName(part.string())) {
         size = part;
-        
+
         index++;
         if (index == N) {
             goto success;
@@ -378,10 +377,10 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType)
     } else {
         //printf("not screen size: %s\n", part.string());
     }
-    
+
     if (getVersionName(part.string())) {
         vers = part;
-        
+
         index++;
         if (index == N) {
             goto success;
@@ -390,7 +389,7 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType)
     } else {
         //printf("not version: %s\n", part.string());
     }
-    
+
     // if there are extra parts, it doesn't match
     return false;
 
@@ -488,7 +487,7 @@ AaptGroupEntry::toDirName(const String8& resType) const
         s += "-";
         s += version;
     }
-    
+
     return s;
 }
 
@@ -506,9 +505,9 @@ bool AaptGroupEntry::getMccName(const char* name,
     c++;
     if (tolower(*c) != 'c') return false;
     c++;
-    
+
     const char* val = c;
-    
+
     while (*c >= '0' && *c <= '9') {
         c++;
     }
@@ -538,9 +537,9 @@ bool AaptGroupEntry::getMncName(const char* name,
     c++;
     if (tolower(*c) != 'c') return false;
     c++;
-    
+
     const char* val = c;
-    
+
     while (*c >= '0' && *c <= '9') {
         c++;
     }
@@ -621,7 +620,7 @@ bool AaptGroupEntry::getOrientationName(const char* name,
         if (out) out->orientation = out->ORIENTATION_SQUARE;
         return true;
     }
-    
+
     return false;
 }
 
@@ -677,7 +676,7 @@ bool AaptGroupEntry::getTouchscreenName(const char* name,
         if (out) out->touchscreen = out->TOUCHSCREEN_FINGER;
         return true;
     }
-    
+
     return false;
 }
 
@@ -699,12 +698,12 @@ bool AaptGroupEntry::getKeysHiddenName(const char* name,
         mask = out->MASK_KEYSHIDDEN;
         value = out->KEYSHIDDEN_SOFT;
     }
-    
+
     if (mask != 0) {
         if (out) out->inputFlags = (out->inputFlags&~mask) | value;
         return true;
     }
-    
+
     return false;
 }
 
@@ -724,7 +723,7 @@ bool AaptGroupEntry::getKeyboardName(const char* name,
         if (out) out->keyboard = out->KEYBOARD_12KEY;
         return true;
     }
-    
+
     return false;
 }
 
@@ -747,7 +746,7 @@ bool AaptGroupEntry::getNavigationName(const char* name,
         if (out) out->navigation = out->NAVIGATION_WHEEL;
         return true;
     }
-    
+
     return false;
 }
 
@@ -761,29 +760,29 @@ bool AaptGroupEntry::getScreenSizeName(const char* name,
         }
         return true;
     }
-     
+
     const char* x = name;
     while (*x >= '0' && *x <= '9') x++;
     if (x == name || *x != 'x') return false;
     String8 xName(name, x-name);
     x++;
-    
+
     const char* y = x;
     while (*y >= '0' && *y <= '9') y++;
     if (y == name || *y != 0) return false;
     String8 yName(x, y-x);
-    
+
     uint16_t w = (uint16_t)atoi(xName.string());
     uint16_t h = (uint16_t)atoi(yName.string());
     if (w < h) {
         return false;
     }
-    
+
     if (out) {
         out->screenWidth = w;
         out->screenHeight = h;
     }
-    
+
     return true;
 }
 
@@ -797,22 +796,22 @@ bool AaptGroupEntry::getVersionName(const char* name,
         }
         return true;
     }
-    
+
     if (*name != 'v') {
         return false;
     }
-    
+
     name++;
     const char* s = name;
     while (*s >= '0' && *s <= '9') s++;
     if (s == name || *s != 0) return false;
     String8 sdkName(name, s-name);
-    
+
     if (out) {
         out->sdkVersion = (uint16_t)atoi(sdkName.string());
         out->minorVersion = 0;
     }
-    
+
     return true;
 }
 
@@ -1081,29 +1080,29 @@ ssize_t AaptDir::slurpFullTree(Bundle* bundle, const String8& srcDir,
 
     {
         DIR* dir = NULL;
-    
+
         dir = opendir(srcDir.string());
         if (dir == NULL) {
             fprintf(stderr, "ERROR: opendir(%s): %s\n", srcDir.string(), strerror(errno));
             return UNKNOWN_ERROR;
         }
-    
+
         /*
          * Slurp the filenames out of the directory.
          */
         while (1) {
             struct dirent* entry;
-    
+
             entry = readdir(dir);
             if (entry == NULL)
                 break;
-  
+
             if (isHidden(srcDir.string(), entry->d_name))
                 continue;
 
             fileNames.add(String8(entry->d_name));
         }
-    
+
         closedir(dir);
     }
 
@@ -1315,7 +1314,7 @@ void AaptAssets::addResource(const String8& leafName, const String8& path,
     sp<AaptDir> subdir = res->makeDir(dirname);
     sp<AaptGroup> grr = new AaptGroup(leafName, path);
     grr->addFile(file);
-    
+
     subdir->addFile(leafName, grr);
 }
 
@@ -1324,10 +1323,10 @@ ssize_t AaptAssets::slurpFromArgs(Bundle* bundle)
 {
     int count;
     int totalCount = 0;
-    int i;
-    int arg = 0;
     FileType type;
-    const char* res;
+    const Vector<const char *>& resDirs = bundle->getResourceSourceDirs();
+    const size_t dirCount =resDirs.size();
+    sp<AaptAssets> current = this;
 
     const int N = bundle->getFileSpecCount();
 
@@ -1380,28 +1379,35 @@ ssize_t AaptAssets::slurpFromArgs(Bundle* bundle)
     /*
      * If a directory of resource-specific assets was supplied, slurp 'em up.
      */
-    res = bundle->getResourceSourceDir();
-    if (res) {
-        type = getFileType(res);
-        if (type == kFileTypeNonexistent) {
-            fprintf(stderr, "ERROR: resource directory '%s' does not exist\n", res);
-            return UNKNOWN_ERROR;
-        }
-        if (type == kFileTypeDirectory) {
-            count = slurpResourceTree(bundle, String8(res));
+    for (size_t i=0; i<dirCount; i++) {
+        const char *res = resDirs[i];
+        if (res) {
+            type = getFileType(res);
+            if (type == kFileTypeNonexistent) {
+                fprintf(stderr, "ERROR: resource directory '%s' does not exist\n", res);
+                return UNKNOWN_ERROR;
+            }
+            if (type == kFileTypeDirectory) {
+                if (i>0) {
+                    sp<AaptAssets> nextOverlay = new AaptAssets();
+                    current->setOverlay(nextOverlay);
+                    current = nextOverlay;
+                }
+                count = current->slurpResourceTree(bundle, String8(res));
 
-            if (count < 0) {
-                totalCount = count;
-                goto bail;
+                if (count < 0) {
+                    totalCount = count;
+                    goto bail;
+                }
+                totalCount += count;
+            }
+            else {
+                fprintf(stderr, "ERROR: '%s' is not a directory\n", res);
+                return UNKNOWN_ERROR;
             }
-            totalCount += count;
-        }
-        else {
-            fprintf(stderr, "ERROR: '%s' is not a directory\n", res);
-            return UNKNOWN_ERROR;
         }
+        
     }
-    
     /*
      * Now do any additional raw files.
      */
index 6ab0ae5..01c8140 100644 (file)
@@ -441,6 +441,8 @@ private:
     AaptSymbolEntry                                 mDefSymbol;
 };
 
+class ResourceTypeSet;
+
 /**
  * Asset hierarchy being operated on.
  */
@@ -491,6 +493,13 @@ public:
 
     inline const Vector<sp<AaptDir> >& resDirs() { return mDirs; }
 
+    inline sp<AaptAssets> getOverlay() { return mOverlay; }
+    inline void setOverlay(sp<AaptAssets>& overlay) { mOverlay = overlay; }
+    
+    inline KeyedVector<String8, sp<ResourceTypeSet> >* getResources() { return mRes; }
+    inline void 
+        setResources(KeyedVector<String8, sp<ResourceTypeSet> >* res) { mRes = res; }
+
 private:
     String8 mPackage;
     SortedVector<AaptGroupEntry> mGroupEntries;
@@ -501,6 +510,9 @@ private:
 
     bool mHaveIncludedAssets;
     AssetManager mIncludedAssets;
+
+    sp<AaptAssets> mOverlay;
+    KeyedVector<String8, sp<ResourceTypeSet> >* mRes;
 };
 
 #endif // __AAPT_ASSETS_H
index 99fac2f..2d8471b 100644 (file)
@@ -31,11 +31,11 @@ class Bundle {
 public:
     Bundle(void)
         : mCmd(kCommandUnknown), mVerbose(false), mAndroidList(false),
-          mForce(false), mMakePackageDirs(false),
+          mForce(false), mGrayscaleTolerance(0), mMakePackageDirs(false),
           mUpdate(false), mExtending(false),
           mRequireLocalization(false), mPseudolocalize(false),
           mCompressionMethod(0), mOutputAPKFile(NULL),
-          mAssetSourceDir(NULL), mResourceSourceDir(NULL),
+          mAssetSourceDir(NULL),
           mAndroidManifestFile(NULL), mPublicOutputFile(NULL),
           mRClassDir(NULL), mResourceIntermediatesDir(NULL),
           mArgc(0), mArgv(NULL)
@@ -58,6 +58,8 @@ public:
     void setAndroidList(bool val) { mAndroidList = val; }
     bool getForce(void) const { return mForce; }
     void setForce(bool val) { mForce = val; }
+    void setGrayscaleTolerance(int val) { mGrayscaleTolerance = val; }
+    int  getGrayscaleTolerance() { return mGrayscaleTolerance; }
     bool getMakePackageDirs(void) const { return mMakePackageDirs; }
     void setMakePackageDirs(bool val) { mMakePackageDirs = val; }
     bool getUpdate(void) const { return mUpdate; }
@@ -78,8 +80,8 @@ public:
      */
     const char* getAssetSourceDir() const { return mAssetSourceDir; }
     void setAssetSourceDir(const char* dir) { mAssetSourceDir = dir; }
-    const char* getResourceSourceDir() const { return mResourceSourceDir; }
-    void setResourceSourceDir(const char* dir) { mResourceSourceDir = dir; }
+    const android::Vector<const char*>& getResourceSourceDirs() const { return mResourceSourceDirs; }
+    void addResourceSourceDir(const char* dir) { mResourceSourceDirs.insertAt(dir,0); }
     const char* getAndroidManifestFile() const { return mAndroidManifestFile; }
     void setAndroidManifestFile(const char* file) { mAndroidManifestFile = file; }
     const char* getPublicOutputFile() const { return mPublicOutputFile; }
@@ -130,6 +132,7 @@ private:
     bool        mVerbose;
     bool        mAndroidList;
     bool        mForce;
+    int         mGrayscaleTolerance;
     bool        mMakePackageDirs;
     bool        mUpdate;
     bool        mExtending;
@@ -138,7 +141,6 @@ private:
     int         mCompressionMethod;
     const char* mOutputAPKFile;
     const char* mAssetSourceDir;
-    const char* mResourceSourceDir;
     const char* mAndroidManifestFile;
     const char* mPublicOutputFile;
     const char* mRClassDir;
@@ -147,7 +149,8 @@ private:
     android::Vector<const char*> mPackageIncludes;
     android::Vector<const char*> mJarFiles;
     android::Vector<const char*> mNoCompressExtensions;
-
+    android::Vector<const char*> mResourceSourceDirs;
+    
     /* file specification */
     int         mArgc;
     char* const* mArgv;
index 9f75d4b..bff0423 100644 (file)
@@ -761,7 +761,7 @@ int doPackage(Bundle* bundle)
     }
 
     N = bundle->getFileSpecCount();
-    if (N < 1 && bundle->getResourceSourceDir() == NULL && bundle->getJarFiles().size() == 0
+    if (N < 1 && bundle->getResourceSourceDirs().size() == 0 && bundle->getJarFiles().size() == 0
             && bundle->getAndroidManifestFile() == NULL && bundle->getAssetSourceDir() == NULL) {
         fprintf(stderr, "ERROR: no input files\n");
         goto bail;
@@ -793,7 +793,7 @@ int doPackage(Bundle* bundle)
     }
 
     // If they asked for any files that need to be compiled, do so.
-    if (bundle->getResourceSourceDir() || bundle->getAndroidManifestFile()) {
+    if (bundle->getResourceSourceDirs().size() || bundle->getAndroidManifestFile()) {
         err = buildResources(bundle, assets);
         if (err != 0) {
             goto bail;
index 7c4963f..a516a5a 100644 (file)
@@ -33,7 +33,7 @@ png_flush_aapt_file(png_structp png_ptr)
 // This holds an image as 8bpp RGBA.
 struct image_info
 {
-    image_info() : rows(NULL), hasTransparency(true), is9Patch(false), allocRows(NULL) { }
+    image_info() : rows(NULL), is9Patch(false), allocRows(NULL) { }
     ~image_info() {
         if (rows && rows != allocRows) {
             free(rows);
@@ -50,8 +50,6 @@ struct image_info
     png_uint_32 height;
     png_bytepp rows;
 
-    bool hasTransparency;
-
     // 9-patch info.
     bool is9Patch;
     Res_png_9patch info9Patch;
@@ -326,22 +324,6 @@ static uint32_t get_color(image_info* image, int hpatch, int vpatch)
     return c;
 }
 
-static void examine_image(image_info* image)
-{
-    bool hasTrans = false;
-    for (int i=0; i<(int)image->height && !hasTrans; i++) {
-        png_bytep p = image->rows[i];
-        for (int j=0; j<(int)image->width; j++) {
-            if (p[(j*4)+3] != 0xFF) {
-                hasTrans = true;
-                break;
-            }
-        }
-    }
-
-    image->hasTransparency = hasTrans;
-}
-
 static status_t do_9patch(const char* imageName, image_info* image)
 {
     image->is9Patch = true;
@@ -618,17 +600,57 @@ static bool patch_equals(Res_png_9patch& patch1, Res_png_9patch& patch2) {
     return true;
 }
 
+static void dump_image(int w, int h, png_bytepp rows, int bpp)
+{
+    int i, j, rr, gg, bb, aa;
+
+    for (j = 0; j < h; j++) {
+        png_bytep row = rows[j];
+        for (i = 0; i < w; i++) {
+            rr = row[0];
+            gg = row[1];
+            bb = row[2];
+            aa = row[3];
+            row += bpp;
+
+            if (i == 0) {
+                printf("Row %d:", j);
+            }
+            switch (bpp) {
+            case 1:
+                printf(" (%d)", rr);
+                break;
+            case 2:
+                printf(" (%d %d", rr, gg);
+                break;
+            case 3:
+                printf(" (%d %d %d)", rr, gg, bb);
+                break;
+            case 4:
+                printf(" (%d %d %d %d)", rr, gg, bb, aa);
+                break;
+            }
+            if (i == (w - 1)) {
+                NOISY(printf("\n"));
+            }
+        }
+    }
+}
+
+#define MAX(a,b) ((a)>(b)?(a):(b))
+#define ABS(a)   ((a)<0?-(a):(a))
 
-static void analyze_image(image_info &imageInfo, png_colorp rgbPalette, png_bytep alphaPalette,
+static void analyze_image(image_info &imageInfo, int grayscaleTolerance,
+                          png_colorp rgbPalette, png_bytep alphaPalette,
                           int *paletteEntries, bool *hasTransparency, int *colorType,
                           png_bytepp outRows)
 {
     int w = imageInfo.width;
     int h = imageInfo.height;
-    bool trans = imageInfo.hasTransparency;
     int i, j, rr, gg, bb, aa, idx;
     uint32_t colors[256], col;
     int num_colors = 0;
+    int maxGrayDeviation = 0;
 
     bool isOpaque = true;
     bool isPalette = true;
@@ -638,6 +660,10 @@ static void analyze_image(image_info &imageInfo, png_colorp rgbPalette, png_byte
     // 1. Every pixel has R == G == B (grayscale)
     // 2. Every pixel has A == 255 (opaque)
     // 3. There are no more than 256 distinct RGBA colors
+
+    // NOISY(printf("Initial image data:\n"));
+    // dump_image(w, h, imageInfo.rows, 4);
+
     for (j = 0; j < h; j++) {
         png_bytep row = imageInfo.rows[j];
         png_bytep out = outRows[j];
@@ -646,23 +672,32 @@ static void analyze_image(image_info &imageInfo, png_colorp rgbPalette, png_byte
             gg = *row++;
             bb = *row++;
             aa = *row++;
-            if (!trans) {
-                // Ignore the actually byte and assume alpha == 255
-                aa = 0xff;
+
+            int odev = maxGrayDeviation;
+            maxGrayDeviation = MAX(ABS(rr - gg), maxGrayDeviation);
+            maxGrayDeviation = MAX(ABS(gg - bb), maxGrayDeviation);
+            maxGrayDeviation = MAX(ABS(bb - rr), maxGrayDeviation);
+            if (maxGrayDeviation > odev) {
+                NOISY(printf("New max dev. = %d at pixel (%d, %d) = (%d %d %d %d)\n",
+                             maxGrayDeviation, i, j, rr, gg, bb, aa));
             }
 
             // Check if image is really grayscale
             if (isGrayscale) {
-              if (rr != gg || rr != bb) {
-                isGrayscale = false;
-              }
+                if (rr != gg || rr != bb) {
+                     NOISY(printf("Found a non-gray pixel at %d, %d = (%d %d %d %d)\n",
+                                  i, j, rr, gg, bb, aa));
+                    isGrayscale = false;
+                }
             }
 
             // Check if image is really opaque
             if (isOpaque) {
-              if (aa != 0xff) {
-                isOpaque = false;
-              }
+                if (aa != 0xff) {
+                    NOISY(printf("Found a non-opaque pixel at %d, %d = (%d %d %d %d)\n",
+                                 i, j, rr, gg, bb, aa));
+                    isOpaque = false;
+                }
             }
 
             // Check if image is really <= 256 colors
@@ -682,6 +717,7 @@ static void analyze_image(image_info &imageInfo, png_colorp rgbPalette, png_byte
                 *out++ = idx;
                 if (!match) {
                     if (num_colors == 256) {
+                        NOISY(printf("Found 257th color at %d, %d\n", i, j));
                         isPalette = false;
                     } else {
                         colors[num_colors++] = col;
@@ -696,6 +732,13 @@ static void analyze_image(image_info &imageInfo, png_colorp rgbPalette, png_byte
     int bpp = isOpaque ? 3 : 4;
     int paletteSize = w * h + bpp * num_colors;
 
+    NOISY(printf("isGrayscale = %s\n", isGrayscale ? "true" : "false"));
+    NOISY(printf("isOpaque = %s\n", isOpaque ? "true" : "false"));
+    NOISY(printf("isPalette = %s\n", isPalette ? "true" : "false"));
+    NOISY(printf("Size w/ palette = %d, gray+alpha = %d, rgb(a) = %d\n",
+                 paletteSize, 2 * w * h, bpp * w * h));
+    NOISY(printf("Max gray deviation = %d, tolerance = %d\n", maxGrayDeviation, grayscaleTolerance));
+
     // Choose the best color type for the image.
     // 1. Opaque gray - use COLOR_TYPE_GRAY at 1 byte/pixel
     // 2. Gray + alpha - use COLOR_TYPE_PALETTE if the number of distinct combinations
@@ -719,7 +762,12 @@ static void analyze_image(image_info &imageInfo, png_colorp rgbPalette, png_byte
     } else if (isPalette && (paletteSize < bpp * w * h)) {
         *colorType = PNG_COLOR_TYPE_PALETTE;
     } else {
-        *colorType = isOpaque ? PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_RGB_ALPHA;
+        if (maxGrayDeviation <= grayscaleTolerance) {
+            NOISY(printf("Forcing image to gray (max deviation = %d)\n", maxGrayDeviation));
+            *colorType = isOpaque ? PNG_COLOR_TYPE_GRAY : PNG_COLOR_TYPE_GRAY_ALPHA;
+        } else {
+            *colorType = isOpaque ? PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_RGB_ALPHA;
+        }
     }
 
     // Perform postprocessing of the image or palette data based on the final
@@ -748,11 +796,15 @@ static void analyze_image(image_info &imageInfo, png_colorp rgbPalette, png_byte
                 bb = *row++;
                 aa = *row++;
                 
-                *out++ = rr;
+                if (isGrayscale) {
+                    *out++ = rr;
+                } else {
+                    *out++ = (png_byte) (rr * 0.2126f + gg * 0.7152f + bb * 0.0722f);
+                }
                 if (!isOpaque) {
                     *out++ = aa;
                 }
-            }
+           }
         }
     }
 }
@@ -760,7 +812,7 @@ static void analyze_image(image_info &imageInfo, png_colorp rgbPalette, png_byte
 
 static void write_png(const char* imageName,
                       png_structp write_ptr, png_infop write_info,
-                      image_info& imageInfo)
+                      image_info& imageInfo, int grayscaleTolerance)
 {
     bool optimize = true;
     png_uint_32 width, height;
@@ -785,42 +837,34 @@ static void write_png(const char* imageName,
 
     png_set_compression_level(write_ptr, Z_BEST_COMPRESSION);
 
-    NOISY(printf("Writing image %s: w = %d, h = %d, trans = %s\n", imageName,
-          (int) imageInfo.width, (int) imageInfo.height,
-          imageInfo.hasTransparency ? "true" : "false"));
+    NOISY(printf("Writing image %s: w = %d, h = %d\n", imageName,
+          (int) imageInfo.width, (int) imageInfo.height));
 
     png_color rgbPalette[256];
     png_byte alphaPalette[256];
     bool hasTransparency;
     int paletteEntries;
 
-    if (optimize) {
-        analyze_image(imageInfo, rgbPalette, alphaPalette, &paletteEntries, &hasTransparency,
-                      &color_type, outRows);
-        switch (color_type) {
-        case PNG_COLOR_TYPE_PALETTE:
-            NOISY(printf("Image %s has %d colors%s, using PNG_COLOR_TYPE_PALETTE\n",
-                         imageName, paletteEntries,
-                         hasTransparency ? " (with alpha)" : ""));
-            break;
-        case PNG_COLOR_TYPE_GRAY:
-            NOISY(printf("Image %s is opaque gray, using PNG_COLOR_TYPE_GRAY\n", imageName));
-            break;
-        case PNG_COLOR_TYPE_GRAY_ALPHA:
-            NOISY(printf("Image %s is gray + alpha, using PNG_COLOR_TYPE_GRAY_ALPHA\n", imageName));
-            break;
-        case PNG_COLOR_TYPE_RGB:
-            NOISY(printf("Image %s is opaque RGB, using PNG_COLOR_TYPE_RGB\n", imageName));
-            break;
-        case PNG_COLOR_TYPE_RGB_ALPHA:
-            NOISY(printf("Image %s is RGB + alpha, using PNG_COLOR_TYPE_RGB_ALPHA\n", imageName));
-            break;
-        }
-    } else {
-        // Force RGB or RGB_ALPHA color type, copy transparency from input
-        paletteEntries = 0;
-        hasTransparency = imageInfo.hasTransparency;
-        color_type = hasTransparency ? PNG_COLOR_TYPE_RGB_ALPHA : PNG_COLOR_TYPE_RGB;
+    analyze_image(imageInfo, grayscaleTolerance, rgbPalette, alphaPalette,
+                  &paletteEntries, &hasTransparency, &color_type, outRows);
+    switch (color_type) {
+    case PNG_COLOR_TYPE_PALETTE:
+        NOISY(printf("Image %s has %d colors%s, using PNG_COLOR_TYPE_PALETTE\n",
+                     imageName, paletteEntries,
+                     hasTransparency ? " (with alpha)" : ""));
+        break;
+    case PNG_COLOR_TYPE_GRAY:
+        NOISY(printf("Image %s is opaque gray, using PNG_COLOR_TYPE_GRAY\n", imageName));
+        break;
+    case PNG_COLOR_TYPE_GRAY_ALPHA:
+        NOISY(printf("Image %s is gray + alpha, using PNG_COLOR_TYPE_GRAY_ALPHA\n", imageName));
+        break;
+    case PNG_COLOR_TYPE_RGB:
+        NOISY(printf("Image %s is opaque RGB, using PNG_COLOR_TYPE_RGB\n", imageName));
+        break;
+    case PNG_COLOR_TYPE_RGB_ALPHA:
+        NOISY(printf("Image %s is RGB + alpha, using PNG_COLOR_TYPE_RGB_ALPHA\n", imageName));
+        break;
     }
 
     png_set_IHDR(write_ptr, write_info, imageInfo.width, imageInfo.height,
@@ -856,16 +900,31 @@ static void write_png(const char* imageName,
     }
 
     png_write_info(write_ptr, write_info);
-         
-    if (!imageInfo.hasTransparency) {
-        png_set_filler(write_ptr, 0, PNG_FILLER_AFTER);
-    }
 
+    png_bytepp rows;
     if (color_type == PNG_COLOR_TYPE_RGB || color_type == PNG_COLOR_TYPE_RGB_ALPHA) {
-        png_write_image(write_ptr, imageInfo.rows);
+        png_set_filler(write_ptr, 0, PNG_FILLER_AFTER);
+        rows = imageInfo.rows;
     } else {
-        png_write_image(write_ptr, outRows);
-    }
+        rows = outRows;
+    }
+    png_write_image(write_ptr, rows);
+
+//     int bpp;
+//     if (color_type == PNG_COLOR_TYPE_PALETTE || color_type == PNG_COLOR_TYPE_GRAY) {
+//         bpp = 1;
+//     } else if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
+//         bpp = 2;
+//     } else if (color_type == PNG_COLOR_TYPE_RGB) {
+//         bpp = 4;
+//     } else if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) {
+//         bpp = 4;
+//     } else {
+//         printf("Uknknown color type %d, exiting.\n", color_type);
+//         exit(1);
+//     }
+//     NOISY(printf("Final image data:\n"));
+//     dump_image(imageInfo.width, imageInfo.height, rows, bpp);
 
     png_write_end(write_ptr, write_info);
 
@@ -937,8 +996,6 @@ status_t preProcessImage(Bundle* bundle, const sp<AaptAssets>& assets,
 
     read_png(printableName.string(), read_ptr, read_info, &imageInfo);
 
-    examine_image(&imageInfo);
-
     if (nameLen > 6) {
         const char* name = file->getPath().string();
         if (name[nameLen-5] == '9' && name[nameLen-6] == '.') {
@@ -969,7 +1026,8 @@ status_t preProcessImage(Bundle* bundle, const sp<AaptAssets>& assets,
         goto bail;
     }
 
-    write_png(printableName.string(), write_ptr, write_info, imageInfo);
+    write_png(printableName.string(), write_ptr, write_info, imageInfo,
+              bundle->getGrayscaleTolerance());
 
     error = NO_ERROR;
 
index a1978da..ee0dbad 100644 (file)
@@ -53,11 +53,14 @@ void usage(void)
         "   xmltree          Print the compiled xmls in the given assets.\n"
         "   xmlstrings       Print the strings of the given compiled xml assets.\n\n", gProgName);
     fprintf(stderr,
-        " %s p[ackage] [-f][-u][-m][-v][-x][-M AndroidManifest.xml] \\\n"
+        " %s p[ackage] [-d][-f][-m][-u][-v][-x][-z][-M AndroidManifest.xml] \\\n"
         "        [-0 extension [-0 extension ...]] \\\n"
+        "        [-g tolerance] \\\n"
+        "        [-j jarfile] \\\n"
         "        [-I base-package [-I base-package ...]] \\\n"
         "        [-A asset-source-dir] [-P public-definitions-file] \\\n"
-        "        [-S resource-sources] [-F apk-file] [-J R-file-dir] \\\n"
+        "        [-S resource-sources [-S resource-sources ...]] "
+        "        [-F apk-file] [-J R-file-dir] \\\n"
         "        [raw-files-dir [raw-files-dir] ...]\n"
         "\n"
         "   Package the android resources.  It will read assets and resources that are\n"
@@ -91,6 +94,7 @@ void usage(void)
         "            port,land,zz_ZZ\n"
         "   -d  one or more device assets to include, separated by commas\n"
         "   -f  force overwrite of existing files\n"
+        "   -g  specify a pixel tolerance to force images to grayscale, default 0\n"
         "   -j  specify a jar or zip file containing classes to include\n"
         "   -m  make package directories under location specified by -J\n"
 #if 0
@@ -107,7 +111,8 @@ void usage(void)
         "   -J  specify where to output R.java resource constant definitions\n"
         "   -M  specify full path to AndroidManifest.xml to include in zip\n"
         "   -P  specify where to output public resource definitions\n"
-        "   -S  directory in which to find resources\n"
+        "   -S  directory in which to find resources.  Multiple directories will be scanned"
+        "       and the first match found (left to right) will take precedence."
         "   -0  specifies an additional extension for which such files will not\n"
         "       be stored compressed in the .apk.  An empty string means to not\n"
         "       compress any files at all.\n");
@@ -201,6 +206,16 @@ int main(int argc, char* const argv[])
             case 'f':
                 bundle.setForce(true);
                 break;
+            case 'g':
+                argc--;
+                argv++;
+                if (!argc) {
+                    fprintf(stderr, "ERROR: No argument supplied for '-g' option\n");
+                    wantUsage = true;
+                    goto bail;
+                }
+                bundle.setGrayscaleTolerance(atoi(argv[0]));
+                break;
             case 'm':
                 bundle.setMakePackageDirs(true);
                 break;
@@ -304,7 +319,7 @@ int main(int argc, char* const argv[])
                     goto bail;
                 }
                 convertPath(argv[0]);
-                bundle.setResourceSourceDir(argv[0]);
+                bundle.addResourceSourceDir(argv[0]);
                 break;
             case '0':
                 argc--;
index fd6ddb5..b2bd9ff 100644 (file)
@@ -433,11 +433,73 @@ static void checkForIds(const String8& path, ResXMLParser& parser)
     }
 }
 
+static void applyFileOverlay(const sp<AaptAssets>& assets, 
+                             const sp<ResourceTypeSet>& baseSet,
+                             const char *resType)
+{
+    // Replace any base level files in this category with any found from the overlay
+    // Also add any found only in the overlay.
+    sp<AaptAssets> overlay = assets->getOverlay();
+    String8 resTypeString(resType);
+    
+    // work through the linked list of overlays
+    while (overlay.get()) {
+        KeyedVector<String8, sp<ResourceTypeSet> >* overlayRes = overlay->getResources();
+
+        // get the overlay resources of the requested type
+        ssize_t index = overlayRes->indexOfKey(resTypeString);
+        if (index >= 0) {
+            sp<ResourceTypeSet> overlaySet = overlayRes->valueAt(index);
+
+            // for each of the resources, check for a match in the previously built
+            // non-overlay "baseset".
+            size_t overlayCount = overlaySet->size();
+            for (size_t overlayIndex=0; overlayIndex<overlayCount; overlayIndex++) {
+                size_t baseIndex = baseSet->indexOfKey(overlaySet->keyAt(overlayIndex));
+                if (baseIndex != UNKNOWN_ERROR) {
+                    // look for same flavor.  For a given file (strings.xml, for example)
+                    // there may be a locale specific or other flavors - we want to match
+                    // the same flavor.
+                    sp<AaptGroup> overlayGroup = overlaySet->valueAt(overlayIndex);
+                    sp<AaptGroup> baseGroup = baseSet->valueAt(baseIndex);
+                   
+                    DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> > baseFiles = 
+                            baseGroup->getFiles();
+                    DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> > overlayFiles = 
+                            overlayGroup->getFiles();
+                    size_t overlayGroupSize = overlayFiles.size();
+                    for (size_t overlayGroupIndex = 0; 
+                            overlayGroupIndex<overlayGroupSize; 
+                            overlayGroupIndex++) {
+                        size_t baseFileIndex = 
+                                baseFiles.indexOfKey(overlayFiles.keyAt(overlayGroupIndex));
+                        if(baseFileIndex < UNKNOWN_ERROR) {
+                            baseGroup->removeFile(baseFileIndex);
+                        } else {
+                            // didn't find a match fall through and add it..
+                        }
+                        baseGroup->addFile(overlayFiles.valueAt(overlayGroupIndex));
+                    }
+                } else {
+                    // this group doesn't exist (a file that's only in the overlay)
+                    // add it
+                    baseSet->add(overlaySet->keyAt(overlayIndex),
+                                 overlaySet->valueAt(overlayIndex));
+                }
+            }
+            // this overlay didn't have resources for this type
+        }
+        // try next overlay
+        overlay = overlay->getOverlay();
+    }
+    return;
+}
+
 #define ASSIGN_IT(n) \
         do { \
-            ssize_t index = resources.indexOfKey(String8(#n)); \
+            ssize_t index = resources->indexOfKey(String8(#n)); \
             if (index >= 0) { \
-                n ## s = resources.valueAt(index); \
+                n ## s = resources->valueAt(index); \
             } \
         } while (0)
 
@@ -468,18 +530,16 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets)
 
     NOISY(printf("Found %d included resource packages\n", (int)table.size()));
 
-    sp<AaptDir> res = assets->getDirs().valueFor(String8("res"));
-
     // --------------------------------------------------------------
     // First, gather all resource information.
     // --------------------------------------------------------------
 
     // resType -> leafName -> group
-    KeyedVector<String8, sp<ResourceTypeSet> > resources;
-    collect_files(assets, &resources);
+    KeyedVector<String8, sp<ResourceTypeSet> > *resources = 
+            new KeyedVector<String8, sp<ResourceTypeSet> >;
+    collect_files(assets, resources);
 
     sp<ResourceTypeSet> drawables;
-    sp<ResourceTypeSet> valuess;
     sp<ResourceTypeSet> layouts;
     sp<ResourceTypeSet> anims;
     sp<ResourceTypeSet> xmls;
@@ -492,10 +552,28 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets)
     ASSIGN_IT(anim);
     ASSIGN_IT(xml);
     ASSIGN_IT(raw);
-    ASSIGN_IT(values);
     ASSIGN_IT(color);
     ASSIGN_IT(menu);
 
+    assets->setResources(resources);
+    // now go through any resource overlays and collect their files
+    sp<AaptAssets> current = assets->getOverlay();
+    while(current.get()) {
+        KeyedVector<String8, sp<ResourceTypeSet> > *resources = 
+                new KeyedVector<String8, sp<ResourceTypeSet> >;
+        current->setResources(resources);
+        collect_files(current, resources);
+        current = current->getOverlay();
+    }
+    // apply the overlay files to the base set
+    applyFileOverlay(assets, drawables, "drawable");
+    applyFileOverlay(assets, layouts, "layout");
+    applyFileOverlay(assets, anims, "anim");
+    applyFileOverlay(assets, xmls, "xml");
+    applyFileOverlay(assets, raws, "raw");
+    applyFileOverlay(assets, colors, "color");
+    applyFileOverlay(assets, menus, "menu");
+
     bool hasErrors = false;
 
     if (drawables != NULL) {
@@ -538,17 +616,26 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets)
         }
     }
 
-    if (valuess != NULL) {
-        ResourceDirIterator it(valuess, String8("values"));
-        ssize_t res;
-        while ((res=it.next()) == NO_ERROR) {
-            sp<AaptFile> file = it.getFile();
-
-            res = compileResourceFile(bundle, assets, file, it.getParams(), &table);
-            if (res != NO_ERROR) {
-                hasErrors = true;
+    // compile resources
+    current = assets;
+    while(current.get()) {
+        KeyedVector<String8, sp<ResourceTypeSet> > *resources = 
+                current->getResources();
+
+        ssize_t index = resources->indexOfKey(String8("values"));
+        if (index >= 0) {
+            ResourceDirIterator it(resources->valueAt(index), String8("values"));
+            ssize_t res;
+            while ((res=it.next()) == NO_ERROR) {
+                sp<AaptFile> file = it.getFile();
+                res = compileResourceFile(bundle, assets, file, it.getParams(), 
+                                          (current!=assets), &table);
+                if (res != NO_ERROR) {
+                    hasErrors = true;
+                }
             }
         }
+        current = current->getOverlay();
     }
 
     if (colors != NULL) {
index 33f8f72..877763d 100644 (file)
@@ -546,6 +546,7 @@ status_t parseAndAddBag(Bundle* bundle,
                         const String16& itemIdent,
                         int32_t curFormat,
                         bool pseudolocalize,
+                        const bool overwrite,
                         ResourceTable* outTable)
 {
     status_t err;
@@ -572,7 +573,7 @@ status_t parseAndAddBag(Bundle* bundle,
 
     err = outTable->addBag(SourcePos(in->getPrintableSource(), block->getLineNumber()),
                            myPackage, curType, ident, parentIdent, itemIdent, str,
-                           &spans, &config, false, false, curFormat);
+                           &spans, &config, overwrite, false, curFormat);
     return err;
 }
 
@@ -588,6 +589,7 @@ status_t parseAndAddEntry(Bundle* bundle,
                         bool curIsStyled,
                         int32_t curFormat,
                         bool pseudolocalize,
+                        const bool overwrite,
                         ResourceTable* outTable)
 {
     status_t err;
@@ -610,7 +612,7 @@ status_t parseAndAddEntry(Bundle* bundle,
 
     err = outTable->addEntry(SourcePos(in->getPrintableSource(), block->getLineNumber()),
                              myPackage, curType, ident, str, &spans, &config,
-                             false, curFormat);
+                             false, curFormat, overwrite);
 
     return err;
 }
@@ -619,6 +621,7 @@ status_t compileResourceFile(Bundle* bundle,
                              const sp<AaptAssets>& assets,
                              const sp<AaptFile>& in,
                              const ResTable_config& defParams,
+                             const bool overwrite,
                              ResourceTable* outTable)
 {
     ResXMLTree block;
@@ -979,7 +982,7 @@ status_t compileResourceFile(Bundle* bundle,
                         if (locale.size() > 0) {
                             fprintf(stderr, "aapt: warning: string '%s' in %s marked untranslatable but exists"
                                     " in locale '%s'\n", String8(name).string(),
-                                    bundle->getResourceSourceDir(),
+                                    bundle->getResourceSourceDirs()[0],
                                     locale.string());
                             // hasErrors = localHasErrors = true;
                         } else {
@@ -1172,7 +1175,8 @@ status_t compileResourceFile(Bundle* bundle,
                         block.getPosition(&parserPosition);
 
                         err = parseAndAddBag(bundle, in, &block, curParams, myPackage, curType,
-                                ident, parentIdent, itemIdent, curFormat, false, outTable);
+                                ident, parentIdent, itemIdent, curFormat, 
+                                false, overwrite, outTable);
                         if (err == NO_ERROR) {
                             if (curIsPseudolocalizable && localeIsDefined(curParams)
                                     && bundle->getPseudolocalize()) {
@@ -1181,7 +1185,7 @@ status_t compileResourceFile(Bundle* bundle,
                                 block.setPosition(parserPosition);
                                 err = parseAndAddBag(bundle, in, &block, pseudoParams, myPackage,
                                         curType, ident, parentIdent, itemIdent, curFormat, true,
-                                        outTable);
+                                        overwrite, outTable);
 #endif
                             }
                         } 
@@ -1204,7 +1208,7 @@ status_t compileResourceFile(Bundle* bundle,
                 block.getPosition(&parserPosition);
 
                 err = parseAndAddEntry(bundle, in, &block, curParams, myPackage, curType, ident,
-                        *curTag, curIsStyled, curFormat, false, outTable);
+                        *curTag, curIsStyled, curFormat, false, overwrite, outTable);
 
                 if (err < NO_ERROR) { // Why err < NO_ERROR instead of err != NO_ERROR?
                     hasErrors = localHasErrors = true;
@@ -1215,7 +1219,7 @@ status_t compileResourceFile(Bundle* bundle,
                         // pseudolocalize here
                         block.setPosition(parserPosition);
                         err = parseAndAddEntry(bundle, in, &block, pseudoParams, myPackage, curType,
-                                ident, *curTag, curIsStyled, curFormat, true, outTable);
+                                ident, *curTag, curIsStyled, curFormat, true, false, outTable);
                         if (err != NO_ERROR) {
                             hasErrors = localHasErrors = true;
                         }
@@ -1360,7 +1364,8 @@ status_t ResourceTable::addEntry(const SourcePos& sourcePos,
                                  const Vector<StringPool::entry_style_span>* style,
                                  const ResTable_config* params,
                                  const bool doSetIndex,
-                                 const int32_t format)
+                                 const int32_t format,
+                                 const bool overwrite)
 {
     // Check for adding entries in other packages...  for now we do
     // nothing.  We need to do the right thing here to support skinning.
@@ -1384,7 +1389,7 @@ status_t ResourceTable::addEntry(const SourcePos& sourcePos,
     if (e == NULL) {
         return UNKNOWN_ERROR;
     }
-    status_t err = e->setItem(sourcePos, value, style, format);
+    status_t err = e->setItem(sourcePos, value, style, format, overwrite);
     if (err == NO_ERROR) {
         mNumLocal++;
     }
@@ -2125,7 +2130,7 @@ ResourceTable::validateLocalizations(void)
         // Look for strings with no default localization
         if (configSet.count(defaultLocale) == 0) {
             fprintf(stdout, "aapt: warning: string '%s' has no default translation in %s; found:",
-                    String8(nameIter->first).string(), mBundle->getResourceSourceDir());
+                    String8(nameIter->first).string(), mBundle->getResourceSourceDirs()[0]);
             for (set<String8>::iterator locales = configSet.begin();
                  locales != configSet.end();
                  locales++) {
@@ -2167,7 +2172,7 @@ ResourceTable::validateLocalizations(void)
                                         "for '%s' in %s\n",
                                         String8(nameIter->first).string(),
                                         config.string(),
-                                        mBundle->getResourceSourceDir());
+                                        mBundle->getResourceSourceDirs()[0]);
                                 //err = UNKNOWN_ERROR;
                             }
                         }
@@ -2728,7 +2733,8 @@ status_t ResourceTable::Entry::makeItABag(const SourcePos& sourcePos)
 status_t ResourceTable::Entry::setItem(const SourcePos& sourcePos,
                                        const String16& value,
                                        const Vector<StringPool::entry_style_span>* style,
-                                       int32_t format)
+                                       int32_t format,
+                                       const bool overwrite)
 {
     Item item(sourcePos, false, value, style);
 
@@ -2740,7 +2746,7 @@ status_t ResourceTable::Entry::setItem(const SourcePos& sourcePos,
                         item.sourcePos.file.string(), item.sourcePos.line);
         return UNKNOWN_ERROR;
     }
-    if (mType != TYPE_UNKNOWN) {
+    if ( (mType != TYPE_UNKNOWN) && (overwrite == false) ) {
         sourcePos.error("Resource entry %s is already defined.\n"
                         "%s:%d: Originally defined here.\n",
                         String8(mName).string(),
index fff4f49..e8fbd9b 100644 (file)
@@ -38,6 +38,7 @@ status_t compileResourceFile(Bundle* bundle,
                              const sp<AaptAssets>& assets,
                              const sp<AaptFile>& in,
                              const ResTable_config& defParams,
+                             const bool overwrite,
                              ResourceTable* outTable);
 
 struct AccessorCookie
@@ -79,7 +80,8 @@ public:
                       const Vector<StringPool::entry_style_span>* style = NULL,
                       const ResTable_config* params = NULL,
                       const bool doSetIndex = false,
-                      const int32_t format = ResTable_map::TYPE_ANY);
+                      const int32_t format = ResTable_map::TYPE_ANY,
+                      const bool overwrite = false);
 
     status_t startBag(const SourcePos& pos,
                     const String16& package,
@@ -256,7 +258,8 @@ public:
         status_t setItem(const SourcePos& pos,
                          const String16& value,
                          const Vector<StringPool::entry_style_span>* style = NULL,
-                         int32_t format = ResTable_map::TYPE_ANY);
+                         int32_t format = ResTable_map::TYPE_ANY,
+                         const bool overwrite = false);
 
         status_t addToBag(const SourcePos& pos,
                           const String16& key, const String16& value,